在 Azure Web 中启用 CORS

Enable CORS in Azure web

我想做的是在从我的 JavaScript.

我总是得到同样的错误

XMLHttpRequest cannot load https://someservice-I-have-no-control-over. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://my.azurewebsites.net' is therefore not allowed access. The response had HTTP status code 400.

我在本地开发时设法启用了此功能,将我的项目设置为 https 并将以下内容添加到 web.config

<system.webServer>
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS"/>
    <add name="Access-Control-Allow-Headers" value="Content-Type, Accept, SOAPAction"/>
    <add name="Access-Control-Max-Age" value="1728000"/>
  </customHeaders>
</httpProtocol>
</system.webServer>

添加'Access-Control-Allow-Origin'header。但这在 Azure 网站上似乎不起作用。

而且我找不到像移动服务中那样的任何设置,您可以像在此处看到的那样允许这样做。

因为我知道你们都会要求代码(顺便说一句,在本地工作)所以你可以简单地 Jquery 调用服务

$.ajax({
    url: 'https://someservice-I-have-no-control-over',
    dataType: 'json',
    contentType: 'application/json',
    type: 'GET',
    success: function (response) {
        $.each(response, function (key, value) {
          console.log("success"); //Doesn´t happen! :-(
        });
    },
    error: function (xhr, text, error) {
        if ($.isFunction(onError)) {
            onError(xhr.responseJSON);
        }
    }
});

有什么想法吗?

编辑 1

稍微澄清一下。

我正在调用一个我无法控制的服务,它是一个 https 服务,在我的 javascript(不是控制器)中。

编辑 2

好吧我想我可以拦截来自第三方服务的响应并在浏览器拒绝之前添加这个header。在我看来这是不可能的(对吧?)。 但是它为什么在本地有效

如果我使用 LiveHTTPHeaders 捕获对该服务的调用,我会在没有 "Access-Control-Allow-Origin" 限制的情况下得到以下响应(那么它在本地工作的方式是什么?)。

请求(给https://someservice-I-have-no-control-over.com

GET /someservice-I-have-no-control-over/SomeAction/44 HTTP/1.1
Host: someservice-I-have-no-control-over.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
If-None-Match: "53867cff-96b0-411f-88b7-d84765f9f8e8"
Cache-Control: max-age=0

回复

HTTP/1.1 304 Not Modified
Cache-Control: max-age=900
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Date: Tue, 24 Feb 2015 11:06:53 GMT

WebApiConfig 我将其设置为 WebApiConfig class 并且有效。尝试通过 web.config 设置时,我在 Azure 网站上也遇到了问题。

在 WebApiConfig 中试试这个:

   var cors = new EnableCorsAttribute("*", "*", "*");

   config.EnableCors(cors);

如果您不想允许所有内容,您可以编辑“”、“”、“*”。

如果您使用的是 Owin,则可以在 Startup.cs 文件中执行此操作:

app.UseCors(CorsOptions.AllowAll);

当且仅当您有意计划将您的 API 暴露给所有来源和 headers 时才使用此功能。

否则,您可以通过装饰您的控制器或特定方法来尝试这种方式:

 [EnableCors(origins: "http://someCallingService", headers: "*", methods: "*")]

查看 THIS 文章

不可能。

它在本地工作,因为它是 服务器 必须具有允许 headers,并且当您调用自己的来自 javascript 的网络服务器,您可以添加那些 headers.

当您调用真实网站时,他们可能不会添加 CORS 允许 header (Access-Control-Allow-Origin),因此您的请求被拒绝。

您可以做的是使用 JSONP 或通过您自己的网站代理所有请求。

例如,您可以使用我的 CORS 代理:https://github.com/jgauffin/corsproxy。它的预期用途是用于 IE9 及以下版本,但对所有请求都适用。

我通过安装以下软件包解决了这个问题:

Microsoft.AspNet.WebApi.Cors

...然后如上所述使用 Config.EnableCors() 并更改我的 web.config 转换:

在WebApiConfig.cs中:

    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.EnableCors();

        // Continue configuration as you wish... 
    }

然后,在 web.config 转换中,在我的案例中命名为 web.PPE.config,因为它用于预生产:

<system.webServer>
    <httpProtocol>
        <!-- custom headers necessary for CORS -->
        <customHeaders xdt:Transform="Replace">
        <clear /> <!-- the clear here is important! -->
        <add name="Access-Control-Allow-Origin" value="http://url-that-is-allowed-to-communicate-with-this-server.com" />
        <!-- must match server DNS address or SignalR can't communicate with Hub remotely -->
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
        <add name="Access-Control-Allow-Credentials" value="true" />
      </customHeaders>
    </httpProtocol>
</system.webServer>

关于是否包含 Allow-Credentials 选项的 YMMV。我发现有必要满足我的需要,即启用对远程 Azure webserver/app 实例上的 SignalR 集线器的访问。

祝你好运!