我正在编写 WCF 服务,这些服务将由客户在野外使用,因此他们需要处理跨域请求。我在使我的开发服务器接受此类请求时遇到问题。这是场景:
当我在 IE 中运行客户端项目时,没有问题,因为 IE 不发送预检选项请求。但是,当我在 Chrome 中运行它时,预检选项请求返回 405 Method Not Allowed 并且 Chrome 放弃了该服务。以前版本的 Chrome 会忽略错误并继续执行实际的 POST 请求(或获取,等等),但更高版本似乎更挑剔。
我还使用已部署的 WCF 项目遇到了这个问题,并通过将 OPTIONSVerbHandler 移动到 IIS 中处理程序映射列表的顶部来解决它。
我应该指出,我正在使用我能想到的最慷慨的 web.config 设置来尝试允许 CORS。例如我在 WCF 项目的配置中有这个:
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="*" />
<add name="Access-Control-Allow-Methods" value="*" />
<add name="X-Powered-By" value="*" />
</customHeaders>
</httpProtocol>
无论如何,对从代码运行的 WCF 项目的任何客户端跨域请求都会失败并显示 405 错误。
设置 WCF 项目本身或 IIS Express 8 以启用 CORS 有什么帮助吗?
谢谢!
最佳答案
您可以为 wcf 启用 cors,一旦您知道如何操作,这可能非常简单。
详细阐述 DavidG 对更一般问题的回答 "cors on IIS" , 响应非常接近基本解决方案所需的内容:
OPTIONSVerbHandler
在 .Net 处理程序之前执行。OPTIONSVerbHandler
,然后将其向上移动(多次点击...)。 您也可以在 web.config 中通过重新定义
<system.webServer><handlers>
下的所有处理程序来执行此操作。 . ( <clear>
然后 <add ...>
他们回来了,这就是 IIS 控制台为您做的事情。顺便说一句,不需要在此处理程序上请求“读取”权限。)<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Headers" value="Content-Type"/>
<add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS"/>
</customHeaders>
</httpProtocol>
</system.webServer>
本示例将它们设置为对 web.config 所在站点/应用程序/目录上的所有请求的所有响应。如果您想将它们限制在某个 url 中,请将其放入
<location>
标签。您还可以在 IIS 控制台中添加这些自定义 header 。
这是一个基本的解决方案,因为它甚至会在不需要它的请求时发送 CORS header ,可能会打开您的应用程序以进行意外使用。但是对于 WCF,它看起来是最简单的。
使用 MVC 或 webapi,我们可以改为处理
OPTIONS
动词和 cors header 按代码(“手动”或在最新版本的 webapi 中提供内置支持)。
关于wcf - 配置 IIS Express 8 以启用 CORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19323323/