Регистрация журнала SignalR?

Это больше двух вопросов, но:

  • Какой лучший способ иметь обработчик исключений верхнего уровня для моего концентратора? Это не представляется возможным с текущей версией SignalR

  • Почему это не делает ничего на клиенте, когда я делаю ошибку в моем концентраторе?

    $. connection.hub.error(function() { return alert ( "test" ); });

Когда я отлаживаю, я вижу, что мой метод ошибки подключен, но когда я делаю исключение на концентраторе, я вижу, что никогда не было попытки вызвать метод, который я установил выше. Единственное, что происходит, это SignalR barfs ошибка на консоли.

Для записи я могу подключить другие события просто отлично

//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");
});

Ответы

Ответ 1

$.connection.hub.error используется для устранения сбоев соединения хабов. Вы можете использовать jQuery deferred.fail() для обработки исключения, вызванного определенным вызовом концентратора ($.connection.hub.methodThatThrows().fail(function() { ... }), но это, очевидно, не обрабатывает исключения, вызванные любым вызовом.

SignalR v1.0.0 добавит поддержку IHubPipelineModules. Затем вы сможете переопределить HubPipelineModule.BuildIncoming или HubPipelineModule.OnIncomingError, который затем можно добавить в HubPipeline через GlobalHost.HubPipeline.AddModule(myHubPipelineModule).

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);
};