ASP.Net运行时编译不会离开编译的dll,并删除临时文件

时间:2016-06-16 12:24:10

标签: c# asp.net .net iis runtime-compilation

我们遇到了ASP.Net运行时编译的问题。

在IIS的开始(以及重新启动后),用户控件和布局编译得很好,没有任何问题。但是在生命周期的某个时刻,运行时编译只是停止工作。重新启动IIS进程会使其再次运行。

在搜索了无数不同的帖子之后,我们已经做了一些额外的调试,但我们仍然难以理解导致我们问题的原因。

为了保持这一点,我将跳过解释我们所做的所有测试,然后跳到我认为最接近错误核心的地方。

我们已将compilation.tempDirectory切换到此Web应用程序专用的自定义文件夹,并且我们已设置procmon以查看此文件夹中的所有文件更改。一旦错误开始发生,我们可以看到临时文件实际写入此驱动器,并且启动了csc.exe(在此期间,conhost.exe,CcmExec.exe和许多其他进程),我们看到procmon中没有错误,但是在运行csc.exe之后,它会删除临时文件而不会离开编译版本。 (并且asp.net错误屏幕显示我们csc.exe失败,但不完全失败了)。所有临时文件都已创建(生成的dll除外) - .0.cs,.1.cs,.tmp,.cmdline,.out,.err都是短时间内存在的。但是在创建之后立即再次删除它们,应用程序找不到它们。

有没有人知道在进程运行一段时间后导致失败的原因是什么?如果我们在IIS重新启动后运行它,完全相同的文件编译就好了,但过了一段时间似乎运行时编译过程中的某些东西失败,导致ASP / w3wp / csc进程删除临时文件的所有符号,而不是创建dll,并使功能失败。

1 个答案:

答案 0 :(得分:0)

最后找出导致我问题的原因。

我们安装了一个外部模块,它运行另一个第三方exe文件来进行一些优化。运行外部程序,在应用程序池标识下启动conhost.exe进程。

第二个第三方(exe)在某些情况下可能由于文件锁定而失败,导致exe和conhost.exe挂起。一旦运行了足够多的conhost.exe,就不再允许应用程序池启动新的运行时运行运行时编译。这导致运行时编译失败,Web应用程序自动清理临时文件。