5

サーバーで例外が発生した場合にクライアントに渡されるエラー オブジェクトをカスタマイズできるようにしたいと考えています。

クライアントで「then」関数を使用して、成功と失敗を処理しています。

hub.server.login(username, password).then(function(result) {
    // use 'result'
}, function(error) {
    // use 'error'
});

ログインが成功した場合、'result' はサーバー上の Login メソッドの戻り値です。ログインに失敗すると、「CustomException」の例外がスローされます。これは、'Code' プロパティの例外です。

if (!IsValidLogin(username, password))
    throw new CustomException { Code: "BADLOGIN", Message: "Invalid login details" };

詳細な例外を有効にしている場合、クライアントの「エラー」引数は「無効なログインの詳細」(例外のメッセージ プロパティ) です。

エラー結果を文字列から複雑なオブジェクトに選択的に変更する方法はありますか? つまり、'CustomException' がハブ メソッドでスローされた場合、クライアント側の失敗ハンドラーの {Code:[...], Message:[...]} オブジェクトを返しますか?

これは、クライアントで見たいものを示しているはずです:

hub.server.login(username, password).then(function(userInfo) {
    alert("Hello " + userInfo.Name);
}, function(err) {
    if (err.Code === "BADLOGIN.USERNAME")
        alert("Unrecognised user name");
    else if (err.Code === "BADLOGIN.PASSWORD");
        alert("Invalid password");
    else
        alert("Unknown error: " + err.Message);
});

('err' の 'Code' および 'Message' プロパティに注意してください)。

4

1 に答える 1

3

次のように、EnabledDetailedErrors を true に設定して MapHubs を呼び出す場合:

RouteTable.Routes.MapHubs(new HubConfiguration { EnableDetailedErrors = true });

失敗ハンドラーへのパラメーターとして例外のメッセージ文字列を受け取ります。

あなたはすでにこれを理解しているようですが、サーバー側のコードを含めて、後でこの質問を見つける可能性のある他の人のために詳細なエラーを有効にしています。

残念ながら、複雑なオブジェクトを失敗ハンドラに送信する簡単な方法はありません。

ただし、次のようなことができます。

if (!IsValidUsername(username))
{
    var customEx = new CustomException { Code: "BADLOGIN.USERNAME", Message: "Invalid login details" };
    throw new Exception(JsonConvert.SerializeObject(customEx));
}
if (!IsValidPassword(username, password))
{
    var customEx = new CustomException { Code: "BADLOGIN.PASSWORD", Message: "Invalid login details" };
    throw new Exception(JsonConvert.SerializeObject(customEx));
}

次に、クライアントで:

hub.server.login(username, password).then(function(userInfo) {
    alert("Hello " + userInfo.Name);
}, function(errJson) {
    var err = JSON.parse(errJson);
    if (err.Code === "BADLOGIN.USERNAME")
        alert("Unrecognised user name");
    else if (err.Code === "BADLOGIN.PASSWORD");
        alert("Invalid password");
    else
        alert("Unknown error: " + err.Message);
});

私はこれが醜いことを知っていますが、うまくいくはずです。

于 2013-05-17T02:22:30.463 に答える