【问题标题】:Why would IIS "start" an App that is still running?为什么 IIS 会“启动”仍在运行的应用程序?
【发布时间】:2011-03-19 07:39:22
【问题描述】:

我们有一个在 IIS7 / Windows 2008 上运行的 ASP.NET (3.5 SP1) 应用程序。我们在 Global.asax 中捕获 Application_Start 和 Application_End 事件。我们还在应用程序中托管 WCF 服务,并通过 ServiceHostFactory 捕获 OnOpening 和 OnClosing 事件。因此,我们认为,我们可以保证收到任何应用程序启动和停止、已安排或未安排好的通知。

几天前,我们的应用程序在“已启动”/“运行”状态下捕获了一个 Application_Start 事件。

在 Application_Start 之前没有 Application_End 事件(如果考虑到竞争条件,甚至几分钟之后)。

我们的第一个想法是我们的​​应用程序实际上默默地崩溃并终止了。实际上发生的事情是一个新的 App Domain 启动以服务入站请求,但现有 App Domain 的后台线程(我们在 ThreadPool 线程中做很多事情)仍然运行了几天——直到我用 IISRESET 杀死了它们。

猜测是 Application_End 没有触发是因为原来的 AppDomain 没有结束……但是为什么 Application_Start 会触发呢?

寻找描述这种半关闭+AppDomainStartup 机制在 ASP.NET 中如何工作的提示或文档。

提前致谢,

霍华德霍夫曼

【问题讨论】:

    标签: asp.net iis-7 appdomain application-start application-end


    【解决方案1】:

    请了解可能导致此类情况的应用程序池回收。当 IIS 决定回收一个池时,它只是先初始化一个新的工作进程(Application_Start 会依次调用),然后关闭旧的(Application_End)。

    我建议你在日志中添加一些带有进程ID的应用程序级别的日志,以便更好地理解我上面的分析是否正确。

    对于 ASP.NET 开发人员,建议了解有关 IIS 的更多信息。

    【讨论】:

    • 奇怪的是,我看到了相同的行为——多次 Application_start 调用,我们正在记录 pid,而且是一样的。因此,同一个 w3wp 进程决定再次启动它已经在服务的应用程序。
    • 我确实想补充一点,我们的 AppPool 设置为永不回收 - 所有 AppPool 回收设置都为 0。我们从未确定实际发生了什么 - 为什么 App Pool 崩溃。我们后来确实改变了我们的 Application_Start/End 机制,将文件用作“互斥体”——App-Start 创建文件,App-End 删除,如果文件存在,App-Start 会快速终止。因此,如果它再次发生,我们至少可以检测到双启动情况。在几年的生产中......它没有。
    猜你喜欢
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2018-06-02
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多