2015-08-19 33 views
0

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; 
    } 
} 
+0

'这看起来像一个CORS问题。“ - 为什么? ''但是通常情况下,当readyState等于4时,状态等于0.' - 你是否说过_alert(hit)_ **当readyState === 4和status === 0时会被调用? –

+0

@JaromandaX:status有时等于0,有时是200.后者是预期的,然后调用alert()。由于跨域问题,状态0是浏览器拒绝将结果传递给JavaScript的典型结果。 – masa

回答

0

的实际问题,是不是在我的原始描述可见。什么似乎是一个可行的解决方案是修改sendMessage()返回false

function sendMessage() { 
    ... 
    xhr.send(params); 

    return false; 
} 

这将是很想知道,为什么这是必要的。我通过研究页面重定向(分配window.location.href)失败的案例找到了解决方案,并且建议的解决方案是将return false添加到相关表单提交。这甚至不是表格提交...