2009-07-23 49 views
3

我最近一直在使用JSONP和ASP.NET MVC做一些跨域JavaScript。JQuery,XmlHttpRequest和狀態代碼0

特定的控制器動作將只響應POST請求,這是設計。

在IE8,我可以看到(通過Fiddler2),該響應是正確的,並返回一個HTTP 200響應,與JSONP JavaScript的沿。

在Firefox,Safari和Chrome中,響應仍在返回,並帶有相應的HTTP 200代碼和JSONP內容,唯一的區別是JQuery使用的XmlHttpRequest對象將狀態代碼設置爲0, responseText爲空。

最初,我以爲這是由於COR HTTP預檢(Http Access Control)導致的,其中自定義標題或除text/plain之外的其他內容類型會導致發送額外的HTTP請求(帶有OPTIONS)謂詞到服務器。我可以在Fiddler2中看到OPTIONS請求正在使用HTTP 404響應。

Web服務器是IIS7(但生產Web服務器將是IIS6框)。在IIS7中,我可以看到處理程序中列出的標準OPTIONSVerbHandler,但我不確定這實際上是在做什麼(事實上,我什至不能在任何地方找到關於OPTIONSVerbHandler的任何文檔)。

爲了解決這個問題,我修改了JQuery庫,以便不設置自定義標題,並將content-type改爲text/plain而不是application/json,並且Firefox最終開始繞開OPTIONS請求,並且只是簡單的POST 。

即使Fiddler2顯示有成功的HTTP 200響應,並返回內容,問題依然存在於空響應中(根據XmlHttpRequest對象)。

任何幫助?

回答

4

原來,你不能使用跨域調用與JQuery使用POST(這是有道理的,因爲它呈現一個腳本標記進行調用)。切換到GET排序問題,現在一切正常返回。

不得不通過JQuery源代碼來找出一個,但感謝您的答覆。

馬特

2

嘗試在Firefox中使用firebug來查看實際發送的請求。查看net選項卡以查看HTTP請求和響應。也許有些配置錯誤?我也在firefox中使用jsonview來查看設置applcaiton/json mimietype的JSON數據。可悲的是,它不處理JSONP,但它接近。

1

其實不是這種情況。火狐發送選項報頭如下所示:

這裏是什麼是越來越被客戶端在Firefox設置:

 
OPTIONS /MvcApplication/Json/Test1 HTTP/1.1 
Host: acoheni580 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 
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 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
Origin: http://localhost 
Access-Control-Request-Method: POST 

的mvc不知道如何處理這一點,因爲它只是在尋找一個POST頭使用屬性時[HttpPost]

要手動允許這樣的:

//[HttpPost] 
[AcceptVerbs(new string[] {"POST","OPTIONS"})] 
1

不是在客戶端上所有的明顯錯誤其他,邁原因在於壁虎引擎在servlet的標頭中查找Access-Control-Allow-Origin。如果沒有找到它,它會中止通信,你會得到一個status=0statusText=null。另外,moz-nullprincipal在xml解析錯誤。所有這些東西都是非常具有誤導性的。所有您需要解決此問題是:

response.setHeader("Access-Control-Allow-Origin","*"); 

servlet代碼,生活就會好:-)