Как SignalR сопоставляет запрос с концентратором?

Мне интересно, как SignalR сопоставляет запрос с концентратором?

Как он выбирает, какой концентратор использовать? Где имя хаба в запросе?

Кроме того, как он выбирает, какое действие в концентраторе будет обрабатывать запрос? Является ли это частью URL-адреса запроса?

И, наконец, есть ли способ подключиться к этому конвейеру (например, IActionFilter, IHubSelector, IActionSelector)?


person Alwyn    schedule 09.09.2013    source источник


Ответы (2)


SignalR имеет открытый исходный код. Вы можете найти большую часть того, что ищете, здесь: https://github.com/SignalR/SignalR/tree/master/src/Microsoft.AspNet.SignalR.Core/Hubs

Начните с этой строки для входящего канала:

https://github.com/SignalR/SignalR/blob/master/src/Microsoft.AspNet.SignalR.Core/Hubs/HubDispatcher.cs#L145

Удачи!

person davidfowl    schedule 10.09.2013
comment
Это отличный намек +1, но все же не полностью отвечает на вопрос. - person Alwyn; 11.09.2013

Он получает типы концентраторов через:

IAssemblyLocator, который возвращает соответствующие сборки.

SignalR затем опрашивает сборки для всех типов, которые проходят:

private static bool IsHubType(Type type)
    {
      try
      {
        return typeof (IHub).IsAssignableFrom(type) && !type.IsAbstract 
                 && (type.Attributes.HasFlag((Enum) TypeAttributes.Public) 
                 || type.Attributes.HasFlag((Enum) TypeAttributes.NestedPublic));
      }
      catch
      {
        return false;
      }
    }

Типы, удовлетворяющие приведенному выше условию, затем используются для создания IHubDescriptors, свойство типа которого затем разрешается с помощью преобразователя зависимостей.

person Alwyn    schedule 12.09.2013