我尝试做的是为.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网站。
我找不到像移动服务中那样的设置,你可以在这里看到这个设置。
因为我知道你们都要求代码(在本地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
答案 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中心。
祝你好运!