【问题标题】:How to catch ASP.NET Core 2 SignalR exceptions on server-side and handle them on client side with JavaScript?如何在服务器端捕获 ASP.NET Core 2 SignalR 异常并在客户端使用 JavaScript 处理它们?
【发布时间】:2019-04-10 22:36:55
【问题描述】:

上下文:ASP.NET SignalR 和 ASP.NET Core SignalR 之间存在差异,您可以阅读 here

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

我们如何在 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.net signalr signalr-hub asp.net-core-2.1


    【解决方案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>
    

    截图


    额外:

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

      • Logging and diagnostics in ASP.NET Core SignalR | Microsoft Docs

        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>();
        

    参考。

    【讨论】:

      【解决方案2】:

      为了补充@Mohamed 的回答并根据SignalR - Handle errors

      如果要将错误传播到客户端,可以使用 HubException 类。如果您从集线器方法中抛出 HubException,SignalR 会将整个消息发送到客户端,尽管它只包含异常消息,而不包括内部异常、堆栈跟踪或其他属性。

      public Task ThrowException()
      {
          throw new HubException("This error will be sent to the client!");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-24
        • 1970-01-01
        • 1970-01-01
        • 2019-08-25
        • 2023-04-02
        • 1970-01-01
        • 2012-05-19
        • 2013-06-24
        相关资源
        最近更新 更多