Как перехватить исключения ASP.NET Core 2 SignalR на стороне сервера и обработать их на стороне клиента с помощью JavaScript? - PullRequest
0 голосов
/ 07 ноября 2018

Контекст. Существуют различия между ASP.NET SignalR и ASP.NET Core SignalR, которые можно прочитать здесь .

Как описано в этом сообщении stackoverflow в ASP.NET SignalR, вы можете перехватывать необработанные исключения на стороне сервера через 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 Hub (сервер):

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

1 Ответ

0 голосов
/ 19 марта 2019

Резюме

  • Я не мог и не знаю прямой реплики

  • но вы можете использовать этот хак для отправки исключения

  • для простоты я не использовал пользовательский класс 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();
});

Страницы / 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>

Скриншот

]


Дополнительно:

Ref.

...