2018-09-08 孙小北

不要随便使用runAllManagedModulesForAllRequests="true"来解决问题

养浩然之气,做博学之人

在 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

编辑:孙小北

本文地址: http://www.xiaowangyun.com/wyblog/detail/?id=240

版权归属: www.xiaowangyun.com   转载时请以链接形式注明出处

物以类聚

最新评论

2017-10-06

一辈子不长,只有珍惜了,才不至于后悔。

2017-10-06

懂得感恩,才能走得更远。

标签云

归档

取消

感谢您的支持,您的每一次打赏都是一次鼓励!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦