5

これまでのところ、SignalR をうまくいじってきましたが、文書化された参照や解決策を実際に見つけることができなかった状況を見つけました。

Double プロパティを持つクラス パラメーターを持つサーバー側関数があります。

public bool AddThing(Thing thing)
{
    // add and notify client
}

public class Thing {
    public Double Foo { get; set; }
}

プロパティFooの数値ではなくテキストを含むThingオブジェクトを送信すると、サーバーは当然のことながら500エラーを返します

{"hub":"ThingHub","method":"AddThing","args":[{"Foo":"bar"}],"state":{},"id":1}

これは SignalR コンテキストが開始される前に発生するため、クライアント側でエラーを処理するにはどうすればよいでしょうか? ハブには、チェックする特別なコールバックまたはプロパティがありますか? サーバー側のハブに対して特別に行う必要があることはありますか?

ありがとう!

4

1 に答える 1

11

SignalRには、クライアントからのサーバー側ハブメソッド呼び出しが成功したかどうかを確認するために使用できるクライアント側のロジックがあります。

まず、接続障害を処理するために、ハブ接続でエラーハンドラーを使用できますhttps://github.com/SignalR/SignalR/issues/404#issuecomment-6754425、http://www.asp.net/signalr /overview/guide-to-the-api/hubs-api-guide-javascript-client)このように:

$.connection.hub.error(function() {
    console.log('An error occurred...');
});

したがって、サーバー側でこれを実装してシナリオを再作成すると、次のようになります。

public bool AddThing(Thing thing)
{
    return true;
}

public class Thing
{
    public Double Foo { get; set; }
}

..次に、クライアント側からこれを呼び出します。

myHub.addThing({"Foo":"Bar"});

error処理関数が呼び出され、テキストがAn error occurred...コンソールに出力されます。

サーバーでメソッドを呼び出すとjQueryの遅延オブジェクト(https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs)が返されるため、いくつかのコールバックをチェーンできます。呼び出しから返されるオブジェクト。たとえば、ドキュメントには次のサンプルがあります。

myHub.someMethod()
     .done(function(result) {
     })
     .fail(function(error) {
     });

failただし、ハブの呼び出し中にエラーが発生した場合にのみ呼び出されることに注意してください(たとえば、サーバー側のメソッド内で例外がスローされます) -https://github.com/SignalR/SignalR/issues/404#issuecomment-6754425

最後の注意-これは興味深い質問だと思います。なぜなら、私が見ているように、例外をスローするのはJSONシリアライザーだからです-たとえば、あなたの場合:

Newtonsoft.Json.JsonSerializationException: Error converting value "Bar" to type 'System.Double'. Line 1, position 54. ---> System.FormatException:

...しかし確かに、このシナリオを処理するために上記で説明した方法よりも優れた方法があるとしたら、興味深いかもしれません。たとえば、どのハブ呼び出しが原因であるかを正確に知ることができます500 Internal Server Error

于 2012-07-22T11:17:45.760 に答える