Фоновый поток IIS и SignalR

Мне нужен фоновый поток, который выполняет некоторую работу и отправляет данные пользователям, подключенным к службе через SignalR.

Я подумал о том, чтобы разместить этот поток внутри IIS и создать его при первом вызове Application_Start или в отдельном рабочем процессе.

Если я размещаю его в IIS и создаю при запуске приложения, поток запускается только при первом обращении к приложению. Мне нужно, чтобы он работал, как только я запускаю службу. - Я не контролирую этот поток через графический интерфейс рабочего стола, я не могу остановить или приостановить его простым способом.

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

Что вы думаете по этому поводу? Видите ли вы какое-либо другое решение?


person Cristian Toma    schedule 30.03.2012    source источник
comment
В чем причина нежелания, чтобы служба выступала в роли пользователя? Как вы собираетесь подключаться к концентратору в фоновом потоке в IIS (плохая идея imo haacked.com/archive/2011/10/16/)   -  person redsquare    schedule 30.03.2012
comment
Причина в безопасности и скорости   -  person Cristian Toma    schedule 30.03.2012
comment
Безопасность? Вы можете использовать проверку подлинности Windows, скорость? Что тормозит в клиенте?   -  person redsquare    schedule 31.03.2012


Ответы (2)


Мы подошли к этому, создав отдельную конечную точку в веб-приложении, которую может вызывать ваша служба Windows.

Представьте, что в контроллере ASP.NET MVC существует следующий URI: http://[myserver]/api/TellUsers/[msg]. Внутри этого метода вы можете получить подключенных клиентов концентратора и сделать вызов.

[HttpPut]
public void TellUsers(string msg)
{
   var connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
   var demoClients = connectionManager.GetClients<MyHubDerivedClass>();
   demoClients.TellUsers(msg);
}

[Вставьте здесь предостережение о правильной проверке ошибок.]

Конечно, вам не обязательно использовать MVC. Подойдет любой общедоступный URI. Что касается его защиты, вы можете использовать любой допустимый метод защиты конечных точек ASP.NET.

person MikeC    schedule 26.04.2012

Я знаю, что вопрос довольно старый, но:

По правде говоря, мне больше нравится ваш пример «самого клиента». Это дает вам контроль из многих разных точек, а не только из одной. Пример — несколько служб могут вызываться для управления службой. Я не вижу причин, по которым у вас не может быть пользователя-администратора, который может вызывать «специальные» команды, недоступные другим пользователям.

Это испытанная конструкция для многих систем. Я бы придерживался этого.

person cineam mispelt    schedule 08.05.2013