The error handler is added like this at client:
$.connection.hub.url = "/signalr";
$.connection.hub.logging = true;
$.connection.hub.error(function(error) {
console.log('SignalrAdapter: ' + error);
});
$.connection.hub.start().done(function() { me.onStartDone(); });
// ...
At server it is:
hubConfiguration.EnableDetailedErrors = true;
Accordingly to the docs this should be enough.
At my exception throwing it just displays a log text for it and does not invoke the handler:
[18:18:19 GMT+0000()] SignalR: ... [[[my error description here]]] ...
At my cshtml page:
<script src="~/Scripts/vendor/jquery.signalR-2.1.2.js"></script> <script src="~/signalr/hubs"></script>
However if I attach an error handler to the method itself it is got called:
$.connection.operatorHub.server.myMethodName(someParam).fail(function(error) {
console.log("Error handler called: " + error);
});
How to handle a general error?
UPDATE.
The answer is below. Also see these:
- http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server#handleErrors
- SignalR, Owin and exception handling
Hope it helps someone.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
I tested on a little chat project (downloaded here) it seems this method handle only connection errors.
$.connection.hub.error(function(error) {
console.log('SignalrAdapter: ' + error);
});
I was able to handle all exceptions with the HubPipelineModule class.
1) I created a 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 Added the module to 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) My ChatHub class :
public class ChatHub : Hub
{
public void Send(string name, string message)
{
throw new Exception("exception for Artyom");
Clients.All.broadcastMessage(name, message);
}
}
4) In the js I use this code to get my exception message :
$.connection.chatHub.client.exceptionHandler = function (error) {
console.log('SignalrAdapter: ' + error);
alert('SignalrAdapter: ' + error);
};
Method 2
I’ve used the error handling on the client like this:
It’s for SignalR version 2
More detail: SignalR documentation – How to handle errors in the Hub class
Hub – AppHub.cs:
public class AppHub : Hub
{
public void Send(string message)
{
throw new HubException("Unauthorized", new { status = "401" });
}
}
Client-side:
$(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);
}
});
});
});
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0
