5

我不知道我是否也应该将这个问题发布到 ServerFault,因为它是关于 IIS 配置的?

在 IIS7 中,我们可以通过以下方式告诉模块为托管内容运行(从而加速静态内容服务):

<modules>
    ...
    <add name="WhateverName"
         type="WhateverType"
         preCondition="managedHandler"
    ...
</modules>

但。只要请求的 URL 中还有一个文件名(带扩展名),它就可以正常工作。如果省略它,IIS7 会认为您需要静态内容,并且托管模块将不会运行。

http://localhost/ <-- this one will skip managed handlers
http://localhost/default.aspx <-- this one will run them

如果我手动设置 IIS7 默认文件,所以第一个是default.aspx我可以看到没有区别没有区别。对我来说,这看起来、走路和听起来都像是一只虫子。这是一个错误!为什么?因为当我请求第一个请求时,它是一个托管请求,不是吗。当然是的。但 IIS7 将其视为静态请求。所以?这是一个错误。此请求应被视为受管理的。

如何说服 IIS7 为没有文件名的 URL 请求运行托管处理程序?

帮助思考

让我帮你思考一下:如果我重新排序system.webServer/handlers,我肯定可以解决这个问题。StaticFile在指向 的最后一个处理程序之前,StaticFileModule我应该在目录请求上运行集成的 asp.net 处理程序。或者编写我自己的处理程序,它将默认文档附加到任何目录请求。我很确定其中之一应该可以解决它。但是我将如何配置/开发它?DefaultDocumentModuleDirectoryBrowsingModule

4

3 回答 3

6

问题在于请求处理顺序。IIS7 按照 IIS 的 Handlers 配置元素指定的顺序处理请求。默认情况下,IIS 配置的 Handlers 元素包含

<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />

在处理程序的末尾。因此,与任何先前指定的处理程序不匹配的所有请求都将由该处理程序处理(也包括文件夹请求)。

您可以通过在处理程序配置中使用clear元素来删除所有默认处理程序,并指定您自己的请求处理顺序。

我建议将默认 IIS 处理程序配置 (C:\Windows\System32\inetsrv\config\applicationHost.config) 复制到您的 Web 配置,最后不使用 StaticFile 处理程序。

然后,您应该为每种静态内容类型(jpg、gif、js、css)添加特定的静态内容处理程序。

<add name="StaticFile-swf" path="*.swf" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
<add name="StaticFile-png" path="*.png" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
<add name="StaticFile-gif" path="*.gif" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
<add name="StaticFile-jpg" path="*.jpg" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
<add name="StaticFile-css" path="*.css" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
<add name="StaticFile-js" path="*.js" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />

之后管理文件夹请求的处理程序(PageHandlerFactory)。

<add name="PageHandlerFactory-Folders" path="*" verb="*" type="System.Web.UI.PageHandlerFactory" modules="ManagedPipelineHandler" resourceType="Unspecified" requireAccess="Read" allowPathInfo="false" preCondition="integratedMode" />

最后,您还应该添加 StaticFile 处理程序。

是一个例子。

于 2009-08-25T09:32:45.783 回答
1

删除preCondition="managedHandler"或添加<modules runAllManagedModulesForAllRequests="true">应该这样做。本页的“前提条件”部分有更多信息。

于 2009-08-12T17:54:43.110 回答
0

您可以使用通配符脚本映射,但使用托管处理程序处理所有请求的效率很低。静态处理程序在适当的时候效率更高。

于 2009-08-12T17:56:53.607 回答