IIS7:在经典模式下操作html文件的标头



我正在使用angular指令从IIS7经典模式服务器中提取一个html文件(由于SSO,需要经典模式)。为了满足CORS,我需要从请求中读取ORGIN,并在html文件的响应中添加一个标头。那一点其实并不重要。我的问题是挂接我的代码,以便为静态HTML文件实际执行此操作。

因此,在经典模式下,我的处理程序/模块是在system.web中定义的,而不是system.webSever。因此,我不能使用runAllManagedModulesForAllRequests="true"标志,这不是system.web架构的一部分。

在system.web中我有:

<httpHandlers>
    <!--<add path="*.html" verb="GET,HEAD" type="System.Web.StaticFileHandler" />-->
    <add path="*.html" verb="GET,HEAD" type="My.Namespace.CrossOriginHandler, My.DLL.Name" />
    <add path="*" verb="*" type="System.Web.HttpNotFoundHandler" />
</httpHandlers>
<httpModules>
    <add name="CrossOriginModule" type="My.Namespace.CrossOriginModule, My.Dll.name" />
  </httpModules>

这对于MVC页面或webapi调用执行良好。它不会为我的静态HTML文件执行。

我开始担心我需要编写一个自定义的ISAPI过滤器。有其他方法挂接我的代码吗?我缺少配置或在ISAPI筛选器和HttpModule之间挂钩?

您有几个选项,绝对不需要为此编写ISAPI。

如果你可以盲目地为每个人设置它,那么一个选项就是只使用httpProtocol部分来添加标题:

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

然而,一个更好的选择是使用URLRewrite来设置标题,并且仍然拥有检查来源的所有控制权,并适当地重写它们。我在这里写了一篇关于如何做到这一点的快速文章:http://www.carlosag.net/articles/enable-cors-access-control-allow-origin.cshtml

在高层,这意味着添加一个URL重写入站规则来捕获Origin标头并将其设置在服务器变量中。然后,您可以稍后在出站规则中使用该服务器变量,将其设置在标头中。可选地,我使用了"重写映射"来限制您想要允许的原点。

    <outboundRules> 
        <rule name="Set-Access-Control-Allow-Origin for known origins"> 
            <match serverVariable="RESPONSE_Access-Control-Allow-Origin" pattern=".+" negate="true" /> 
            <conditions> 
                <add input="{AllowedOrigins:{CAPTURED_ORIGIN}}" pattern=".+" /> 
            </conditions> 
            <action type="Rewrite" value="{C:0}" /> 
        </rule> 
    </outboundRules> 

请参阅此处的完整解释:http://www.carlosag.net/articles/enable-cors-access-control-allow-origin.cshtml

最新更新