如果您确实想要一组最小的处理程序映射,我建议您开始清理,在 web.config 中删除所有处理程序并仅使用 StaticFile 一个:
<system.webServer>
<handlers>
<clear />
<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
</handlers>
</system.webServer>
现在,添加您需要的所有处理程序,仅用于您正在运行的位数和模式。
对于基本的 MVC 项目,添加可能就足够了
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
所有处理程序都做什么?
我也找不到任何文档,所以这是我的尝试:
处理程序映射定义在%SystemRoot%\System32\inetsrv\config\applicationHost.config - system.webServer/handlers
就我而言,有 87 个映射。
其中 50 个是modules="IsapiModule" scriptProcessor="...aspnet_isapi.dll"
对于 ASP.NET。这些涵盖了所有各种 asp.net 扩展,并且可能存在于 CLR 版本 2.0 和 4.0 以及 32 位和 64 位中。其中大多数适用于经典模式。
他们通常处理以下扩展:
*. = ExtensionlessUrlHandler-ISAPI
*.ashx = SimpleHandlerFactory-ISAPI
*.asmx = WebServiceHandlerFactory-ISAPI
*.aspq = aspq-ISAPI
*.aspx = PageHandlerFactory
*.axd = AXD-ISAPI
*.cshtm = cshtm-ISAPI
*.cshtml = cshtml-ISAPI
*.rem = HttpRemotingHandlerFactory-rem-ISAPI
*.rules = rules-ISAPI
*.soap = HttpRemotingHandlerFactory-soap
*.svc = svc-ISAPI
*.vbhtm = vbhtm-ISAPI
*.vbhtml = vbhtml-ISAPI
*.xamlx = xamlx-ISAPI
*.xoml = xoml-ISAPI
如果您的项目不使用某些扩展,您可以删除这些处理程序。
大多数处理程序映射都有一个preCondition
就像在 32 位应用程序池中或在经典模式下应用一样。如果您只运行 64Big 集成模式,则可以删除所有经典模式和 32 位处理程序映射。
如果我们查看 Razor 视图文件的 *.cshtml,您会发现三个映射,其中两个用于 32/64 位的 ClassicMode,指向 ASP.NET ISAPI 模块,但第三个仅适用于集成模式并映射到 HttpForbiddenHandler,因为 MVC 路由在集成模式下的工作方式不同,并且您永远不想允许直接访问查看文件。
可能有用于经典 asp 或 CGI 的 IsapiModule,例如 ASP.NET 映射,用于处理对具有某些扩展名的文件的请求。
第二大群体是type="System.
处理程序,让我们看看它们:
System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory
Handles *.rem
and *.soap
集成模式下的文件。如果您不使用远程处理,则可以将其删除。
System.ServiceModel.Activation.HttpHandler、System.ServiceModel.Activation
处理某些 WCF 请求*.rules,*.xoml,*.svc
扩展。
System.Web.Handlers.AssemblyResourceLoader
Handles WebResource.axd
请求,这些可能会在 WebForms 中使用,但通常不会在 MVC 项目中使用。
System.Web.Handlers.ScriptResourceHandler、System.Web.Extensions
用于搬运ScriptResource.axd
它在 WebForms 中提供 JavaScript 和 CSS 资源。
System.Web.Handlers.TraceHandler
处理程序trace.axd
显示 ASP.NET 跟踪信息。在生产站点上,您想要删除此处理程序。
System.Web.Handlers.TransferRequestHandler
用于在集成模式下处理无扩展请求。这会将请求转发给路由引擎来决定如何处理这些请求。更多信息 http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4.aspx
System.Web.Handlers.WebAdminHandler
Handles WebAdmin.axd
显示ASP.NET Website Administration Toolkit
,如果您不使用该内置功能,则可以将其删除。
System.Web.HttpForbiddenHandler
允许我们阻止访问任何具有特定扩展名的文件。然而,它返回 500 HTTP 状态,并且实际上在服务器上引发 System.Web.HttpException 异常。
在我看来,有更好的方法来博客某些扩展,例如IIS 请求过滤 http://www.iis.net/learn/manage/configuring-security/use-request-filtering.
System.Web.HttpMethodNotAllowedHandler
我认为这个在现代 IIS 中不再使用,它返回 405 HTTP 状态并且还会抛出 HttpException
System.Web.HttpNotFoundHandler
另外,在我当前的配置中不再如此。它抛出 404 HTTP 异常。
System.Web.Script.Services.ScriptHandlerFactory、System.Web.Extensions
Handles *.asmx
and *_AppService.axd
支持通过 Ajax 调用 Web 服务。
System.Web.Services.Protocols.WebServiceHandlerFactory、System.Web.Services
还有手柄*.asmx
DOT.NET 2 集成模式下的 Web 服务请求
系统.Web.StaticFileHandler
返回静态文件,不再使用?
System.Web.UI.PageHandlerFactory
处理 ASP.NET WebForm 页面.aspx
在集成模式下。
System.Web.UI.SimpleHandlerFactory
处理 ASP.NET 自定义处理程序.ashx
在集成模式下。
System.Xaml.Hosting.XamlHttpHandlerFactory、System.Xaml.Hosting
处理 Windows Workflow Foundation 服务.xamlx
在集成模式下。
更多处理程序:
模块=“静态文件模块、默认文档模块、目录列表模块”
这通常是处理尚未被任何先前句柄处理的任何请求的最后一个映射path="*" verb="*"
。它实际上使用三个不同的模块。 StaticFileMode 查找与请求的 URL 匹配的物理文件,如果未找到,则 DefaultDocumentModule 在与请求的 URL 相同的文件夹中查找默认文档,如果也未找到,则 DirectoryListingModule 可能会显示目录的内容,如果已启用。
模块=“协议支持模块”
这会处理 HTTP 动词的所有请求TRACE
and OPTIONS
,如果删除此映射,所有跟踪和选项请求将返回“405 Method not allowed”