9

jquery.post がコード #200 (OK) を返すが、エラー ハンドラがヒットするという奇妙なケースがあります。

これは私の MVC WebAPI サーバー側コードです (コード #200 OK を返すだけです):

[HttpPost]
public HttpResponseMessage Post(T input)
{
    //_handler.Create(input);

    return Request.CreateResponse(HttpStatusCode.OK);
}

これは私のクライアントスクリプトです

ServerAccess.prototype.Save = function (m) {

            $.post("http://localhost:55482/M/", m)
            .success(
                function (o) {
                    alert("success");
                })
            .error(
                function (xhr, textStatus, errorThrown) {
                    if (typeof console == 'object' && typeof console.log == 'function') {
                        console.log(xhr);
                        console.log(textStatus);
                        console.log(errorThrown);
                    }
                }
            );
        };

Firebug のコンソール出力は次のとおりです。

POST http://localhost:55482/M/ 200 OK 894ms

ヘッダー


応答ヘッダー

コンテンツの長さ 6

コンテンツ タイプ アプリケーション/json; 文字セット=utf-8

日付 2012 年 10 月 28 日(日)18:55:17 GMT

サーバー Microsoft-HTTPAPI/2.0


リクエスト ヘッダー

受け入れる /

Accept-Encoding gzip、デフレート

Accept-Language nb-no,nb;q=0.9,no-no;q=0.8,no;q=0.6,nn-no;q=0.5,nn;q=0.4,en-us;q=0.3,en ;q=0.1

接続キープアライブ

コンテンツの長さ 21

Content-Type application/x-www-form-urlencoded; 文字セット=UTF-8

ホスト localhost:55482

原点ヌル

ユーザーエージェント Mozilla/5.0 (Windows NT 6.2; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0

オブジェクト { readyState=0, status=0, statusText="エラー"}

エラー

(空の文字列)

私はブラウジングして、他の人が同様の問題を抱えているのを見てきました。通常、応答の JSON の形式が正しくありません。私は 200 OK とコンテンツなしを返すだけなので、これは私の場合には当てはまらないようです。しかし、私はそのように空のオブジェクトを返そうとしました

var o = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(new T());

return Request.CreateResponse(HttpStatusCode.OK, o);

サーバー側は Visual Studio 2012 から実行され、クライアントはいくつかの .js ファイルを含む単なるスタンドアロンの .html です。また、VS のブレークポイントを使用すると、リクエストがサーバーによって受信されたことがわかります。Postman for Chrome を使用すると、すべてがうまく機能します。

したがって、問題はもちろんです。ここで何が間違っているのでしょうか。エラーハンドラがヒットするのはなぜですか?

ありがとう!

4

4 に答える 4

3

代わりにこれを試してください:

ServerAccess.prototype.Save = function (m) {
    $.ajax({
        "type": "POST",
        "url": "http://localhost:55482/M/",
        "data": m,
        "dataType": "json",
        "success": function (data, textStatus, xhr) {
            alert("success");
        },
        "error": function (xhr, textStatus, errorThrown) {
            if (typeof console === 'object' && typeof console.log === 'function') {
                console.log(xhr);
                console.log(textStatus);
                console.log(errorThrown);
            }
        }
    });
};

これにより、予期される戻り MIME タイプをapplication/json.

アップデート

スタンドアロンの HTML ページを で実行している場合http://localhost:55482、クロスドメインにはなりません。他の場所で実行している場合はfile:///C:/Users/.../Desktop/test.htm、クロスドメイン リクエストになります。httphttps:も違いを生みます。

jsonpリクエストはリクエストGETであり、POST. これは、ソースが URL に設定され、クエリ文字列 (およびタイムスタンプ パラメータ) にjsonp追加された要素をページに追加することによって、リクエストが実装されるためです。リターンを期待するすべてのリクエストは、自動的にリクエストに変換される必要があります。<script>dataPOSTjsonpGET

最後に、ルーチンはデータが返されることを期待しているため、jQuery はオブジェクトに返された JSON を解析しようとするため (データが返されない場合は実行できません)、実際のデータを返す必要があります。解析できません。

応答メッセージを次のように変更してみてください。

String o = "success";
System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();

return Request.CreateResponse(HttpStatusCode.OK, ser.Serialize(o));
于 2012-10-28T19:55:18.940 に答える
0

WebApi 2 サービスへの JSON 要求を使用しているときに、この問題が発生しました。私にとっては、成功関数とエラー関数のパラメーター リストを変更するだけで解決しました (WebApi 側では変更は必要ありませんでした)。

私はこれからコードを変更しました

success: function (data) { alert(data); },
error: function (error) { jsonValue = jQuery.parseJSON(error.responseText); }

これに

success: function (data, textStatus, xhr) 
{ 
  alert("data: " + data + "\ntextStatus: " + textStatus + "\nxhr: " + xhr);
},
error: function (xhr, textStatus, errorThrown)
{                       
  alert("xhr: " + xhr + "\ntextStatus: " + textStatus + "\nerrorThrown " + errorThrown);
}

引数リストの変更に注意してください

于 2015-07-20T09:35:20.777 に答える
0

私が理解しているように、クロスドメインが必要なので、ハンドラーまたはサービス呼び出し元が必要です

これを読んで、あなたに役立つかもしれません。

アプリ起動時に JsonpFormatter をフィルターとして追加すると、jsonp を楽しむことができます。

于 2013-06-03T07:22:20.500 に答える