从http://localhost:8080 JavaScript的请求行为不一致:CORS问题与POST,在Chrome
function sendMessage() {
var params =
'AppKey=' + config.appKey +
'&MetadataJson=' + encodeURIComponent(config.metadataJson),
url = 'http://localhost/Controller/Action',
xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
alert('hit!');
}
}
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.withCredentials = true;
xhr.send(params);
}
翻译成HTTP请求:
POST http://localhost//Controller/Action HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 667
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: */*
Referer: http://localhost:8080/index.html
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Cookie: ASP.NET_SessionId=aoqjuh2xob20qt5jpe2jo01i
AppKey=...
HTTP响应:
HTTP/1.1 200 OK
Cache-Control: private
Server: Microsoft-IIS/8.5
Access-Control-Allow-Origin: http://localhost:8080
Access-Control-Allow-Credentials: true
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 19 Aug 2015 06:17:02 GMT
Content-Length: 0
但是:浏览器中的行为(Chrome)并不一致。有时alert('hit!')
被按预期调用,但通常在readyState
等于4时,status
等于0。
这看起来像是一个CORS问题。对我来说,似乎与CORS相关的请求中唯一的标题字段是Origin
,服务器响应的Access-Control-Allow-Origin
具有相同的值,因此从CORS的角度来看,所有内容都应该可以正常使用?
有关如何更改JavaScript或服务器实现(ASP.NET MVC)的任何建议?
UPDATE:
的相关HTML:
<li class="my-link">
<a href="">Get Help</a>
</li>
...和JavaScript到HTML连接到sendMessage()
:
window.onload = function() {
var els = document.getElementsByClassName('my-link'), i;
for (i = 0; i < els.length; i += 1) {
els[i].onclick = sendMessage;
}
}
'这看起来像一个CORS问题。“ - 为什么? ''但是通常情况下,当readyState等于4时,状态等于0.' - 你是否说过_alert(hit)_ **当readyState === 4和status === 0时会被调用? –
@JaromandaX:status有时等于0,有时是200.后者是预期的,然后调用alert()。由于跨域问题,状态0是浏览器拒绝将结果传递给JavaScript的典型结果。 – masa