2

SignalR 1.0 を使用します。サーバーで例外が発生すると、クライアントは次のようなメッセージを受け取ります

{"I":"0","E":"タイプ 'System.Exception' の例外がスローされました。","T":" d:\PATH\TO\HUB.cs の METHODNAME で:227 行目\r \n d:\PATH\TO\HUB.cs:line 51 の METHODNAME で"}

でももっと使いやすくしたい。どうすればできますか?すべてのサーバー メソッドを try-catch ブロックに入れるという提案を読みました。しかし、それは真の道ではないと思います。

例外を追跡したところ、Microsoft.AspNet.SignalR.Hubs.HubDispatcher.Incoming メソッドで例外がキャッチされていることがわかりました。しかし、それは私がカスタマイズできない内部静的メソッドです。

理想的なケースでは、例外を有効な応答に変換する機能が必要です。

4

1 に答える 1

6

HubPipelineModuleを使用できます。

例えば:

using System;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR.Hubs;

public class MyHubPipelineModule : HubPipelineModule
{
    protected override Func<IHubIncomingInvokerContext, Task<object>> BuildIncoming(Func<IHubIncomingInvokerContext, Task<object>> invoke)
    {
        return async context =>
        {
            try
            {
                // This is responsible for invoking every server-side Hub method in your SignalR app.
                return await invoke(context); 
            }
            catch (Exception e)
            {
                // If a Hub method throws, have it return the error message instead.
                return e.Message;
            }
        };
    }
}

次に、Global.asax.csで:

protected void Application_Start()
{
    GlobalHost.HubPipeline.AddModule(new MyHubPipelineModule());
    //...
    RouteTable.Routes.MapHubs();
}
于 2013-03-13T17:59:23.430 に答える