您现在的位置是:首页 > .Net > ASP.NET MVC 路由重写Url时带点号出现404错误的解决方案

ASP.NET MVC 路由重写Url时带点号出现404错误的解决方案

王递杰 2020年12月23日 .Net

                               

比如这个url:http://www.xxxx.com/blog-128.html 
通过mvc中的路由机制匹配:http://www.xxxx.com/Blog/Detail?id=128 这个链接

具体路由代码如下:
routes.MapRoute(
       name: "Blog",
       url: "blog-{id}.html",
       defaults: new { controller = "Blog", action = "Detail", id = UrlParameter.Optional }
 );
该路由设计会出现如下问题:

当Url中最后一个/后面出现点"."的时候,Url将找不到可以匹配的路由,比如Url: ../Content/Blog.Search 将无法找到匹配的路由而报出404错误

参照http://stackoverflow.com/questions/11728846/dots-in-url-causes-404-with-asp-net-mvc-and-iis中网友的说法,在一般情况下,当在Url中最后的一块中出现点号"."时,MVC将把它当做一个文件来处理,去查找相应的文件,找不到对应的文件就报404错误了。

但是Url: ../Content/Blog.Search/validate 可以正确的匹配路由,是因为点号"."出现在Url的中间位置,不是最后一块,MVC不会将其作为文件处理。


现有两种方式可以解决这个问题:


1、在项目的web.config文件中做如下设置:
    在<system.webServer></system.webServer>节点中添加如下代码:

<modules runAllManagedModulesForAllRequests="true"></modules>

这种方式是不推荐的

在文章

(1)http://bartwullems.blogspot.jp/2012/06/optimize-performance-of-your-web.html 

(2)http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html

中都有提及。 

因为将runAllManagedModulesForAllRequests设置为true之后,将会使所有已注册的HTTP模块在每个请求上运行,而不仅仅是托管请求(例如.aspx).这意味着模块将运行在.jpg .gif .css .html .pdf等。这将导致资源的浪费,并且会引发其他的Error。

2、在web.config中配置如下:
    在<system.webServer></system.webServer>节点中添加如下代码:
<handlers>
  <add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="*" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>



参考:


1.http://www.cnblogs.com/Herzog3/p/6274676.html

2.http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

3.http://stackoverflow.com/questions/16581184/mvc4-404-errors


评论

评论插件