2014-05-18 5 views
3

У меня есть одностраничное приложение с фронтом 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

+1

изменить темы так, чтобы у них 'IsBackground' установлено значение true. 'MainManager.Stop()' будет останавливать их изящно во время обычных выходов, а 'thread.IsBackground' будет следить за тем, чтобы приложение могло завершить работу, если что-то не удается. – jgauffin

+0

@jgauffin Я не явным образом создаю нити. Вы говорите, что я должен начать делать это, чтобы установить это свойство? –

+0

фоновый поток работал бы, но если мне нужно создать новый поток, это изменит такие вещи, как идентификация/безопасность. Мое приложение в настоящее время зависит от httpcontext и т. Д. Возможно ли создать фоновый поток со всем остальным, идентичным текущему потоку? –

ответ

0

Это дизайн, как и HttpApplication случаи не освобождаются немедленно при перезапуске приложения,

http://msdn.microsoft.com/en-us/library/vstudio/ms178473%28v=vs.100%29.aspx

Когда требуется перезапуск приложения, ASP.NET будет обслуживать все ожидающие запросы от существующего домена приложения и старые сборки перед перезапуском домен приложения и загрузки нового сборок.

Во всем своем примере метода Web API вы можете видеть, что поток по-прежнему занят, что означает, что среда выполнения ASP.NET считает, что этот запрос все еще обрабатывается.

+0

знаете ли вы, как это обнаружить? Application_End не запускается –

+0

Поскольку в той же статье неявно указывается, 'Application_End' вызывается только тогда, когда обслуживаются все ожидающие запросы. Таким образом, вашему приложению будет довольно сложно обнаружить перезапуск. Вообще говоря, вы должны отказаться от своего текущего синхронного подхода и проверить, поддерживает ли поддержка async в таком случае, http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet -mvc-4 и http://blog.mariusschulz.com/2014/05/07/scheduling-background-jobs-from-an-asp-net-application-in-net-4-5-2. Они должны позволить вам лучше контролировать свои задачи. –

+0

попробует это и сообщит мои выводы, спасибо –

Смежные вопросы