HttpApplication不会退出

本文关键字:退出 HttpApplication | 更新日期: 2023-09-27 18:03:51

我有一个单页应用,前端是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来模拟这个问题。配置期间运行的操作,所以很多东西复位(如Signal-R连接),但主要操作不停止运行。

(事实上,一旦我的应用程序处于坏状态,我就不能再调用停止控制器方法,因为MainManager已被重置,所以现在停止它的唯一方法是重置整个IIS。这当然是不希望的)

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

作为一个可能的解决方案,我正在尝试使用绑定生活方式(新的温莎城堡3),试图将我的管理范围扩展到我的web api httpapplication,但还没有运气。

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

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

我相信这应该把单例实例从等式中拿出来,但是代码在触摸web.config

后仍然运行不中断

将MainManager类排除在外。我所有的web api方法现在做的就是loop + sleep

[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请求生命周期找出这个请求在哪个点僵尸rouge

HttpApplication不会退出

这是设计的结果,因为应用程序重启时不会立即释放HttpApplication实例,

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

当需要重新启动应用程序时,ASP。. NET将在重新启动应用程序域并加载新程序集之前,处理来自现有应用程序域和旧程序集的所有挂起请求。

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