用于捕获所有 *.aspx 请求的 ASP.Net MVC 路由 [英] ASP.Net MVC route to catch all *.aspx requests
问题描述
这必须之前已经问过,但在阅读此处,这里、这里和 我需要拦截所有以 .aspx 结尾(或包含)的请求,而不是拦截所有传入请求或解析某些 应忽略对 MVC 路由的请求(正常处理). 到目前为止,这是我所拥有的,除了 } 这种路由可以在MVC中设置吗? 我展示了在 MVC 中进行 301 重定向的正确方式,因为并非所有浏览器都能正确响应 301 重定向请求,并且您需要为用户提供继续的选项,而不是默认的移动对象".由 ASP.NET 生成的页面. 我们构建了一个自定义的 请注意,第一次检查是针对 我们设置 遵循 MVC 的约定,并确保将其放在 因为它是 301 响应的视图,所以您可以使其与网站其余部分的主题相匹配.所以,如果用户最终来到这里,仍然是一个不错的体验. 视图将尝试通过 JavaScript 和通过 Meta-Refresh 自动重定向用户.这两者都可以在浏览器中关闭,但用户很可能会去他们应该去的地方.如果没有,您应该告诉用户:RedirectPermanent
(以保护我们的 Google 排名并避免用户因 404 问题而离开).>id
值 文件扩展名,例如www.sample.com/default.aspxwww.sample.com/somedir/file.aspxwww.sample.com/somedir/file.aspx?foo=bar
ASPXFiles
路线从未被击中.公共类RouteConfig{public static void RegisterRoutes(RouteCollection 路由){route.IgnoreRoute("{resource}.axd/{*pathInfo}");//从不产生匹配路线.MapRoute(name: "ASPXFiles",网址:*.aspx",默认值:新{控制器=ASPXFiles",动作=索引"});//用于处理所有其他请求(工作正常)路线.MapRoute(名称:默认",url: "{controller}/{action}/{id}",默认值:新 { 控制器 =主页",动作 =索引",id = UrlParameter.Optional });}}
重定向AspxPermanentRoute
RouteBase
子类,用于检测 URL 何时以 .aspx
结尾并路由到我们的 SystemController
以设置 301 重定向.它要求您传入 URL 映射(要匹配的 URL)以路由值(用于生成 MVC URL).公共类 RedirectAspxPermanentRoute : RouteBase{private readonly IDictionary
.aspx
扩展名的,因此如果扩展名不匹配,将完全跳过其余的逻辑.这将为您的场景提供最佳性能.系统控制器
SystemController
以像往常一样返回视图.如果浏览器因为 301 没有重定向,用户将看到视图.使用系统;使用 System.Net;使用 System.Web;使用 System.Web.Mvc;公共类 SystemController :控制器{////获取:/System/Status301/公共 ActionResult Status301(){var routeValues = this.Request.RequestContext.RouteData.DataTokens[routeValues"];var url = this.GetAbsoluteUrl(routeValues);Response.CacheControl = 无缓存";Response.StatusCode = (int)HttpStatusCode.MovedPermanently;Response.RedirectLocation = url;ViewBag.DestinationUrl = url;返回视图();}私有字符串 GetAbsoluteUrl(object routeValues){var urlBuilder = new UriBuilder(Request.Url.AbsoluteUri){路径 = Url.RouteUrl(routeValues)};var encodingAbsoluteUrl = urlBuilder.Uri.ToString();返回 HttpUtility.UrlDecode(encodedAbsoluteUrl);}}
Status301.cshtml
/Views/System/
文件夹中.
@{ViewBag.Title =页面已移动";}@section MetaRefresh {<meta http-equiv="刷新";content="5;@ViewBag.DestinationUrl";/>}<h2 class="error">Page Moved</h2><p>页面已移动.如果您是,请点击以下网址不会在 5 秒内自动重定向.请务必更新您的书签.</p><a href=@ViewBag.DestinationUrl">@ViewBag.DestinationUrl</a>.<脚本>//<!--设置超时(函数(){window.location = "@ViewBag.DestinationUrl";}, 5000);//-->
用法
首先,您需要向 _Layout.cshtml
添加一个部分,以便可以将元刷新添加到页面的头部部分.
<html lang="en"><头><meta charset="utf-8";/><title>@ViewBag.Title - 我的 ASP.NET MVC 应用程序</title><link href="~/favicon.ico";rel=快捷方式图标"类型=图像/x-图标";/><!-- 添加这个以便视图可以更新这个部分-->@RenderSection("MetaRefresh", required: false)<元名称=视口"内容=宽度=设备宽度"/>@Styles.Render("~/Content/css")@Scripts.Render("~/bundles/modernizr")头部><!-- 省略了布局代码-->