ASP .NET MVC开发runAllManagedModulesForAllRequests慎用

举报
孙小北 发表于 2022/01/15 19:52:02 2022/01/15
【摘要】 不要随便使用runAllManagedModulesForAllRequests="true"来解决问题在 IIS 7.0 中,对于使用 Url 路由 访问页面的 ASP.NET 应用程序,IIS可能会不能出 Url 是对 ASP.NET 的请求。会显示404啊,403啊之类的错误代码(因为路径不存在,或者不允许查看目录)。网上一般的解决方案比较“粗暴”,直接设置 runAllManaged...

不要随便使用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 设为空.

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。