3

最近、JSONPとASP.NETMVCを使用してクロスドメインJavaScriptを実行しています。

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

IE8では、(Fiddler2を介して)応答が正しいことを確認し、JSONPjavascriptとともにHTTP200応答を返します。

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

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

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

これを回避するために、カスタムヘッダーを設定しないようにJQueryライブラリを変更し、content-typeをapplication/jsonではなくtext/plainに変更すると、Firefoxは最終的にOPTIONSリクエストとプレーンPOSTのバイパスを開始します。

Fiddler2がコンテンツを含む成功したHTTP200応答を示しているにもかかわらず、問題は依然として空の応答(XmlHttpRequestオブジェクトによる)にあります。

何か助けはありますか?

4

4 に答える 4

4

結局のところ、POSTを使用してJQueryでクロスドメイン呼び出しを使用することはできません(呼び出しを行うためのスクリプトタグをレンダリングするため、これは理にかなっています)。GETに切り替えると問題がソートされ、すべてが正しく返されます。

JQueryソースを調べてそれを理解する必要がありましたが、返信に感謝します。

マット

于 2009-07-27T10:07:10.553 に答える
2

実際に送信されているリクエストを確認するには、firefox で firebug を使用してみてください。net タブをチェックして、HTTP リクエストとレスポンスを確認します。多分何かが間違って設定されていますか?また、firefox でjsonviewを使用して、applcaiton/json mimietype を設定する JSON データを表示します。悲しいことに、JSONP を処理しませんが、近いです。

于 2009-07-27T06:52:27.357 に答える
1

実際にはそうではありません。Firefox は、次のような OPTION ヘッダーを送信します。

Firefox でクライアントが設定する内容は次のとおりです。

オプション /MvcApplication/Json/Test1 HTTP/1.1
ホスト: acoheni580
ユーザーエージェント: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
受け入れる: 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
キープアライブ: 115
接続: キープアライブ
オリジン: http://localhost
Access-Control-Request-Method: POST

Mvc は、属性を使用するときに POST ヘッダーのみを探しているため、これを処理する方法がわかりません。[HttpPost]

これを手動で許可するには:

//[HttpPost]
[AcceptVerbs(new string[] {"POST","OPTIONS"})]
于 2010-08-03T18:25:20.767 に答える
1

クライアント側のすべての明白なエラー以外に、これの主な理由は、gecko エンジンAccess-Control-Allow-Originservlet. 見つからない場合は通信を中止し、 と を取得しstatus=0ますstatusText=null。また、moz-nullprincipalxml 解析エラー。これらはすべて非常に誤解を招くものです。この問題を解決するために必要なのは、次のとおりです。

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

コードと人生はservlet良いでしょう:-)

于 2011-01-19T15:04:01.010 に答える