自定义SignalR的错误消息

bra*_*eam 1 c# asp.net asp.net-mvc-4 signalr signalr-hub

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

{"I":"0","E":"抛出类型'System.Exception'的异常.","T":"在ds:\ PATH\TO\HUB.cs中的METHODNAME:第227行\ r \n \n在ds:\ PATH\TO\HUB.cs中的METHODNAME:第51行"}

但我想让它更加用户友好.我该怎么做?我已经阅读了将所有服务器方法放入try-catch块的建议.但我认为这不是一个真实的方式.

我跟踪了Exception,发现在Microsoft.AspNet.SignalR.Hubs.HubDispatcher.Incoming方法中捕获了异常.但它是内部静态方法,我无法自定义.

在理想情况下,我希望能够将异常转换为有效的响应.

hal*_*r73 5

您可以使用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;
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的Global.asax.cs中:

protected void Application_Start()
{
    GlobalHost.HubPipeline.AddModule(new MyHubPipelineModule());
    //...
    RouteTable.Routes.MapHubs();
}
Run Code Online (Sandbox Code Playgroud)