BUG:IIS7管理的请求

时间:2009-08-12 16:57:22

标签: configuration iis-7 httpmodule

我不知道是否也应该将此问题发布到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我看不出差异没有区别。对我来说,看起来,走路和听起来像就像一个bug。 这是一个错误!为什么?因为当我请求第一个时,它是一个托管请求,不是吗。当然如此。但IIS7将其视为静态请求。所以? 这是一个错误。该请求应视为托管。

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

帮助思考

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

3 个答案:

答案 0 :(得分:6)

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

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

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

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

我建议将默认的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" />

和manged handler(PageHandlerFactory)之后的文件夹请求。

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

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

Here就是一个例子。

答案 1 :(得分:1)

删除preCondition="managedHandler"或添加<modules runAllManagedModulesForAllRequests="true">应该这样做。 Preconditions的“this page”部分提供了更多信息。

答案 2 :(得分:0)

您可以使用wild card script mapping,但使用托管处理程序处理所有请求效率很低。在适当的情况下,静态处理程序效率更高。