在Azure Web中启用CORS

时间:2015-02-22 21:45:05

标签: asp.net-mvc-4 azure cors

我尝试做的是为.net MVC 5 Azure网站从我的JavaScript 调用https服务(不是我自己的)时启用CORS(跨源资源共享)。< / p>

我总是得到同样的错误

  

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 for Mobile Services

因为我知道你们都要求代码(在本地btw工作),你可以通过简单的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

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

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

4 个答案:

答案 0 :(得分:2)

不可能。

它在本地运行,因为 服务器 必须具有允许标头,当您从javascript调用自己的网络服务器时,您可以添加这些标头

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

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

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

答案 1 :(得分:0)

WebApiConfig我将它设置为WebApiConfig类并且它有效。尝试通过web.config设置时,我在Azurewebsites上也遇到了问题。

在WebApiConfig中尝试:

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

   config.EnableCors(cors);

您可以编辑&#34; &#34;,&#34; &#34;,&#34; *&#34;如果你不想允许一切。

答案 2 :(得分:0)

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

app.UseCors(CorsOptions.AllowAll);

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

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

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

查看THIS文章

答案 3 :(得分:0)

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

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中心。

祝你好运!