我试图弄清楚IIS7.5中Handler Mapping的含义以及IIS如何使用这些信息来决定谁执行什么。
例如,我看到几个带有* .aspx路径的条目。哪一个获胜?可能是某些条目仅在启用Classic Pipeline时适用,而其他一些条目仅在使用Integrated管道时适用?并且位数(32位,64位)会影响哪些条目?
如果有人可以解释(或有链接解释)当一般的HTTP请求到来时,IIS7.5会做什么(就“调度”/“路由”/“你!处理那个!”而言):
GET /blabla/dummy.bla HTTP/1.1
Host: blabla.org
稍后我会对IIS Rewrite Module或ARR如何工作感兴趣,但是现在我只对Handle Mapping配置感兴趣。
提前感谢!
答案 0 :(得分:10)
Fallow's answer不太准确,处理程序映射IIS7的处理方式与IIS6脚本映射不同。
在IIS7的管理控制台中,UI中没有显示重要属性preCondition
属性。
preCondition
属性用于指定何时应调用处理程序。回答你的问题:
例如,我看到几个带有* .aspx路径的条目。哪一个 赢了?可能是某些条目仅适用于Classic Pipeline 使用集成管道时是否启用了其他一些?而且 比特率(32比特,64比特)会影响哪些条目?
使用不同的前置条件来决定应该调用哪个.aspx
处理程序。例如,在安装了ASP.NET 2.0和ASP.NET 4.0的64位系统上,定义了六个可能的.aspx
处理程序映射。每个人都有不同的preCondition
规则:
<add name="PageHandlerFactory-ISAPI-4.0_32bit"
path="*.aspx"
modules="IsapiModule"
scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll"
preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="PageHandlerFactory-ISAPI-4.0_64bit"
path="*.aspx"
modules="IsapiModule"
scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll"
preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="PageHandlerFactory-Integrated-4.0"
path="*.aspx"
type="System.Web.UI.PageHandlerFactory"
preCondition="integratedMode,runtimeVersionv4.0" />
<add name="PageHandlerFactory-Integrated"
path="*.aspx"
type="System.Web.UI.PageHandlerFactory"
preCondition="integratedMode" />
<add name="PageHandlerFactory-ISAPI-2.0"
path="*.aspx"
modules="IsapiModule"
scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll"
preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="PageHandlerFactory-ISAPI-2.0-64"
path="*.aspx"
modules="IsapiModule"
scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll"
preCondition="classicMode,runtimeVersionv2.0,bitness64" />
如果您查看上面的每个preConditions
,它们都会略有不同,这就是IIS选择执行哪个处理程序映射的方式。
有关详细信息,请参阅:
http://www.iis.net/ConfigReference/system.webServer/handlers/add
还有一篇很棒的文章解释了处理程序映射及其preConditions
:
答案 1 :(得分:0)
以下帖子适用于IIS 6.0,但我没有发现IIS 7.X中的行为不同的证据。
IIS检查ScriptMaps中是否存在任何通配符应用程序映射,如果是,则从ScriptMaps属性调用ORDER中的第一个通配符应用程序映射。
只有当通配符应用程序映射返回并告诉IIS“我不处理此请求”时,IIS才会调用下一个通配符应用程序映射...直到IIS通过所有通配符应用程序映射或某些通配符应用程序映射声明“我是处理此请求“。”
答案 2 :(得分:0)
以上解决方案对我不起作用,我尝试了以下步骤并且它有效: 在IIS管理器中打开ISAPI筛选器模块,并从列表中删除aspnet_isapi.dll。 aspnet_isapi.dll是ISAPI扩展,而不是ISAPI过滤器。
有关详细信息,请参阅: http://forums.iis.net/t/1107699.aspx?HTTP+error+500+0+error+code+0x800700b7