养浩然之气,做博学之人
在 IIS 7.0 中,对于使用 Url 路由 访问页面的 ASP.NET 应用程序,IIS可能会不能出 Url 是对 ASP.NET 的请求。会显示404啊,403啊之类的错误代码(因为路径不存在,或者不允许查看目录)。网上一般的解决方案比较“粗暴”,直接设置 runAllManagedModulesForAllRequests="true" 即可。
在本地的 IIS 上网站运行正常,但是发布到服务器上就一堆怪怪的问题 :
MVC routing not work
Odata action 404
等等, 这么多怪怪的问题,都可以用 runAllManagedModulesForAllRequests=”true“ 来解决.
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" >
</modules>
</system.webServer>
但这不是个好方法. 因为性能会浪费, 还有一些静态文件的请求可能会被要求验证 (比如图片是可以含有 & 符号的, 但是你设置了这个, 就会被验证成 invalid 了),这样会让所有的请求都要经由 .NET 来处理,不管是什么路径文件,这样确实能解决当前的问题。一方面会让 .NET 比较累,所有静态文件请求也需要处理。另一方面,也可能会让程序的内容变得更复杂,比如如果有代码会根据请求的 Url 来处理一些事情。
网上有很多替代的方案。
经网上查找,找到了一个看起来比较好的解决方案。如上图所示,Url 路由是由 UrlRoutingModule 这个模块来处理的。在某些 IIS 版本中,并不会将所有请求交给 UrlRoutingModule 处理,所以,我们可以在 Web.config 中进行如下设置:
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>
</system.webServer>
首先移除掉原有的 UrlRoutingModule,然后再添加一下,不过这次添加将把 preCondition 设为空.
参考:
http://www.mamicode.com/info-detail-1006489.html
https://www.cnblogs.com/keatkeat/p/6154901.html?utm_source=itdadao&utm_medium=referral
https://blog.csdn.net/nic7968/article/details/46953995