如何在客户端处理SignalR服务器异常?
问题描述:
错误处理程序被添加像这样的客户:如何在客户端处理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。 答案如下。还看到这些:
- http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server#handleErrors
- SignalR, Owin and exception handling
希望它可以帮助别人。
答
我测试了一个小聊天项目(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);
};
答
我用过的错误处理在客户端上这样的:
它是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);
}
});
});
});
你可以尝试禁用日志记录'$ .connection.hub.logging = TRUE;' –
@QuentinRoger不,它并不能帮助。 – Artyom
奇怪的是,如果我停在方法的错误处理程序上并评估堆栈中捕获的内容,那么一般错误处理程序会被调用。 – Artyom