2009-07-23 10 views
3

最近、JSONPとASP.NET MVCを使用してクロスドメインJavaScriptを行っています。JQuery、XmlHttpRequest、ステータスコード0

特定のコントローラアクションは、POST要求にのみ応答しますが、これは仕様によるものです。

IE8では、(Fiddler2を使用して)応答が正しいことを確認し、JSONP JavaScriptとともにHTTP 200応答を返すことができます。

Firefox、Safari、Chromeでは、適切なHTTP 200コードとJSONPのコンテンツが返されていますが、唯一の違いはJQueryで使用されているXmlHttpRequestオブジェクトがステータスコードを0に設定していることです。 responseTextを空にします。

元々、これはCOR HTTPプリフライト(Httpアクセスコントロール)によるものだと思っていました。これは、カスタムヘッダーまたはtext/plain以外のコンテンツタイプにより、追加のHTTPリクエスト(OPTIONS付き)動詞が送信されるサーバーに送信します。 Fiddler2では、OPTIONSリクエストがHTTP 404で応答されていることがわかります。

WebサーバーはIIS7です(ただし、プロダクションWebサーバーはIIS6ボックスになります)。 IIS7では、標準のOPTIONSVerbHandlerがハンドラにリストされているのを見ることができますが、実際には何もしていないと確信しています(実際OPTIONSVerbHandlerに関するドキュメントはどこにも見つかりません)。

これを解決するために、私はJQueryライブラリを変更してカスタムヘッダーを設定せず、application/jsonの代わりにcontent-typeをtext/plainに変更しました。そしてFirefoxはOPTIONSリクエストをバイパスし、 。

Fiddler2がコンテンツを返す正常なHTTP 200応答が返されていることを示しているにもかかわらず、問題はまだ(XmlHttpRequestオブジェクトに基づいて)空の応答にあります。

助けが必要ですか?

答えて

4

私は、POSTを使ってクロスドメインコールを使用することはできません(これは、スクリプトタグを呼び出してレンダリングするので意味があります)。 GETに切り替えると問題がソートされ、すべてが正しく返されます。

JQueryのソースを見て回って、それを理解しなければならなかったのですが、返信に感謝します。

マット

2

firefoxでfirebugを使用して実際の送信依頼を確認してください。ネットタブをチェックして、HTTPリクエストとレスポンスを確認してください。たぶん何かが誤って設定されていますか?また、applcaiton/json mimietypeを設定するJSONデータを表示するには、firefoxでjsonviewを使用します。残念ながらJSONPは処理されませんが、その処理は終了します。

1

実際はNOT CASEです。Firefoxは、次のようなオプションヘッダを送信します。ここでは

はFirefoxで、クライアントによって設定された取得されたものである:それは唯一のPOSTヘッダを探しているので

 
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はこれを処理する方法を知りません。属性を使用しているとき[HttpPost]

は手動でこれを許可するには、次のクライアント側のすべての明らかなエラーより

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

その他、舞これは、geckoエンジンがservletのヘッダーにあるAccess-Control-Allow-Originを検索する理由です。見つからない場合は、通信を中止し、status=0statusText=nullを取得します。また、xml解析エラーのmoz-nullprincipalも発生します。これらのものはすべて誤解を招くものです。あなたはこの問題を解決する必要があるのは次のとおりです。

response.setHeader("Access-Control-Allow-Origin","*"); 
servletコードで

と寿命が

:-)良いだろう
関連する問題