c# - 如何在服务器端捕获 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.");
}
}
解决方案
概括
我不能,我不知道直接复制品
但您可以使用此 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>();
参考。
推荐阅读
- docker - 不同端口的环境变量如何在 docker-compose mariadb 中工作?
- google-translate - 谷歌翻译小部件从下拉列表中删除 pageLangguage
- css - 如何使用自定义 CSS 修改 Strapi 管理面板?
- python - 如何在 matplotlob 直方图中标记 bin(Python)
- laravel - 重定向标头在 Laravel 中可见而不是隐藏
- spring-boot - 将 java spring boot 应用程序连接到 SAP 事件网格 (BTP)
- properties - 如果之前定义了属性,则不会触发 WebComponents 属性设置器
- java - Java 内存使用细目 - 本机库 (DLL) 使用
- flutter - 在此小部件上方找不到正确的提供程序 - Flutter
- android - 如何确定 SafetyNet Attestation API 已达到 qouta 限制?