我有一个单一的页面应用程序与Angular.js前端,网络api2后端,也使用城堡温莎和SignalR。
我在维护服务器状态的服务器上使用c#组件。因此,在Application_Start()上,我将主组件注册为Singleton。
IoC.Container.Register(Component.For(typeof(MainManager)).ImplementedBy(typeof(MainManager)).LifeStyle.Singleton);(然而,我测试了PerWebRequest和其他几种生活方式,但主要问题仍然是一样的,开始的任务没有退出)
然后,在我的Web中,我可以对该实例执行命令。
[HttpGet]
public void StartProcess(Params p) {
IoC.Resolve<MainManager>().StartOperation(p);
}这也让我有机会通过调用另一个控制器方法来阻止它出现在网站上。
[HttpGet]
public void Stop() {
IoC.Resolve<MainManager>().RequestStop();
}这在很大程度上是很好的。但是,有时我的应用程序会处于糟糕的状态(由于多种原因,它可以在prod中重新启动),我可以通过在运行操作期间修改web.config来模拟这个问题,所以很多事情都会重置(例如信号-R连接),但是主操作不会停止运行。
(事实上,一旦我的应用程序处于糟糕的状态,我就不能再调用停止控制器方法了,因为MainManager已经被重置了,所以现在停止它的唯一方法就是重置整个IIS。这当然是不想要的)
我正在试图找出如何检测此状态,并终止正在运行的进程。
作为一种可能的解决方案,我正在尝试使用绑定的生活方式(在城堡温莎3中是新的),试图将我的经理范围扩展到我的web httpapplication,但还没有成功。
更新
我尝试将主要任务方法变成静态的。
[HttpGet]
public void Start(ForceData data) {
MainManager.Start(data);
}我认为这应该会使单例实例脱离等式,但是在接触web.config之后,代码仍然不间断地运行。
更新
将MainManager类从方程中删除。我的web方法现在所做的就是循环+睡眠。
[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 请求生命周期,以确定在什么时候这个请求会变成僵尸胭脂。
发布于 2014-05-25 02:42:07
这是设计上的,因为HttpApplication实例在应用程序重新启动时不会立即释放,
http://msdn.microsoft.com/en-us/library/vstudio/ms178473%28v=vs.100%29.aspx
当需要重新启动应用程序时,ASP.NET将在重新启动应用程序域和加载新程序集之前,为来自现有应用程序域和旧程序集的所有挂起请求提供服务。
在所有示例Web方法中,您可以看到线程仍然很忙,这意味着ASP.NET运行时认为该请求仍在处理中。
https://stackoverflow.com/questions/23726529
复制相似问题