【问题标题】:Configure IIS Express 8 to enable CORS配置 IIS Express 8 以启用 CORS
【发布时间】:2013-10-19 20:09:15
【问题描述】:

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

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

当我在 IE 中运行客户端项目时没有问题,因为 IE 不发送预检 OPTIONS 请求。当我在 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 有帮助吗?

谢谢!

【问题讨论】:

  • 您是否将 WCF 服务用于 REST?您实际上可能想要删除 OptionsVerbHandler 并自己处理。或者...您可能想公开JSONP。我建议你使用ASP.Net Web-API
  • 多年后,现在可以在 IIS Express 上使用 CORS 模块 blog.lextudio.com/…

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


【解决方案1】:

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

        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>

在对我有用的 webconfig system.webServer 部分中。请注意,当我从本地驱动器打开一个 html 页面时,我在 Access-Control-Allow-Headers 标头中使用了 content-type 来匹配 Firefox 发送的内容,并在 Access-Control-Allow-Origin 中使用 null

【讨论】:

    【解决方案2】:

    我只是想提一下,在撰写本文时,我认为 Web 浏览器不支持 Access-Control-Allow-MethodsAccess-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/Access-Control-Allow-Headers

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

    【讨论】:

      【解决方案3】:

      您可以为 wcf 启用 cors,只要您知道如何操作,它就会非常简单。

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

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

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

        您也可以在 web.config 中通过重新定义 &lt;system.webServer&gt;&lt;handlers&gt; 下的所有处理程序来执行此操作。 (&lt;clear&gt; 然后&lt;add ...&gt; 他们回来了,这就是 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,请将其放在 &lt;location&gt; 标记中。
        您还可以在 IIS 控制台中添加这些自定义标头。

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

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

      【讨论】:

      • 我有同样的问题,我按照上面的步骤。但它没有产生预期的结果。请求的标头和响应中允许的标头逐字匹配,但仍然失败。请帮忙
      • @SivaSenthil,如果在您的情况下对 OPTIONS 请求的响应状态为 200,则可能不再是 IIS/WCF 问题。
      • @Fredric,不幸的是 OPTIONS 请求失败并显示 400 - 错误请求状态。
      • @SivaSenthil,然后看起来 OPTIONSVerbHandler 没有在 .Net 处理程序之前执行。如果您已在服务器级别设置其执行顺序,请检查它是否未在站点级别撤消。
      【解决方案4】:

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

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

      【讨论】:

      • 有时找到答案的关键是限制可行答案的范围。这有帮助。谢谢
      【解决方案5】:
      • 作为值仅对 Access-Control-Allow-Origin 有效。对于其他人,您需要明确。例如:

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

      或者:

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

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

      【讨论】:

      • 谢谢。可悲的是,将 web.config 条目更改为: 无效。
      猜你喜欢
      • 2012-06-19
      • 2012-07-11
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 2019-06-16
      相关资源
      最近更新 更多