程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ASP.Net MVC路由以捕获所有* .aspx请求大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决ASP.Net MVC路由以捕获所有* .aspx请求?

开发过程中遇到ASP.Net MVC路由以捕获所有* .aspx请求的问题如何解决?下面主要结合日常开发的经验,给出你关于ASP.Net MVC路由以捕获所有* .aspx请求的解决方法建议,希望对你解决ASP.Net MVC路由以捕获所有* .aspx请求有所启发或帮助;

我正在显示在MVC中进行301重定向的 正确 方法,因为并非所有浏览器都能正确响应301重定向请求,并且您需要为用户提供一个继续选项,而不是由ASP生成的默认“对象已移动”页面。净。

RedirectAspxPeRMANentRoute

我们构建了一个自定义RouteBase子类,该子类可检测URL何时以结尾,.aspx并路由至我们SystemController以设置301重定向。它要求您传入URL映射(要匹配的URL)以路由值(用于生成MVC URL)。

public class RedirectAspxPeRMANentRoute : RouteBase
{
    private Readonly IDictionary<String, object> urlMap;

    public RedirectAspxPeRMANentRoute(IDictionary<String, object> urlMap)
    {
        if (urlMap == null)
            throw new ArgumentNullException("urlMap");

        thiS.UrlMap = urlMap;
    }

    public overrIDe RouteData GetRouteData(httpContextBase httpContext)
    {
        var path = httpContext.request.Path;
        if (path.EndsWith(".aspx"))
        {
            if (!urlMap.ContainsKey(path))
                return null;

            var routeValues = urlMap[path];
            var routeData = new RouteData(this, new MvcRouteHandler());

            routeData.Values["controller"] = "System";
            routeData.Values["action"] = "Status301";
            routeData.DataTokens["routeValues"] = routeValues;

            return routeData;
        }

        return null;
    }

    public overrIDe VirtualPathData GetVirtualPath(requestContext requestContext, RouteValueDictionary values)
    {
        return null;
    }
}

请注意,第一个检查是针对.aspx扩展名的,因此如果扩展名不匹配,则其余逻辑将被完全跳过。这将为您的方案提供最佳性能。

系统控制器

我们将设置SystemController为像往常一样返回视图。如果浏览器由于301而无法重定向,则用户将看到该视图。

using System;    
using System.Net;
using System.Web;
using System.Web.Mvc;

public class SystemController : Controller
{
    //
    // GET: /System/Status301/

    public ActionResult Status301()
    {
        var routeValues = this.request.requestContext.RouteData.DataTokens["routeValues"];
        var url = this.GetabsoluteUrl(routeValues);

        Response.Cachecontrol = "no-cache";
        Response.StatusCode = (int)httpStatusCode.MovedPeRMANently;
        Response.RedirectLOCATIOn = url;

        VIEwBag.DesTinationUrl = url;
        return VIEw();
    }

    private String GetabsoluteUrl(object routeValues)
    {
        var urlBuilder = new UriBuilder(request.Url.absoluteUri)
        {
            Path = Url.RouteUrl(routeValues)
        };

        var encodedabsoluteUrl = urlBuilder.Uri.ToString();
        return httpUtility.UrlDecode(encodedabsoluteUrl);
    }
}

Status301.csHTML

请遵循MVC的约定,并确保将其放置在/VIEws/System/文件夹中。

因为它是301响应的视图,所以可以使其与网站其余部分的主题匹配。因此,如果用户最终来到这里,那仍然不是一个糟糕的体验。

该视图将尝试通过JavaScript Meta-refresh 自动重定向用户。这两个功能都可以在浏览器中关闭,但是用户很可能会将其放置在应有的位置。如果没有,您应该告诉用户:

  1. 该页面具有新位置。
  2. 如果没有自动重定向,他们需要单击链接。
  3. 他们应该更新自己的书签。
@{
    VIEwBag.title = "Page Moved";
}
@section Metarefresh {
    <Meta http-equiv="refresh" content="5;@VIEwBag.DesTinationUrl" />
}

<h2 class="error">Page Moved</h2>
<p>
    The page has moved. Click on the following URL if you are 
    not redirected automatically in 5 seconds. Be sure to update your bookmarks.
</p>
<a href="@VIEwBag.DesTinationUrl">@VIEwBag.DesTinationUrl</a>.

<script>
    //<!--
    setTimeout(function () {
        window.LOCATIOn = "@VIEwBag.DesTinationUrl";
    }, 5000);
    //-->
</script>

用法

首先,您需要在页面中添加一个部分,_Layout.csHTML便可以将元刷新添加到页面的头部。

<!DOCTYPE HTML>
<HTML lang="en">
    <head>
        <Meta charset="utf-8" />
        <title>@VIEwBag.title - My ASP.NET MVC Application</title>
        <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <!-- Add this so the vIEw can update this section -->
        @RenderSection("Metarefresh", required: falsE)
        <Meta name="vIEwport" content="wIDth=device-wIDth" />
        @Styles.Render("~/Content/CSS")
        @Scripts.Render("~/bundles/modernizr")
    </head>

    <!-- layout code omitted -->

</HTML>

然后将添加RedirectAspxRoute到您的路由配置。

public class RouteConfig
{
    public static voID RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resourcE}.axd/{*pathInfo}");

        routes.Add(new RedirectAspxPeRMANentRoute(
            new Dictionary<String, object>() 
            {
                // old URL on the left, new route values on the right.
                { @"/about-us.aspx", new { controller = "Home", action = "About" } },
                { @"/contact-us.aspx", new { controller = "Home", action = "Contact" }  }
            })
        );

        routes.MapRoute(
            name: "Default",
            url: "{Controller}/{action}/{ID}",
            defaults: new { controller = "Home", action = "Index", ID = UrlParameter.optional }
        );
    }
}

解决方法

一定 是以前问过的,但是在这里,这里,这里和这里阅读之后,我无法推断相关的部分以使其起作用。我正在将一个旧的Web表单站点改版为MVC,并希望捕获特定的传入http请求,以便发出一个RedirectPeRMANent(以保护Google排名并避免用户由于404而离开)。

除了拦截 所有 传入请求或解析某个id值外,我还需要拦截所有以( .aspx) 文件扩展名结尾(或包含)的请求。

www.sample.com/default.aspx
www.sample.com/somedir/file.aspx
www.sample.com/somedir/file.aspx?foo=bar

对MVC路由的请求应被忽略(正常处理)。

到目前为止,这里就是我所能得到的,除了那条ASPXFiles路线从未被击中。

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resourcE}.axd/{*pathInfo}");

        // never generates a match
        routes.MapRoute(
            name: "ASPXFiles",url: "*.aspx",defaults: new { controller = "ASPXFiles",action = "Index" }
        );

        // Used to process all other requests (works finE)
        routes.MapRoute(
            name: "Default",url: "{Controller}/{action}/{iD}",defaults: new { controller = "Home",action = "Index",id = UrlParameter.optional }
        );
    }
}

}

是否可以在MVC中设置这种类型的路由?

大佬总结

以上是大佬教程为你收集整理的ASP.Net MVC路由以捕获所有* .aspx请求全部内容,希望文章能够帮你解决ASP.Net MVC路由以捕获所有* .aspx请求所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。