我使用SignalR 1.0。 当服务器上发生异常时,客户端会收到类似这样的消息
{“I”:“0”,“E”:“抛出类型'System.Exception'的异常。”,“T”:“在ds:\ PATH \ TO \ HUB.cs中的METHODNAME:行227 \ r \ n在METHODNAME的d:\ PATH \ TO \ HUB.cs:第51行“}
但我想让它更加用户友好。我该怎么做? 我已经阅读了将所有服务器方法放入try-catch块的建议。但我认为这不是一个真实的方式。
我跟踪了Exception,发现在Microsoft.AspNet.SignalR.Hubs.HubDispatcher.Incoming方法中捕获了异常。但它是内部静态方法,我无法自定义。
在理想情况下,我希望能够将异常转换为有效的响应。
答案 0 :(得分: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;
}
};
}
}
然后在你的Global.asax.cs:
protected void Application_Start()
{
GlobalHost.HubPipeline.AddModule(new MyHubPipelineModule());
//...
RouteTable.Routes.MapHubs();
}