18

これは2つ以上の質問ですが、次のとおりです。

  1. ハブのトップ レベルの例外ハンドラーを持つ最良の方法は何ですか? 現在のバージョンの SignalR では不可能のようです

  2. ハブでエラーをスローしたときに、これが実際にクライアントで何もしないのはなぜですか?

    $.connection.hub.error(function() { return alert("test"); });

デバッグすると、エラー メソッドが配線されていることがわかりますが、ハブで例外をスローすると、上記で設定したメソッドを呼び出そうとする試みがまったくないことがわかります。発生する唯一のことは、SignalR がコンソールにエラーをバーフすることです。

記録のために、私は他のイベントを問題なく接続できます

//Called during exceptions just fine 
$.connection.hub.received(function() {
  return alert("Received Data");
});

//Seems to do nothing?
$.connection.hub.error(function() {
  return alert("Received Exception");
});
4

1 に答える 1

31

$.connection.hub.errorハブ接続の障害を処理するために使用されます。jQueryのdeferred.fail()を使用して、特定のハブ呼び出し($.connection.hub.methodThatThrows().fail(function() { ... })からスローされた例外を処理できますが、これは明らかに、呼び出しからスローされた例外を処理しませ

SignalR v1.0.0は、のサポートを追加しIHubPipelineModulesます。次に、オーバーライドするHubPipelineModule.BuildIncomingか、 viaHubPipelineModule.OnIncomingErrorに追加することができます。HubPipelineGlobalHost.HubPipeline.AddModule(myHubPipelineModule)

https://github.com/SignalR/SignalR/issues/548

https://github.com/SignalR/SignalR/commit/83fdbfd9baa1f1cc3399d7f210cb062597c8084c

実装例:

using Microsoft.AspNet.SignalR.Hubs;

public class MyHubPipelineModule : HubPipelineModule
{
    protected override void OnIncomingError(ExceptionContext exceptionContext,
                                            IHubIncomingInvokerContext invokerContext)
    {
        dynamic caller = invokerContext.Hub.Clients.Caller;
        caller.ExceptionHandler(exceptionContext.Error.Message);
    }
}

protected void Application_Start()
{
    GlobalHost.HubPipeline.AddModule(new MyHubPipelineModule());
}

// JS
// hub.client is also introduced in SignalR v1.0.0
$.connection.myHub.client.exceptionHandler = function (message) {
    alert(message);
};
于 2012-09-27T02:39:55.087 に答える