2

我使用 SignalR 1.0。当服务器发生异常时,客户端会收到这样的消息

{"I":"0","E":"抛出了 'System.Exception' 类型的异常。","T":" at METHODNAME in d:\PATH\TO\HUB.cs:line 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 回答