我有一个单页应用程序,前端使用 Angular.js,后端使用 Web api2,还使用 Castle Windsor 和 SignalR。
我在服务器上使用 C# 组件来维护服务器状态。因此,在 Application_Start() 上,我将温莎城堡的主要组件注册为单例。
IoC.Container.Register(Component.For(typeof(MainManager)).ImplementedBy(typeof(MainManager)).LifeStyle.Singleton);
(但是,我测试了 PerWebRequest 和其他一些生活方式,但主要问题仍然相同,已启动的任务不会退出)
然后在我的 Web Api 中,我可以针对该实例执行命令。
[HttpGet]
public void StartProcess(Params p) {
IoC.Resolve<MainManager>().StartOperation(p);
}
这也让我有机会通过调用另一个控制器方法来阻止它从网站上
[HttpGet]
public void Stop() {
IoC.Resolve<MainManager>().RequestStop();
}
这在大多数情况下都非常有效。但是,有时我的应用程序会处于不良状态(由于多种原因,它可以在产品中重新启动)我可以通过在运行操作期间修改 web.config 来模拟此问题,因此很多事情都会重置(例如 Signal- R连接),但主操作并不停止运行。
(事实上,一旦我的应用程序处于不良状态,我就无法再调用该 Stop 控制器方法,因为 MainManager 已重置,因此目前停止它的唯一方法是重置整个 IIS。这当然是不希望的)
我试图找出如何检测这种状态,并终止正在运行的进程。
作为一种可能的解决方案,我正在尝试使用Bound生活方式(温莎城堡 3 中的新功能),试图将我的经理范围限制到我的 Web api httpapplication,但还没有运气。
update
我尝试将主要任务方法设为静态
[HttpGet]
public void Start(ForceData data) {
MainManager.Start(data);
}
我相信这应该将单例实例排除在等式之外,但是在接触 web.config 后代码仍然不间断地运行
update
将 MainManager 类排除在外。我的 Web api 方法现在所做的就是循环 + 睡眠
[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 的内容请求生命周期 http://www.codeproject.com/Articles/741228/MVC-Application-Lifecycle找出这个请求在什么时候变成僵尸胭脂