我正在使用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