ASP.NetMVCRoutingCapturesAll*.aspxRequests以前肯定问过这个问题,但是看了这里,这里,这里和这里我都不会推断相关部分以使其工作。我正在将一个旧的Web表单站点修改为MVC,并希望捕获特定的传入HTTP请求,以便我可以发出RedirectPermanent(以保护我们的Google排名并避免用户离开404)。我没有拦截所有传入请求并解析某些id值,而是拦截所有以(或包含).aspx文件扩展名结尾的请求,例如www.sample.com/default.aspxwww.sample.com/somedir/file。aspxwww.sample.com/somedir/file.aspx?foo=bar应忽略对MVC路由的请求(只是正常处理)。这是我到目前为止对ASPXFiles所做的,除了ASPXFiles路由永远不会被击中。公共类RouteConfig{publicstaticvoidRegisterRoutes(RouteCollectionroutes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//从不生成匹配项routes.MapRoute(name:"ASPXFiles",url:"*.aspx",defaults:new{controller="ASPXFiles",action="Index"});//用于处理所有其他请求(工作正常)routes.MapRoute(name:"Default",url:"{controller}/{action}/{id}",defaults:new{controller="Home",action="索引",id=UrlParameter.Optional});这种类型的路由可以在MVC中设置吗?我展示了在MVC中执行301重定向的正确方法,因为并非所有浏览器都能正确响应301重定向请求,并且您需要为用户提供继续选项,而不是ASP生成的默认“对象已移动”页面。网。RedirectAspxPermanentRoute我们构建了一个自定义RouteBase子类,用于检测URL何时以.aspx结尾并路由到我们的SystemController以设置301重定向。它需要你传递一个URL映射(要匹配的URL)来路由值(用于生成MVCURL)。公共类RedirectAspxPermanentRoute:RouteBase{privatereadonlyIDictionaryurlMap;publicRedirectAspxPermanentRoute(IDictionaryurlMap){如果(urlMap==null)thrownewArgumentNullException("urlMap");this.urlMap=urlMap;}publicoverrideRouteBaseGetRouteData(Httptext){varpath=httpContext.Request.Path;如果(path.EndsWith(".aspx")){如果(!urlMap.ContainsKey(path))返回null;varrouteValues=urlMap[路径];varrouteData=newRouteData(this,newMvcRouteHandler());routeData.Values["controller"]="System";routeData.Values["action"]="Status301";routeData.DataTokens["routeValues"]=routeValues;返回路由数据;}返回空值;}publicoverrideVirtualPathDataGetVirtualPath(RequestContextrequestContext,RouteValueDictionaryvalues){returnnull;请注意,第一次检查是针对.aspx扩展名,因此如果扩展名不匹配,则将完全跳过其余逻辑。这将为您的方案提供最佳性能。SystemController我们设置SystemController以照常返回视图。如果浏览器因为301不重定向,用户将看到该视图。使用系统;使用System.Net;使用System.Web;使用System.Web.Mvc;publicclassSystemController:Controller{////GET:/System/Status301/publicActionResultStatus301(){varrouteValues=this.Request.RequestContext.RouteData.DataTokens["routeValues"];varurl=this.GetAbsoluteUrl(routeValues);Response.CacheControl="无缓存";Response.StatusCode=(int)HttpStatusCode.MovedPermanently;Response.RedirectLocation=url;查看包。DestinationUrl=网址;返回视图();}privatestringGetAbsoluteUrl(objectrouteValues){varurlBuilder=newUriBuilder(Request.Url.AbsoluteUri){Path=Url.RouteUrl(routeValues)};varencodedAbsoluteUrl=urlBuilder.Uri.ToString();返回HttpUtility.UrlDecode(encodedAbsoluteUrl);Status301.cshtml遵循MVC约定并确保将其放在/Views/System/文件夹中。因为它是一个301响应视图,所以您可以使其与网站其余部分的主题相匹配。所以,如果用户最终来到这里,这仍然是一个糟糕的体验。此视图将尝试通过JavaScript和Meta-Refresh自动重定向用户。这两者都可以在浏览器中关闭,但用户可能会把它留在它应该去的地方。如果没有,你应该告诉用户:这个页面有一个新的位置。如果没有自动重定向,他们需要单击一个链接。他们应该更新他们的书签。@{ViewBag.Title="页面已移动";}@sectionMetaRefresh{}PageMoved页面已移动。如果您没有在5秒内自动重定向,请单击以下URL。请务必更新您的书签。https://stackoverflow.com/questions/36156496/asp-net-mvc-route-to-catch-all-aspx-requests/@ViewBag.DestinationUrl。用法首先你需要在_Layout.cshtml中添加一个部分,以便可以刷新元添加到页面的头部部分。@ViewBag.Title-我的ASP.NETMVC应用@RenderSection("MetaRefresh",required:false)@Styles.Render("~/Content/css")@Scripts.Render("~/bundles/modernizr")然后放将RedirectAspxRoute添加到路由配置。公共类RouteConfig{publicstaticvoidRegisterRoutes(RouteCollectionroutes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.Add(newRedirectAspxPermanentRoute(newDictionary(){//旧URL在左边,新路由值在右边。{@"/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});}}尝试这样的事情:routes.MapRoute(name:"ASPXFilesWithFolderPath",url:"{folder}/{page}.aspx",defaults:new{controller="ASPXFiles",action="Index",folder=UrlParameter.Optional,page=UrlParameter.Optional});routes.MapRoute(name:"ASPXFiles",url:"{page}.aspx",defaults:new{controller="ASPXFiles",action="Index",page=UrlParameter.Optional});最初我计算和HTTPHandler建构但是是默认情况下aspx扩展映射在IIS中,因此它不起作用这里是JonGalloway博客的链接以上是C#学习教程:ASP.NetMVC路由捕获所有*.aspx请求如果它对任何人有用并需要分享完整内容了解更多C#学习教程,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
