SignalR — добавление концентраторов во время выполнения

У меня есть работающее приложение SignalR, мой global.asax.cs выполняет все обычные MapHubs() и т. д., и я использую собственный IAssemblyLocator, который также загружает сборки в памяти, а также сборки, на которые ссылаются. Два концентратора, которые у меня есть, создаются во время выполнения в сборках в памяти, и это отлично работает — концентраторы могут отправлять сообщения клиентам и т. д.

В какой-то момент после запуска приложения я хочу добавить еще один концентратор во время выполнения, который будет находиться в собственной сборке в памяти, и сделать так, чтобы он отображался в файле signalr/hubs/.

Как мне это сделать?

Повторный вызов MapHubs приводит к ошибке, поскольку маршрут уже определен. Удаление маршрута (которое мне удалось сделать только с помощью RouteTable.Routes.Remove(RouteTable.Routes[0]) до сих пор и, очевидно, не идеально), похоже, не работает.

Есть ли хороший способ сделать это?


person isaidNO    schedule 12.06.2013    source источник


Ответы (1)


Используйте альтернативный синтаксис вместо использования статического файла signalr/hubs, поскольку он никогда не будет обновляться:

http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-javascript-client#genproxy

person davidfowl    schedule 12.06.2013
comment
Спасибо за это, я попробую, но я также думаю, что проблема в том, что после того, как я загрузил новую dll в память, инфраструктура сигнализатора не знает об этом. Вызов GlobalHost.ConnectionManager.GetHubContext(‹newhubname›) - person isaidNO; 12.06.2013
comment
Дох преждевременно отправить! Вызов GlobalHost.ConnectionManager.GetHubContext(‹newhubname›) приводит к исключению, но если я вручную перечислю свой список сборок и посмотрю типы в каждой, я увижу там новый тип концентратора - person isaidNO; 12.06.2013
comment
Взгляните на замену этой службы github.com/SignalR/SignalR/blob/master/src/ - person davidfowl; 13.06.2013
comment
Отлично, похоже на бизнес. Где я могу увидеть исходный код IHubDescriptorProvider по умолчанию? Я так понимаю, этот код запускается всякий раз, когда я пытаюсь получить концентратор с помощью GetHubContext? Кроме того, если я использую здесь свой собственный код, а не автоматически сгенерированный прокси, означает ли это, что мне больше не нужно вызывать MapHub? - person isaidNO; 13.06.2013
comment
С этим все в порядке, спасибо! Я скопировал и изменил ReflectedHubDescriptorProvider.cs. Было бы хорошо иметь возможность наследовать и переопределять здесь, поэтому мне не нужно беспокоиться об отсутствующих вещах при обновлении SignalR... - person isaidNO; 13.06.2013
comment
Я понимаю, что это старый ответ, но не могли бы вы включить в этот ответ некоторый код, а не просто ссылку? Этот вопрос потенциально закрывается как дубликат этого , но я сомневаюсь, так как сам этот ответ может быть удален как NAA. - person Rob; 04.05.2016
comment
@Rob, хотя код наверняка будет полезен, я не думаю, что вопрос, который вы связали, дублируется. Концентраторы против постоянных подключений, Selfhost против IIS. Если я ошибаюсь, можете ли вы объяснить мне, почему? - person user1515791; 04.05.2016
comment
@user1515791 user1515791 Он был помечен как дубликат, я не особо вникал в него, так как этот ответ в любом случае был только ссылкой. Если это не дубликат, это нормально, но в ответе все равно может использоваться фрагмент, чтобы предотвратить гниение ссылок :) - person Rob; 04.05.2016