配置IIS Express 8以启用CORS

djo*_*of2 10 wcf cross-domain cors iis-express visual-studio-2012

我正在编写WCF服务,这些服务将被客户端使用,因此他们需要处理跨源请求.我在启用开发服务器接受此类请求时遇到问题.这是场景:

  • 我在Visual Studio 2012的实例中运行WCF项目,使用IIS Express 8作为特定端口上的服务器.
  • 我在另一个Visual Studio 2012实例中运行客户端项目,也使用IIS Express 8作为服务器.该项目使用AJAX来使用其他项目中的服务.

当我在IE中运行客户端项目没有问题,因为IE不发送预检OPTIONS请求.当我在Chrome中运行它时,预检OPTIONS请求返回405方法不允许,Chrome放弃了该服务.以前版本的Chrome只会忽略错误并继续执行实际的POST请求(或Get,无论......),但后来的版本似乎更挑剔.

我还使用已部署的WCF项目遇到了这个问题,并通过将OPTIONSVerbHandler移动到IIS中Handler Mappings列表的顶部来解决它.

我应该指出,我正在使用我能想到的最慷慨的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>
Run Code Online (Sandbox Code Playgroud)

无论如何,对代码运行的WCF项目的任何客户端跨源请求都会因405错误而失败.

是否有任何帮助设置WCF项目本身或IIS Express 8以启用CORS?

谢谢!

Fré*_*ric 13

你可以为wcf启用cors,一旦你知道怎么做就可以很简单.

从DavidG回应更一般的问题"IIS上的cors",响应非常接近基本解决方案所需的:

  • 首先,配置OPTIONSVerbHandler在.Net处理程序之前执行.

    1. 在IIS控制台中,选择"处理程序映射".(在服务器级别或站点级别执行此操作.在站点级别,它将重新定义您站点的所有处理程序,并忽略在此之后在服务器级别上所做的任何更改.当然,在服务器级别,如果他们需要他们可能会破坏其他站点自己处理选项动词.)
    2. 在"操作"窗格中,选择"查看有序列表...".寻求OPTIONSVerbHandler并向上移动(大量点击......).

    您也可以通过重新定义下面的所有处理程序在web.config中执行此操作<system.webServer><handlers>.(<clear>然后<add ...>他们回来了,这就是IIS控制台的用途.顺便说一下,没有必要在这个处理程序上请求"读取"权限.)

  • 其次,为您的cors需求配置自定义http标头,例如:

    <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>
    
    Run Code Online (Sandbox Code Playgroud)

    此示例为在web/app /目录中的所有请求的所有响应设置它们,其中是web.config.如果要将它们限制为某个URL,请将其放在<location>标记中.
    您还可以在IIS控制台中添加这些自定义标头.

这是一个基本的解决方案,因为即使在不需要它的情况下它也会发送CORS头文件,可能会将您的应用程序打开到意外的用法.但是对于WCF来说,它看起来像是最简单的一个.

使用MVC或webapi,我们可以OPTIONS通过代码处理动词和cors标题("手动"或在最新版本的webapi中提供内置支持).


djo*_*of2 1

答案是使 WCF 接受 CORS 预检消息所需的配置与 IIS 服务器无关;相反,WCF 项目本身需要配置为使用 OPTIONS 动词处理 HTTP 请求。

长话短说:这样做真的很难。当涉及到端点时,WCF 是万能的,因此将其设置为使用一个端点(HTTP)执行一些非常具体的操作是不可取的,尽管这是可以做到的。真正的解决方案是使用 Web API,它是 HTTP 的大师,可以非常简单地设置来执行 CORS。


归档时间:

查看次数:

32809 次

最近记录:

7 年,1 月 前