为什么我可以在MVC应用程序中删除ExtensionlessUrlHandler而不会有任何不良影响?

27

我正在尝试简化我的MVC应用程序,并尽可能地删除。有人可以向我解释一下下面这段代码在应用程序根目录中的web.config文件中是做什么的吗?我已经将其注释掉,但仍然成功运行了应用程序...

<system.webServer>
     
  <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit"/>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit"/>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0"/>
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0"/>
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
    </handlers>
    ...

我看过这个问题:ASP.NET MVC 4和ExtensionlessUrlHandler,其中有一个回答链接到这篇博客:https://web.archive.org/web/20100611160242/http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4.aspx,但我觉得它没有解决我的问题。

我在开发和生产中都使用:IIS 8、ASP.NET MVC 4、.NET 4.5


我修改了你的标题,因为在你的问题正文中并没有实际询问所说的URL处理程序是什么或做什么,而你接受的答案也没有解释它(因此,显然,它是什么或做什么不是你感兴趣的)。 - O. R. Mapper
2个回答

26
你应该检查你的web.config文件。如果存在以下设置
<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
  </modules>    
</system.webServer>

那么,这可以解释为什么删除ExtensionlessUrlHandler处理程序后一切仍在正常工作。

默认情况下,runAllManagedModulesForAllRequests是false,这意味着IIS不会将每个请求委派给托管(.NET)模块。 知道如何处理无扩展名URL的核心模块称为UrlRouting模块,它是一个托管(非本机)模块。这意味着它没有机会处理请求,IIS在内部尝试根据其处理程序映射配置来处理它。 顺便说一句,默认配置将无扩展名URL视为静态资源,并因此失败并显示403.14状态代码(在大多数情况下)

当runAllManagedModulesForAllRequests为true时,发送到IIS的任何请求都会指向任何托管模块。 UrlRouting模块有机会处理请求并将其委派给ASP.NET MVC。

总之,在运行ASP.NET MVC应用程序时,您有两个选择:

  1. runAllManagedModulesForAllRequests为false。必须注册ExtensionlessUrlHandler
  2. runAllManagedModulesForAllRequests为true。您可以从IIS处理程序列表中删除ExtensionlessUrlHandler

1
我已将模块runAllManagedModulesForAllRequests="false"设置,并从web.config中删除了ExtensionlessUrlHandler,并重新启动了IIS,但它仍然对我起作用... - Oskar
你能分享一个简单的项目来展示你所看到的行为吗? - Ori Calvo
从附加的web.config文件中看来,似乎您没有删除处理程序。 您应该保留以下标记未被注释 <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit"/> <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit"/> <remove name="ExtensionlessUrlHandler-Integrated-4.0"/> - Ori Calvo
我取消了三个删除语句并运行,但仍然成功响应,并将runAllManagedModulesForAllRequests设置为false。澄清一下,我是通过VS默认设置的IISExpress运行的。 - Oskar

10

IIS Express使用的处理程序名称与IIS不同。

添加以下标记,它应该仅禁用IIS Express的无扩展名处理程序

<remove name="ExtensionlessUrl-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrl-Integrated-4.0" />

做到了!我之前一直在使用IIS Express,因为我使用的是Visual Studio的默认设置。 - Oskar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接