[英]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网站上似乎不起作用。
而且我找不到像“移动服务”中那样的任何设置,您可以在其中允许此设置,如此处所示。
因为我知道你们都会要求代码(在本地工作),所以您可以对服务进行简单的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.