【问题标题】:IIS 6+ASP.NET - many temp files generatedIIS 6+ASP.NET - 生成了许多临时文件
【发布时间】:2011-01-31 18:32:21
【问题描述】:

我有一个 ASP.NET + 一些在 IIS 6(win 2003 服务器)上运行的 .NET Web 服务。问题是 IIS 在“c:\WINDOWS\Temp”目录中生成了很多(!)文件。很多文件意味着数千个文件,到目前为止,这些文件的大小超过了 3G。

文件由以下命令生成: C:\WINDOWS\SysWOW64\inetsrv> "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc.exe" /t:library /utf8output /R:"C:\WINDOWS\Microsoft.NET\Framework\ v2.0.50727\Temporary ASP.NET Files\vfagt\113819dd\db0d5802\assembly\dl3\fedc6ef1\006e24d8_3bc9ca01\VfAgentWService.DLL" /R:"C:\WINDOWS\assembly\GAC_MSIL\System.Web.Services\2.0.0.0 __b03f5f7f11d50a3a\System.Web.Services.dll" /R:"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System.Xml\ 2.0.0.0__b77a5c561934e089\System.Xml.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll" /out:"C:\WINDOWS\TEMP\9i_i2bmg.dll" /debug- /optimize+ /nostdlib /D:_DYNAMIC_XMLSERIALIZER_COMPILATION "C:\WINDOWS\TEMP\9i_i2bmg.0.cs"

temp 目录中的文件是成对的 *.out 和 *.err,其中 *.err 文件大小为零,而 *.out 文件包含编译输出消息。

是什么导致 IIS 生成这么多文件?

如何预防?

更新:

问题是我上面描述的命令(csc.exe)被执行了很多(很多)次,导致.out和.err被生成了很多次,直到它消耗了磁盘空间。

所以 - 我的问题是:是什么导致此命令运行这么多次? (我的网络应用程序中没有那么多 .aspx 和 .asmx 文件)。

谢谢, 萌

【问题讨论】:

  • 老实说很难,但它似乎与 iis 无关,而是与 csc(编译器)有关

标签: asp.net iis compilation tempdir


【解决方案1】:

你无法阻止它。 IIS + ASP.NET 动态编译 .aspx、.asmx、.ascx、.ashx、.asax 等文件。这些都是模板文件,最终会转换为所选语言的源代码 - C#、VB.NET 或任何您选择用于编写 ASPX 页面的语言。

ASP.NET 的模型,当接收到页面请求时,是这样的:

  • 检查所请求页面的程序集是否可用并且是最新的。如果是,则将请求传递给页面。
  • 如果没有,则从相关模板(aspx、ascx 等)生成源代码。将生成的源代码放入 ASP.NET Temp 目录。
  • 将源文件编译成动态命名的程序集,并放置在临时目录中。如您所见,如果您使用 C#,这意味着它运行 csc.exe。
  • 加载新编译的程序集。
  • 将请求传递给该程序集(例如,步骤 1)

.out 和 .err 文件只是调用 csc.exe 的 stdout 和 stderr。 这些不太可能消耗 3gb 的文件系统空间。

但是,ASPNET 还在该目录树中保留任何页面或控件(等)引用的所有程序集的临时副本。如果您在三个不同的 ASPX 页面中引用 System.Xml.dll,则 System.Xml.dll 的副本将放置到 ASPNET 临时文件目录树中的三个不同的临时目录中。这些副本可以累积,听到您的大部分 3gb 都在 DLL 副本中,我不会感到惊讶。

http://www.codeproject.com/KB/aspnet/ASPXFILES.aspx了解更多信息

您可以删除C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 目录中的任何文件。这在 IIS 和 ASP.NET 处于活动状态时是不可能的。如果您有维护期,则可以在站点关闭时将其删除。如果它是开发机器,只需停止 IIS (net stop w3svc) 删除该文件夹中的所有子目录,然后重新启动 IIS (net start w3svc)。


相关:
- Eliminating temporary ASP.Net Files
- What is the “Temporary ASP.NET Files” folder for?

【讨论】:

  • 感谢您的详细解释。但是,问题是我上面描述的命令(csc.exe)被执行了很多(很多)次,导致.out和.err被生成了很多次,直到它消耗了磁盘空间。所以 - 我的问题是:是什么导致这个命令运行这么多次? (我的网络应用程序中没有那么多 .aspx 和 .asmx 文件)。
  • 时间戳可能有问题。如果编译输出的时间戳晚于 .aspx 文件,则 ASPNET 决定运行编译器。例如,如果您有一个 ASPX 文件的时间戳记为将来的某个时间(可能,但不合理),那么 ASPNET 永远不会决定不需要重新编译它。我的建议是停止 IIS,删除临时文件夹,然后检查并更正所有 ASPX 文件的时间戳等。
【解决方案2】:

在你的 web.config 中寻找这个:

  </system.diagnostics>
    <switches>
      <add name="XmlSerialization.Compilation" value="1" />
    </switches>
  </system.diagnostics>

value = 1 表示保存临时文件。您可以预编译序列化文件以防止编译发生。

【讨论】:

    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 2020-05-11
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多