【问题标题】:SignalR exception logging?SignalR 异常记录?
【发布时间】:2014-05-01 05:29:37
【问题描述】:

这更多是两个问题,但是:

  1. 为我的 Hub 设置顶级异常处理程序的最佳方式是什么?当前版本的 SignalR 似乎不可能

  2. 当我在 Hub 中抛出错误时,为什么这实际上对客户端没有任何作用?

    $.connection.hub.error(function() { 返回警报(“测试”); });

当我调试时,我可以看到我的错误方法正在连接,但是当我在 Hub 上抛出异常时,我可以看到从来没有尝试调用我在上面设置的方法。唯一发生的事情是 SignalR 将错误发送到控制台。

为了记录,我可以很好地连接其他事件

//Called during exceptions just fine 
$.connection.hub.received(function() {
  return alert("Received Data");
});

//Seems to do nothing?
$.connection.hub.error(function() {
  return alert("Received Exception");
});

【问题讨论】:

    标签: javascript signalr signalr-hub


    【解决方案1】:

    $.connection.hub.error 用于处理集线器连接失败。您可以使用 jQuery 的 deferred.fail() 来处理特定集线器调用 ($.connection.hub.methodThatThrows().fail(function() { ... }) 引发的异常,但这显然不能处理 any 调用引发的异常。

    SignalR v1.0.0 将增加对IHubPipelineModules 的支持。然后您将能够覆盖HubPipelineModule.BuildIncomingHubPipelineModule.OnIncomingError,然后可以通过GlobalHost.HubPipeline.AddModule(myHubPipelineModule) 将其添加到HubPipeline

    https://github.com/SignalR/SignalR/issues/548

    https://github.com/SignalR/SignalR/commit/83fdbfd9baa1f1cc3399d7f210cb062597c8084c

    示例实现:

    using Microsoft.AspNet.SignalR.Hubs;
    
    public class MyHubPipelineModule : HubPipelineModule
    {
        protected override void OnIncomingError(ExceptionContext exceptionContext,
                                                IHubIncomingInvokerContext invokerContext)
        {
            dynamic caller = invokerContext.Hub.Clients.Caller;
            caller.ExceptionHandler(exceptionContext.Error.Message);
        }
    }
    
    protected void Application_Start()
    {
        GlobalHost.HubPipeline.AddModule(new MyHubPipelineModule());
    }
    
    // JS
    // hub.client is also introduced in SignalR v1.0.0
    $.connection.myHub.client.exceptionHandler = function (message) {
        alert(message);
    };
    

    【讨论】:

    • 有趣且内容丰富的答案。我原以为不必在调用站点(以及每个集线器回调)挂钩我的日志记录方法会得到支持。有点难看,但只要这是唯一的方法,我会忍受的。非常感谢您的信息
    • 不应该是context.Hub.Clients.Caller.ExceptionHandler(ex.Message);
    • 非常有帮助,谢谢。另外要补充的是,对于 SignalR 的 v2,OnIncomingError 的方法签名已更改为 OnIncomingError(ExceptionContext, IHubIncomingInvokerContext)
    • 如何在 OWIN Host 中注册 HubPipelineModule ?
    • @ATHER 你可以在你的 OWIN 启动类中使用GlobalHost.HubPipeline.AddModule
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2021-04-29
    • 2014-02-28
    • 2015-10-19
    相关资源
    最近更新 更多