У меня есть одностраничное приложение с фронтом Angular.js, web api2 back end, а также с использованием Castle Windsor и SignalR.HttpApplication не уходит
Я использую компонент C# на сервере, который поддерживает состояние сервера. Итак, на Application_Start() я регистрирую основной компонент с помощью Castle Windsor as Singleton.
IoC.Container.Register(Component.For(typeof(MainManager)).ImplementedBy(typeof(MainManager)).LifeStyle.Singleton);
(однако, я испытал PerWebRequest и несколько других образ жизни, но основная проблема остается той же, запущенная задача не выходит)
Тогда в моем веб-Апи, я могу выполнять команды против этого экземпляра ,
[HttpGet]
public void StartProcess(Params p) {
IoC.Resolve<MainManager>().StartOperation(p);
}
и это также дает мне возможность остановить его с сайта, позвонив другой метод контроллера
[HttpGet]
public void Stop() {
IoC.Resolve<MainManager>().RequestStop();
}
Это прекрасно работает по большей части. Однако иногда мое приложение попадает в плохое состояние (по множеству причин, оно может быть перезапущено в prod). Я могу подражать этой проблеме, изменяя web.config во время выполнения операции, поэтому многие вещи перезагружаются (например, Signal- R), но основная операция не прекращается.
(Фактически, когда мое приложение находится в плохом состоянии, я больше не могу вызывать этот метод контроллера Stop, потому что MainManager был сброшен, поэтому единственный способ остановить его на данный момент - сбросить весь IIS. не желательно)
Я пытаюсь выяснить, как определить это состояние и завершить выполняющийся процесс.
В качестве одного из возможных решений я экспериментирую с использованием Bound образ жизни (новый в Castle Windsor 3), пытаясь охватить моего менеджера моим веб-api httpapplication, но пока не повезло.
обновление
Я попытался сделать основной метод задания статического
[HttpGet]
public void Start(ForceData data) {
MainManager.Start(data);
}
Я считаю, что это должно вынуть одноэлементный экземпляр из уравнения, но код все еще работает не-прерван после прикосновения полотна .config
обновление
выбрал класс MainManager из уравнения. Весь мой метод веб-апи делает сейчас петли + сон
[HttpGet]
public void Start(ForceData data) {
foreach (var e in data.Members)
{
_log.Info("processing member: {0}", e.Email);
Thread.Sleep(1000);
}
}
этот цикл также не прерывается после прикосновения web.config.
Таким образом, на данный момент я читал о MVC request lifecycle, чтобы выяснить, в какой момент этот запрос идет зомби ROUGE
изменить темы так, чтобы у них 'IsBackground' установлено значение true. 'MainManager.Stop()' будет останавливать их изящно во время обычных выходов, а 'thread.IsBackground' будет следить за тем, чтобы приложение могло завершить работу, если что-то не удается. – jgauffin
@jgauffin Я не явным образом создаю нити. Вы говорите, что я должен начать делать это, чтобы установить это свойство? –
фоновый поток работал бы, но если мне нужно создать новый поток, это изменит такие вещи, как идентификация/безопасность. Мое приложение в настоящее время зависит от httpcontext и т. Д. Возможно ли создать фоновый поток со всем остальным, идентичным текущему потоку? –