1

WCFサービスを呼び出すjQueryがいくつかあります。WebFaultExceptionサービスでエラーが発生すると、説明と500 Internal Server Errorステータスコードを含むがスローされます。

クライアント側、私は次のようなことをしています。

$.ajax({
    url: BaseUrl + 'ThisShouldThrowAnException',
    type: 'GET',
    dataType: 'jsonp',
    crossDomain: true,
    success: function (data) {
        // this should never be called
        alert("Got data: " + data);
    },
    error: function (jqXHR, status, message) { // never called
            // would like this to handle my status code
        alert(status + " " + message);
    }
});

ローカルIISサーバーでは、呼び出されている対応するコードは次のように指定されます。

[OperationContract]
[WebGet(RequestFormat=WebMessageFormat.Json)]
bool ThisShouldThrowAnException();


public bool ThisShouldThrowAnException()
{
    throw new WebFaultException<String>("Something really bad happened.", HttpStatusCode.InternalServerError);
}

問題は、この呼び出しを行うと、success関数が呼び出されることです。jQueryは私を飲み込んでいるようで500 Internal Server Error、代わりにを与えてくれます200 OKFiddlerを使用して検査すると、応答ステータスコードが。であることがわかります200 OK。ブラウザ経由で電話をかけたとき、またはリクエストを手作りした場合、適切なを受け取ります500 Internal Server Error

私の質問は次のとおりです。通話のWebExceptionFault内部をどのように処理できますか?$.ajax(...)現状では、$.ajaxは渡されるステータスコードを完全に無視しています。

とを使用してみajaxErrorましstatusCodeたが、どちらも機能しませんでした。

$('#error').ajaxError(function() {
    alert("An error occurred");
});

$.ajax({
    url: BaseUrl + 'ThisShouldThrowAnException',
    type: 'GET',
    dataType: 'jsonp',
    crossDomain: true,
    success: function (data) {
        alert("Got data: " + data);
    },
    statusCode: {
        500: function() {
            alert("Got 500 Internal Server Error");
        }
    },
    error: function (jqXHR, status, message) {
        alert(status + " " + message);
    }
});

新しい発見

さらに分析すると、jQueryが生成するクエリ文字列を調べたところ、次の文字列が次のように返されることがわかりました200 OK

http://localhost/RestService/RestService.svc/ThisShouldThrowAnException?callback=jQuery172003801283869839445_1341495740773&_=1341495740777

// on page:
jQuery172003801283869839445_1341495740773("Something really bad happened.",500);

一方、次のリクエストは:を返します500 Internal Server Error

http://localhost/RestService/RestService.svc/ThisShouldThrowAnException

// on page:
"Something really bad happened"
4

2 に答える 2

1

エラーハンドラーはjsonpリクエストに対して起動しません。jQuery ajaxのドキュメントには、error(jqXHR、textStatus、errorThrown)に関する次の免責事項があります。

注:このハンドラーは、クロスドメインスクリプトおよびJSONPリクエストでは呼び出されません。

jsonおよびcrossDomain=falseに切り替えるオプションがある場合、エラーハンドラーが起動するはずです。

このトピックについても同様のSOの質問があります

このSOの質問は、サーバー上のエラーをキャッチし、常に200を返し、ペイロードで応答コードを返すことを示唆しています。

于 2012-07-06T00:46:05.760 に答える
1

http://api.jquery.com/jQuery.ajax/

データ型のセクションで、彼らは言及しています

jsonpタイプは、callback =?のクエリ文字列パラメーターを追加します。URLに。サーバーは、JSONデータの前にコールバック名を付けて、有効なJSONP応答を形成する必要があります。$ .ajax()のjsonpオプションを使用して、コールバック以外のパラメーター名を指定できます。

データがリモートサーバーから取得される場合(スクリプトまたはjsonpデータ型を使用してのみ可能)、エラーコールバックとグローバルイベントが発生することはありません。

これが、エラーコールバックが発生せず、直接成功コールバックに送られる理由です。

編集:成功関数のデータはどのように見えますか?私が理解していることから、サーバーから返されたものはすべてデータとして渡されます。

これは、JSONPを使用してWCFWebサービスを利用する例です。

http://bendewey.wordpress.com/2009/11/24/using-jsonp-with-wcf-and-jquery/

重要な点は、WCFは、JSONPデータを要求していること、および「コールバック」と呼ばれるクエリ文字列パラメーターを指定したことを認識していることです。したがって、WCFは(実際のステータスに関係なく)200 OKと、リモート関数によって返されたデータを自動的に返します。

JSONPが実際にどのように機能するかについての詳細:http: //devlog.info/2010/03/10/cross-domain-ajax/

JSONPがどのように機能するかを読むと、サーバー自体が実際のエラーステータスを返さないため、jQueryが実際のエラーステータスを返すことはまったく不可能であることがわかります。

現在の問題に関しては、JSONリクエストに切り替えてください。それが不可能な場合は、ajax成功関数でいつでもデータオブジェクトをチェックできます。返されるときにエラーコード500が表示されます。

于 2012-07-06T03:15:47.903 に答える