2017-08-15 21 views
0

我做了一個小型應用程序,它可以通過rs232從稱重秤上獲取數據,並通過內置web服務器返回數據,如http://localhost:51111/Scale1?min=1.5&max=420。參數是設置一些配置數據的規模。無法獲得XmlHttpRequest與CORS一起工作

現在我需要從中央機器上的IIS服務器獲取網頁中的數據。有一個問題CORS這裏,但我的Firefox似乎支持CORS:

var supportsCORS = (new XMLHttpRequest()).withCredentials !== undefined; 

返回true。

使用在幾個論壇和JS書籍中找到的信息,我做了這個JS代碼:

function httpGetAsync() { 
     var theUrl = 'http://localhost:51111/Scale1?min=1.5&max=420'; 
     var req = new XMLHttpRequest(); 
     req.onreadystatechange = function() { 
      if (req.readyState == XMLHttpRequest.DONE) { 
       $('#value').text('state: ' + req.readyState + ', status: ' + req.status + ', text: ' + req.responseText); 
      } 
     } 
     req.open("GET", theUrl, true); // true for asynchronous 
     req.send(null); 
     return; 
    } 

網頁上有額外的HTTP標頭允許跨源請求腳本(CORS):

Access-Control-Allow-Origin: http://localhost:51111 
Access-Control-Allow-Methods: GET,POST 

使用Fiddler和Firefox調試器(F12)我可以看到JS確實向偵聽端口51111的本地應用程序發送請求,在該應用程序中,我可以看到正確接收到最小/最大數據,並且應用程序狀態200的回覆以及正文中的一些數據,這是原始回覆E:

HTTP/1.1 200 OK 
Content-Length: 4 
Server: Microsoft-HTTPAPI/2.0 
Date: Tue, 15 Aug 2017 14:36:50 GMT 

1.15 

尋找涼爽,但:

我的問題是,上面的JS不具有主體內容:req.status爲零0,不是200,和req.responseText爲空字符串而不是「1.15」。

我試過Firefox和Chrome。

+1

'http:// localhost:51111'服務器需要配置爲發送'Access-Control-Allow-Origin'響應頭和任何其他必需的'Access-Control-Allow- *'響應頭。從你的問題,你不清楚你在哪裏或如何設置這些,但在問題中引用的響應並沒有顯示它們被接收爲響應標題,所以看起來你不應該有'http:// localhost:51111'服務器配置爲發送它們 – sideshowbarker

+0

@sideshowbarker你是對的!額外的頭文件需要在第二臺服務器的響應中。我正在閱讀https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS以瞭解這一點。如果你想發表你的評論作爲解決方案,我會很樂意接受。 – Roland

+0

@sideshowbarker當您被列爲該mozilla頁面的貢獻者時,您可能是正確的人告訴了一些關於CORS的信息,以瞭解爲什麼額外的頭文件需要在第二臺服務器的響應中,而不是在第一臺服務器的響應中服務器。 – Roland

回答

0

需要將http://localhost:51111服務器配置爲發送Access-Control-Allow-Origin響應標頭和任何其他必需的Access-Control-Allow-*響應標頭。這是因爲它是前端JS代碼發送請求的服務器。

問題中引用的響應沒有顯示收到的響應標題,因此您似乎不能將http://localhost:51111服務器配置爲發送它們。

默認情況下,瀏覽器不允許您的前端JS代碼訪問來自跨源請求的響應 - 除非服務器選擇允許它。服務器選擇允許跨域請求的方式是通過在響應中發送Access-Control-Allow-Origin響應頭。

CORS協議的所有實際執行都是由瀏覽器完成的。因此,Access-Control-Allow-Origin響應頭是服務器用來與瀏覽器通信的服務器;服務器使用它來告訴瀏覽器哪些起源他們希望瀏覽器公佈來自這個服務器的響應。

所以這就是爲什麼你的情況下http://localhost:51111服務器是你需要配置發送正確的Access-Control-Allow-Origin響應頭。