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

Sim*_*mon 8 c# asp.net signalr signalr-hub asp.net-core-2.1

上下文:ASP.NET SignalR和ASP.NET Core SignalR之间有区别,您可以在此处阅读。

如本ASP.NET SignalR中的stackoverflow文章所述,您可以通过HubPipelineModuleASP.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)
        {
            ...
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

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

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

Moh*_*hid 7

概括

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

  • 但是您可以使用此 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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();
});
Run Code Online (Sandbox Code Playgroud)

页面/Index.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>
Run Code Online (Sandbox Code Playgroud)

截屏

]


额外的 :

参考