在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没有将此类请求转发给我的应用程序?
答案 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"});