wcf - 配置 IIS Express 8 以启用 CORS

标签 wcf visual-studio-2012 cross-domain cors iis-express

我正在编写 WCF 服务,这些服务将由客户在野外使用,因此他们需要处理跨域请求。我在使我的开发服务器接受此类请求时遇到问题。这是场景:

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

  • 当我在 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 处理程序之前执行。
  • 在 IIS 控制台中,选择“处理程序映射”。 (在服务器级别或站点级别执行此操作。在站点级别,它将重新定义您站点的所有处理程序,并忽略此后在服务器级别所做的任何更改。当然在服务器级别,如果其他站点需要它们,这可能会破坏其他站点自己处理选项动词。)
  • 在操作 Pane 中,选择“查看有序列表...”。寻求 OPTIONSVerbHandler ,然后将其向上移动(多次点击...)。

  • 您也可以在 web.config 中通过重新定义 <system.webServer><handlers> 下的所有处理程序来执行此操作。 . ( <clear> 然后 <add ...> 他们回来了,这就是 IIS 控制台为您做的事情。顺便说一句,不需要在此处理程序上请求“读取”权限。)
  • 其次,根据你的 cors 需求配置自定义的 http headers,例如:
    <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/

    相关文章:

    c# - EF 编译查询偶尔导致 SqlException

    c# - 从 VS2010 WCF 服务应用程序获取 WSDL

    visual-studio-2012 - 在Server Explorer (LocalDB) VS2012中查看数据

    c++ - 使用VS2012构建wxWidgets后,我可以删除lib文件夹中的哪些文件?

    javascript - 'Access-Control-Allow-Origin' header 如何工作?

    javascript - 如何从跨域 iframe 捕获(初始化)错误?

    c# - 为什么 AspNetCompatibilityRequirementsMode.Allowed 会修复此错误?

    c# - 如何找出托管了哪些 wcf 服务

    visual-studio-2012 - 通过反射调用的方法抛出的未捕获异常

    jquery - $.ajax 或 $.get 函数 get 仅在本地文件上接收