HttpApplication不会退出

时间:2014-05-18 20:29:16

标签: c# asp.net-mvc asp.net-web-api

我有一个单页应用程序,其中包含Angular.js前端,web api2后端,也使用Castle Windsor和SignalR。

我在维护服务器状态的服务器上使用c#组件。因此,在Application_Start()上,我将Castle Windsor的主要组件注册为Singleton。

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();
}

这在大多数情况下都很有用。但是,有时我的应用程序处于错误状态(由于多种原因,它可以在prod中重新启动)我可以通过在运行操作期间修改web.config来模拟这个问题,因此很多事情都会重置(例如Signal- R连接),但主要操作不会停止运行。

(事实上,一旦我的应用程序处于错误状态,我就不能再调用Stop控制器方法了,因为MainManager已被重置,所以到目前为止停止它的唯一方法是重置整个IIS。这当然不是需要的话)

我试图找出如何检测此状态,并终止正在运行的进程。

作为一种可能的解决方案,我正在尝试使用 Bound 生活方式(Castle Windsor 3中的新功能),尝试将我的经理范围扩展到我的web api httpapplication,但还没有运气。

更新

我尝试将主要任务方法设为静态

[HttpGet]
public void Start(ForceData data) {
  MainManager.Start(data);
}

我相信这应该取出单例实例,但触摸web.config后代码仍然不会中断。

更新

将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 request lifecycle的信息,以确定此请求在哪个位置变为zombie rouge

1 个答案:

答案 0 :(得分:0)

这是设计使然,因为在应用程序重新启动时不会立即释放HttpApplication实例,

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

  

当需要重新启动应用程序时,ASP.NET将在重新启动应用程序域并加载新程序集之前,为现有应用程序域和旧程序集中的所有待处理请求提供服务。

在所有示例Web API方法中,您可以看到线程仍然忙,这意味着ASP.NET运行时认为此请求仍在处理中。