具有多个路径组件的URL将直接发送到静态文件处理程序

时间:2015-08-20 13:56:29

标签: asp.net-mvc iis

在IIS上运行时,我在使用Asp.net MVC应用程序时出现以下问题(使用版本7.0和8.5进行测试):如果URL中的路径不超过3个组件(例如http://myhost.com/a/b/c),则由应用程序代码正确处理。但是当在路径(http://myhost.com/a/b/c/d)中添加一个额外的组件时,它将被直接发送到静态文件处理程序。由于该路径不用于物理文件,我得到404(错误页面来自静态文件处理程序,而不是web.config中配置的custon 404页面)

我在运行IIS Express的开发站上没有遇到此问题。

我在web.config中使用runAllManagedModulesForAllRequests="true",禁用它并没有解决问题。

禁用静态文件处理程序没有帮助,我仍然得到404,但这次错误消息显示"处理程序尚未确定"。

我真的看起来这是在IIS处理中很早发生的事情,因为如果我回收应用程序池并尝试访问此URL,响应会立即响应,而不会在应用程序需要启动时获得通常的延迟。

我错过了什么?为什么IIS没有将此类请求转发给我的应用程序?

2 个答案:

答案 0 :(得分:0)

这是你的路线!!

MVC中的默认路由仅接管控制器,动作& ID。您尝试使用尚未定义的第四个。只需在路由集合中添加另一个url参数即可。

 routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}/{another}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, another= UrlParameter.Optional }
    );

希望这有帮助。

答案 1 :(得分:0)

我想我找到了一些东西:长网址不是由MVC路由处理的,而是由OWIN中间件处理的。不知何故,似乎对于IIS,如果没有为URL配置路由,则完全忽略请求管道,包括任何OWIN中间件(以及404的自定义页面)。

通过在heymega建议的路线中添加另一个参数,我能够解决问题,OWIN中间件被执行了。我添加了以下路线:

routes.MapRoute("CatchLongUrls", "{a}/{b}/{c}/{*d}", 
    new {controller = "Invalid", action = "Nothing"});