【问题标题】:Does changing any sub-directory or file in an ASP.NET application recycles the app pool更改 ASP.NET 应用程序中的任何子目录或文件是否会回收应用程序池
【发布时间】:2013-11-25 07:33:54
【问题描述】:

直到几个小时前,我还以为我很了解 ASP.NET。我知道 IIS 可以由于多种原因回收应用程序域,包括更改 web.config/bin/App_GlobalResources 等文件/目录,或者按计划或特定事件(如达到特定内存阈值)。

我非常确定我的代码没有达到任何这些条件。基本上,一个常规的 http 请求会在后台线程 (ThreadPool.QueueUserWorkItem) 中触发一个小任务,这会导致在我的 ASP.NET 应用程序的子目录中写入一个 pdf 文件。

这个子目录没有任何可以导致应用程序回收的资格。是这样的:

我的网站\公司名称\Mailer\UploadFiles

请不要提出诸如配置或 bin 目录更改之类的原因,代码在 ASP.NET 文件夹中没有任何变化。它写入非 ASP.NET 目录中的 pdf 文件。

我使用 Application_End 事件找出回收的原因(使用此处建议的反射:http://weblogs.asp.net/scottgu/archive/2005/12/14/433194.aspx)并得到了这个:

_shutDownMessage=Directory rename change notification for 'd:\Projects\MyProject\trunk\dev'.
dev dir change or directory rename
HostingEnvironment initiated shutdown
HostingEnvironment caused shutdown
Directory rename change notification for 'd:\Projects\MyProject\trunk\dev'.
dev dir change or directory rename

我几乎被难住了。我很确定我已经在其他项目上编写了代码,这些代码写在应用程序的子目录下而不会导致应用程序回收。但在这种情况下不是。

我错过了什么吗? IIS 是否会回收尝试从 ASP.NET 应用程序本身写入应用程序的任何子目录的应用程序域?

【问题讨论】:

    标签: asp.net iis recycle


    【解决方案1】:

    有一个叫做 FileChangesMonitor 的东西,它有一个要查看的文件夹列表,如果其中任何一个发生变化,它将触发应用程序回收。似乎只要通过 HTTP 请求提供资源(html 页面、图像或在您的情况下为 pdf),它所在的文件夹就会成为 ASP.NET 文件夹,即被添加到列出并监控变化。资源位于应用程序根目录内部还是外部都无关紧要。我在删除文件夹时遇到了这个问题,但我猜重命名也会发生同样的事情。这是令人沮丧的,因为它使提供不稳定的静态资源变得非常困难。

    【讨论】:

    • 嗯...这是一个很好的建议,我会考虑的。如果确实如此,我认为有一个非常简单的解决方法,即不使用 HttpResponse.WriteFile 写入文件,而是使用流手动读取文件并使用 HttpResponse.WriteBytes 输出。同样可以很容易地封装在 HttpResponse 的扩展方法中。
    猜你喜欢
    • 2012-04-05
    • 2015-01-26
    • 2020-05-23
    • 2011-01-12
    • 2018-07-07
    • 2011-08-22
    • 2015-01-07
    • 2011-01-06
    • 1970-01-01
    相关资源
    最近更新 更多