11

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

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

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

我在部署的 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?

谢谢!

4

5 回答 5

14

您可以为 wcf 启用 cors,一旦您知道如何操作,它可能非常简单。

从 DavidG 对更一般性问题“cors on IIS”的回应中详细阐述,该回应非常接近基本解决方案所需的内容:

  • 首先,配置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>
    

    此示例将它们设置为对 web.config 所在的站点/应用程序/目录上的所有请求的所有响应。如果您想将它们限制为某个 url,请将其放在<location>标签中。
    您还可以在 IIS 控制台中添加这些自定义标头。

这是一个基本的解决方案,因为即使在不需要它的请求时它也会发送 CORS 标头,可能会打开您的应用程序以供意外使用。但是对于 WCF,它看起来是最简单的一种。

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

于 2013-11-21T16:31:06.137 回答
3
  • 作为一个值仅对 Access-Control-Allow-Origin 有效。对于其他人,您需要明确。例如:

访问控制允许方法:GET、PUT、POST、DELETE

或者:

访问控制允许方法:PUT、DELETE

因为规范说 GET 和 POST 是隐含的。

于 2013-10-12T15:12:38.163 回答
1

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

长话短说:这样做真的很难。WCF 在端点方面是万事通,因此不建议将其设置为使用一个(HTTP)做一些非常具体的事情,尽管它可以做到。真正的解决方案是使用Web API,它是HTTP的高手,可以很简单地设置做CORS。

于 2013-10-16T19:41:16.173 回答
0

我只是想提一下,在撰写本文时,我不相信 Web 浏览器支持 * 通配符值,Access-Control-Allow-Methods即使Access-Control-Allow-Headers它在规范中也是如此。

规格:

https://www.w3.org/TR/cors/
https://www.rfc-editor.org/rfc/rfc2616#section-4.2

请参阅兼容性说明(更易于阅读):

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers /访问控制允许标题

代替上述更好的解决方案,这意味着您必须明确提供您想要允许的每个标头或方法。

于 2018-01-23T21:33:41.267 回答
0

我不确定这真的很难如djo.dadof2所说。上面的答案之一是关于使用 IIS 控制台,但问题是关于 IIS Express。公平地说,它谈到了移动OPTIONSVerbHandler更高,这实际上可能在 IIS Express 中工作,但是您必须清除所有处理程序并将它们添加回来,如果没有 IIS 等控制台,这很困难,因为您不知道哪些处理程序添加回来。从这个答案中,Call WCF service from JQuery : cross-origin OPTIONS request 给出错误 400,您可以看到您真正需要做的就是处理 Global.asax.cs 中的 OPTIONS 请求Application_BeginRequest。我添加了

        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "content-type");

            HttpContext.Current.Response.End();
        }

并与

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="null" />
  </customHeaders>
</httpProtocol>

在对我有用的 webconfigsystem.webServer部分中。请注意,我content-typeAccess-Control-Allow-Headers标头中使用了匹配 Firefox 发送的内容,并nullAccess-Control-Allow-Origin我从本地驱动器打开 html 页面时使用。

于 2018-11-19T13:42:20.467 回答