我有一个项目,它使用外部应用程序通过WebAPI服务处理中等大小的文件。上传文件,进行一些预处理和验证,然后将工作交给可执行文件,如下所示:
int result = -1;
try
{
using (var process = new Process())
{
process.StartInfo = new ProcessStartInfo
{
FileName = GetExePath(),
Arguments = GetArguments(),
WorkingDirectory = Path.GetDirectoryName(GetExePath()),
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
};
process.Start();
process.WaitForExit()
result = process.ExitCode;
}
}
catch (Exception ex)
{
throw new ExecutionFailedException("An unexpected error occurred while running the external process.", result, null, ex);
}
完成此过程后,将收集输出文件并将其返回给用户。我遇到的问题是,经过一段时间的运行后,IIS开始死于一些相对奇怪的错误。在一个测试环境中,我们在工作器初始化期间得到OutOfMemory异常。在另一个,CLR开始无法加载.DLLs,给出“文件名或扩展名太长”错误。在另一个,我们得到一个FatalExecutionEngineError。如果我用一些虚拟过程替换调用实际上Start()外部exe,那么一切都运行得很好。
所有这些都告诉我,.exe中存在某种堆腐败错误,但这里是踢球者:如果我直接针对完全相同的数据运行exe,一切都很好。
所以,有两个问题:通过Process.Start()调用的.exe实际上是否有可能在不引起保护错误的情况下破坏调用应用程序的内存,或者我是否误读整个情况?我怎么能尝试进一步缩小这个范围,因为.exe似乎没有单独行为错误?
更新2/11:
经过大量的来回奔跑,并在代码中进行了大量工作后,看来这与子进程中发生的文件IO有关。该部分的开发人员已经参与其中,如果他们删除所有IO(日志记录,输出文件等),事情就会开始正常运行。我们仍然试图缩小原因,但至少我们有一些面包屑要跟随。
更新2/14
这似乎是子进程中的复合问题。首先,在log4net初始化期间,一些神秘的东西变坏了。如果我们给log4net一个错误的配置,或者完全删除它,我们就可以继续了。否则,我们会在重复执行后看到这些失败。其次,我们在子进程中有一个#ifdebug部分,用于编写本地执行统计文件。当为调试构建子可执行文件并且存在该代码时,我们最终会获得OutOfMemory异常。当构建用于发布时,以及禁用log4net,我们能够正常运行。