在 Asp.Net Core 3.1 中处理 SignalR 集线器中的所有异常

Handle all exceptions in SignalR hubs in Asp.Net Core 3.1

在 Web 中 API 所有异常都可以由中间件处理。 Asp.Net Core 5.0 Hub Filters 将完成这项工作。

但是如何在 SignalR 集线器中处理 Asp.Net Core 3.1 中的异常?有没有唯一的方法可以在下面的每个方法中编写 try/catch?

[Authorize]
public class OrdersHub : BaseHub
{
        public async Task GetOrder(Guid requestId, int orderId)
        {
            try
            {
                var data = await ordersService.GetOrderAsync(orderId);
                await Clients.Caller.SendAsync("GetOrderResult", requestId, result);
            }
            catch (Exception ex)
            {
                await Clients.Caller.Reject(requestId, ex);
            }
        }
}

您可能知道 ASP.NET SignalR 支持 HubPipeline modules,它提供了一种全局处理集线器异常的方法。

但是从 this doc 我们可以发现 ASP.NET Core SignalR 不再支持 HubPipeline 模块,目前它似乎没有提供替代方法来处理全局错误。

如您所述,我们可以将代码包装在 try-catch 块中并记录异常对象或手动将其发送给调用者。

请注意,异常通常包含敏感信息,出于安全原因,不建议在生产中向客户端发送详细信息。

此外,ASP.NET Core SignalR 提供 built-in diagnostics logging feature 可以帮助捕获和记录有用的传输和集线器相关信息,这可以帮助解决问题。

注意:您可以查看 this github issue 讨论关于“Signalr .net 核心中央异常处理”的相同要求。

从 .net 5.0 开始,您可以使用集线器过滤器:https://docs.microsoft.com/en-us/aspnet/core/signalr/hub-filters?view=aspnetcore-5.0