我使用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之间缺少或挂钩的配置?
答案 0 :(得分:1)
您有几个选项,绝对不需要为此编写ISAPI。
如果您可以盲目地为每个人设置一个选项,只需使用httpProtocol部分添加标题:
<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>
然而,更好的选择是使用 URL重写来设置标题,并且仍然拥有检查原点的所有控件,并相应地重写它们。 我在这里写了一篇关于如何做到的快速文章: http://www.carlosag.net/articles/enable-cors-access-control-allow-origin.cshtml
在较高级别,这意味着添加URL重写入站规则以捕获Origin标头并将其设置在服务器变量中。然后,您可以稍后在出站规则中使用该服务器变量将其设置在标头中。我可以选择使用重写映射来调整您想要允许的原点。
{{1}}
请在此处查看完整说明:http://www.carlosag.net/articles/enable-cors-access-control-allow-origin.cshtml