首页 > 解决方案 > 如何在服务器端捕获 ASP.NET Core 2 SignalR 异常并在客户端使用 JavaScript 处理它们?

问题描述

上下文:您可以在此处阅读 ASP.NET SignalR 和 ASP.NET Core SignalR 之间的差异。

如 ASP.NET SignalR 中的此stackoverflow 帖子HubPipelineModule中所述,您可以通过ASP.NET Core SignalR 中不存在的在服务器端捕获未处理的异常。

我们如何在 ASP.NET Core SignalR 中捕获未处理的异常并将它们传递给客户端?

JavaScript 代码(客户端):

var hub = null;

var initWebSocket = function () {

    hub = new signalR.HubConnectionBuilder().withUrl("/MyHub").build();

    hub.on("ReceiveMessage", function (pMessage) {

        [...]
    });

    hub.start().catch(function (err) {
        return console.error(err.toString());
    });
};

var executeWebsocketTestException = function () {

    // send to server
    hub.invoke("TestException").catch(function (exception) {

        if(exception.type)
        {
            ...
        }
    });
};

ASP.NET Core 2 集线器(服务器):

public class MyHub : Hub
{
    public async Task TestException()
    {
        throw new SignalRTest.Exceptions.TestException("This is a Websocket Test Exception.");
    }
}

标签: c#asp.netsignalrsignalr-hubasp.net-core-2.1

解决方案


概括

  • 我不能,我不知道直接复制品

  • 但您可以使用此 hack 发送异常

  • 为简单起见,我没有使用自定义 Hub 类,但您可以。

  • 或者您可以使用将其移至独立方法

解决方案

集线器\MyHub.cs

public class MyHub : Hub
{ 
    public void test_exception()
    {
        try
        {
            var x = 0;
            var d = 1 / x;
        }
        catch (Exception ex)
        {
            // log or extra
            Clients.Caller.SendAsync("handle_exception", ex);
        }
    }
}

wwwroot\js\app1.js

"use strict";

var connection = new signalR.HubConnectionBuilder().withUrl("/MyHub").build();

connection.start();

connection.on("handle_exception", function (err) {
    if (err.ClassName === "System.DivideByZeroException") {
        alert("You need to take a math class ");
    }
});

document.getElementById("test_btn")
    .addEventListener("click", function (event) {
        connection.invoke("test_exception");
        event.preventDefault();
});

页面/索引.cshtml

@page
<p/><p/>
<input type="button" id="testExceptionButton" value="TestException" />
<script src="~/lib/signalr/dist/browser/signalr.js"></script>
<script src="~/js/app1.js"></script>

截屏

]


额外的 :

  • 您可以添加全局服务器端日志记录

    • ASP.NET Core SignalR 中的日志记录和诊断 微软文档

      public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
          WebHost.CreateDefaultBuilder(args)
              .ConfigureLogging(logging =>
              {
                  logging.
                  AddFilter(
                   "Microsoft.AspNetCore.SignalR",
                   LogLevel.Debug);
                  logging.
                  AddFilter(
                   "Microsoft.AspNetCore.Http.Connections",
                   LogLevel.Debug);
              })
              .UseStartup<Startup>();
      

参考。


推荐阅读