自定义 SignalR 的错误消息

Posted

技术标签:

【中文标题】自定义 SignalR 的错误消息【英文标题】:Customizing SignalR's error messages 【发布时间】:2013-03-01 13:04:15 【问题描述】:

我使用 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 方法中被捕获。但它是我无法自定义的内部静态方法。

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

【问题讨论】:

“我已经阅读了将所有服务器方法放入 try-catch 块的建议。但我认为这不是真正的方法。” - 对我来说听起来不错。由您决定如何处理异常。 我有很多服务器方法。在任何地方使用 try-catch 块会增加很多垃圾和潜在的错误位置。我想在一个地方处理所有错误。 【参考方案1】:

您可以使用 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();

【讨论】:

以上是关于自定义 SignalR 的错误消息的主要内容,如果未能解决你的问题,请参考以下文章

.net core 3.0 Signalr - 07 业务实现-服务端 自定义管理组用户连接

.net core 3.0 Signalr - 07 业务实现-服务端 自定义管理组用户连接

SignalR 自托管 Windows 服务,监听消息

Kong 自定义错误消息/响应

SignalR:协商请求期间出错:未定义

类型的 Ajv 自定义错误消息