首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpApplication不退出

HttpApplication不退出
EN

Stack Overflow用户
提问于 2014-05-18 20:29:16
回答 1查看 450关注 0票数 3

我有一个单一的页面应用程序与Angular.js前端,网络api2后端,也使用城堡温莎和SignalR。

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

代码语言:javascript
复制
IoC.Container.Register(Component.For(typeof(MainManager)).ImplementedBy(typeof(MainManager)).LifeStyle.Singleton);

(然而,我测试了PerWebRequest和其他几种生活方式,但主要问题仍然是一样的,开始的任务没有退出)

然后,在我的Web中,我可以对该实例执行命令。

代码语言:javascript
复制
[HttpGet]
public void StartProcess(Params p) {
  IoC.Resolve<MainManager>().StartOperation(p);
}

这也让我有机会通过调用另一个控制器方法来阻止它出现在网站上。

代码语言:javascript
复制
[HttpGet]
public void Stop() {
  IoC.Resolve<MainManager>().RequestStop();
}

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

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

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

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

更新

我尝试将主要任务方法变成静态的。

代码语言:javascript
复制
[HttpGet]
public void Start(ForceData data) {
  MainManager.Start(data);
}

我认为这应该会使单例实例脱离等式,但是在接触web.config之后,代码仍然不间断地运行。

更新

将MainManager类从方程中删除。我的web方法现在所做的就是循环+睡眠。

代码语言:javascript
复制
[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 请求生命周期,以确定在什么时候这个请求会变成僵尸胭脂。

EN

回答 1

Stack Overflow用户

发布于 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运行时认为该请求仍在处理中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23726529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档