2013-03-13 67 views
1

我使用SignalR 1.0。 当异常在服务器上发生时,客户端获得这样定制SignalR的错误消息

{ “I” 的消息: “0”, “E”: “类型的异常 'System.Exception的' 被抛出。”,“T “:”在METHODNAME中的d:\ PATH \ TO \ HUB.cs中的METHODNAME中:第227行\ d在\ PATH \ TO \ HUB.cs中:第51行}}

但我想使其更加用户友好。我如何做到这一点? 我读过一个建议,把所有的服务器方法放入try-catch块。但我认为这不是一个真正的方法。

我追溯了异常,发现该异常在Microsoft.AspNet.SignalR.Hubs.HubDispatcher.Incoming方法中被捕获。但它是我无法自定义的内部静态方法。

在理想情况下,我想获得将异常转换为有效响应的能力。

+0

“我已阅读建议把所有服务器的方法进入try-catch块,但我认为,这不是一个真正的方式。“ - 听起来是对的。由您决定如何处理异常。 – 2013-03-13 14:37:18

+0

我有很多服务器方法。在任何地方使用try-catch块都会增加大量垃圾和潜在的错误地点。我想在一个地方处理所有错误。 – brainstream 2013-03-13 14:50:05

回答

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(); 
} 
+0

谢谢!有用! – brainstream 2013-03-14 07:23:26