2016-03-21 263 views
3

错误处理程序被添加像这样的客户:如何在客户端处理SignalR服务器异常?

$.connection.hub.url = "/signalr"; 
$.connection.hub.logging = true; 
$.connection.hub.error(function(error) { 
    console.log('SignalrAdapter: ' + error); 
}); 

$.connection.hub.start().done(function() { me.onStartDone(); }); 
// ... 

在服务器,它是:

hubConfiguration.EnableDetailedErrors = true; 

因此到the docs这应该是足够了。

在我的异常抛出它只是显示一个记录文本,并不会调用处理程序:

[18:18:19 GMT+0000()] SignalR: ... [[[my error description here]]] ... 

在我CSHTML页:

<script src="~/Scripts/vendor/jquery.signalR-2.1.2.js"></script> 
<script src="~/signalr/hubs"></script> 

但是,如果我附上一个错误处理程序该方法本身被称为:

$.connection.operatorHub.server.myMethodName(someParam).fail(function(error) { 
    console.log("Error handler called: " + error); 
}); 

如何处理一般错误?

UPDATE。 答案如下。还看到这些:

希望它可以帮助别人。

+0

你可以尝试禁用日志记录'$ .connection.hub.logging = TRUE;' –

+0

@QuentinRoger不,它并不能帮助。 – Artyom

+0

奇怪的是,如果我停在方法的错误处理程序上并评估堆栈中捕获的内容,那么一般错误处理程序会被调用。 – Artyom

回答

9

我测试了一个小聊天项目(downloaded here)看来这个方法只处理连接错误。

$.connection.hub.error(function(error) { 
    console.log('SignalrAdapter: ' + error); 
}); 

我能够处理HubPipelineModule类的所有例外。

1)I创建了一个SOHubPipelineModule

public class SOHubPipelineModule : HubPipelineModule 
{ 
    protected override void OnIncomingError(ExceptionContext exceptionContext, 
              IHubIncomingInvokerContext invokerContext) 
    { 
     dynamic caller = invokerContext.Hub.Clients.Caller; 
     caller.ExceptionHandler(exceptionContext.Error.Message); 
    } 
} 

2)I增加了模块GlobalHost.HubPipeline

// Any connection or hub wire up and configuration should go here 
    GlobalHost.HubPipeline.AddModule(new SOHubPipelineModule()); 
    var hubConfiguration = new HubConfiguration { EnableDetailedErrors = true }; 
    app.MapSignalR(hubConfiguration); 

3)我ChatHub类:

public class ChatHub : Hub 
    { 
     public void Send(string name, string message) 
     { 
      throw new Exception("exception for Artyom"); 
      Clients.All.broadcastMessage(name, message); 
     } 

    } 

4)在JS我使用此代码来获取我的异常消息:

$.connection.chatHub.client.exceptionHandler = function (error) { 
     console.log('SignalrAdapter: ' + error); 
     alert('SignalrAdapter: ' + error); 
};  

enter image description here

+0

有趣的方式。不知道有关'HubPipelineModule.OnIncomingError'。尝试了这个小聊天项目。它在那里工作。但是这在我的项目中不起作用。研究这一点。在我的项目中,我有信号员组,autofac,owin等。并在客户端...这似乎很复杂。 – Artyom

+0

而这看起来像一些破解。为什么不把错误放在第一位,而不是让第二次打电话给客户? – Artyom

+0

我知道这是丑陋的,但我认为它是处理集线器的所有异常的唯一方法:( –

4

我用过的错误处理在客户端上这样的:

它是SignalR版本2

更多细节:SignalR documentation - How to handle errors in the Hub class

枢纽 - AppHub。CS:

public class AppHub : Hub 
    { 
     public void Send(string message) 
     { 
      throw new HubException("Unauthorized", new { status = "401" }); 
     } 
    } 

客户端:

$(function() { 

      var appHub = $.connection.appHub; 

      $.connection.hub.start().done(function() { 

       appHub.server.send("test message") 
        .fail(function (e) { 

         if (e.source === 'HubException') { 
          console.error("Error message: ", e.message); 
          console.error("Error status: ", e.data.status); 
         } 

        }); 
      }); 

     }); 
+0

那么,它工作吗? – Artyom

+0

是的,它工作正常:) – Jenan

+0

值得注意的是,这增加了SignalR 2 – Learner

相关问题