2013-07-30 85 views
5

我有一个.NET客户端的SignalR应用程序。当服务器发生错误时,我需要能够在客户端处理此问题。然而,这是有点困难,因为Signalr总是将所有异常包装成“InvalidOperationException”,并带有“UnknownUserException was thrown ...”之类的消息,而不是实际给我UnknownUserExceptionSignalR - 异常传播给客户端

我不知道该怎么办?

不正确的现在的工作(因为InvalidOperationException被抛出而不是actualy除外)的一个例子:

try 
{ 
    await this.hubProxy.Invoke<Guid>("Authenticate", nww object[] { userName, languageCode, credentials }); 
} 
catch(UnknownUserException ex) 
{ 
    Toast.Dislay("Invalid UserName."); 
} 
catch(ConnectionError ex) 
{ 
    Toast.Dislay("Connection Error.");  
} 

回答

3

在您的服务器,您可以启用详细的错误信息:

Routes.RouteTable.MapHubs(new HubConfiguration 
{ 
    EnableDetailedErrors = true 
}); 

请通过这样做,服务器上抛出的这些错误将传递给客户端,这可能会泄露服务器端实现中的一些意外漏洞(仅供参考)。

+0

是否有某种方式可以挂钩到异常处理中,并且只传播我以安全方式知道的异常,并包装所有其他方法? – ronag

+0

类型,你可以创建一个集线器管道模块:http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-server#hubpipeline然后绑定到像BuildIncoming这样的东西来执行集线器功能并捕获抛出的异常并决定是否传播它们 –

+0

我添加了'RouteTable.Routes.MapHubs(新的HubConfiguration {EnableDetailedErrors = true,EnableCrossDomain = true});'在'Application_Start'中并回收了我的应用程序池。仍然得到'InvalidOperationException'而不是实际的例外。我可能错过了什么? – ronag