Ответ 1
Если вам нужна обработка исключений специально для концентраторов SignalR, промежуточное ПО OWIN не подходит.
Чтобы проиллюстрировать только одну причину, предположим, что SignalR использует свой транспорт WebSocket, когда исключение выбрасывается из метода Hub. В этом случае SignalR не закрывает соединение WebSocket. Вместо этого SignalR будет записывать JSON-кодированное сообщение непосредственно в сокет, чтобы указать клиенту, что было создано исключение. Нет простого способа использования промежуточного программного обеспечения OWIN для запуска какого-либо события, когда это происходит за пределами возможной упаковки всего OWIN WebSocket Extension, который я бы сильно посоветуйте.
К счастью, SignalR предоставляет свой собственный Hub Pipeline, который идеально подходит для вашего сценария.
using System;
using System.Diagnostics;
using Microsoft.AspNet.SignalR.Hubs;
public class MyErrorModule : HubPipelineModule
{
protected override void OnIncomingError(ExceptionContext exceptionContext, IHubIncomingInvokerContext invokerContext)
{
MethodDescriptor method = invokerContext.MethodDescriptor;
Debug.WriteLine("{0}.{1}({2}) threw the following uncaught exception: {3}",
method.Hub.Name,
method.Name,
String.Join(", ", invokerContext.Args),
exceptionContext.Error);
}
}
Вы можете использовать ExceptionContext для более чем простого ведения журнала. Например, вы можете установить ExceptionContext.Error в другое исключение, которое изменит исключение, которое получает клиент.
Вы даже можете исключить исключение, установив для параметра ExceptionContext.Error значение null или установив ExceptonContext.Result. Если вы сделаете это, клиенту появится, что метод Hub вернул значение, найденное в ExceptonContext.Result, вместо того, чтобы метать.
A, а назад написал другой ответ SO о том, как вы можете вызвать обратный вызов одного клиента для каждого исключения, созданного методом Hub: Регистрация журнала SignalR?
Существует также документация MSDN для HubPipelineModules: http://msdn.microsoft.com/en-us/library/microsoft.aspnet.signalr.hubs.hubpipelinemodule(v=vs.118).aspx