繁体   English   中英

在Azure Web中启用CORS

[英]Enable CORS in Azure web

我要做的是, 当从JavaScript调用https服务(不是我自己的)时,为.net MVC 5 Azure网站启用CORS(跨域资源共享)。

我总是得到同样的错误

XMLHttpRequest无法加载https:// someservice-I-have-no-control-over 所请求的资源上没有“ Access-Control-Allow-Origin”标头。 因此,不允许访问源“ https://my.azurewebsites.net ”。 响应的HTTP状态码为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 ”标题。 但这在Azure网站上似乎不起作用。

而且我找不到像“移动服务”中那样的任何设置,您可以在其中允许此设置,如此处所示。

移动服务的CORS

因为我知道你们都会要求代码(在本地工作),所以您可以对服务进行简单的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

只是澄清一下。

我在我的JavaScript(不是控制器)中调用了我无法控制的服务,即https。

编辑2

好的,我认为我可以拦截来自第三方服务的响应,并在浏览器拒绝它之前添加此标头。 我认为这是不可能的(对吗?)。 但是它在本地如何运作

如果我使用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

不可能。

它在本地工作,因为服务器必须具有allow标头,并且当您从JavaScript调用自己的网络服务器时,可以添加这些标头。

当您致电真实网站时,他们可能未添加CORS允许标头( Access-Control-Allow-Origin ),因此您的请求被拒绝。

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

例如,您可以使用我的CORS代理: https : //github.com/jgauffin/corsproxy 它打算用于IE9及以下版本,但对于所有请求都一样有效。

WebApiConfig我将其设置为WebApiConfig类,并且可以正常工作。 尝试通过web.config进行设置时,我在Azure网站上也遇到了问题。

在WebApiConfig中尝试以下操作:

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

   config.EnableCors(cors);

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

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

app.UseCors(CorsOptions.AllowAll);

仅当您有意计划将API公开给所有来源和标头时,才使用此选项。

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

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

看看这篇文章

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

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>

YMMV上是否包含Allow-Credentials选项。 我发现有必要满足我的需要,那就是允许访问远程Azure Web服务器/应用程序实例上的SignalR集线器。

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM