ExtensionlessUrlHandler在MVC应用程序中做了什么?

时间:2014-10-09 06:45:01

标签: asp.net-mvc web-config isapi

我正在尝试简化我的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 and ExtensionlessUrlHandler有一个链接到此博客的答案: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

2 个答案:

答案 0 :(得分:18)

您应该检查您的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 :(得分:9)

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" />