为什么此代码在我的开发计算机(win7 32位)和目标服务器(2008r2 64位)上作为控制台应用程序运行完美。但是当我尝试在目标服务器上将其作为Web服务运行时,它什么都不做。没错,没什么。
如果我删除
exitMsg = proc.StandardOutput.ReadToEnd();
然后失败并出现错误:
System.InvalidOperationException: 流程必须在请求之前退出 信息可以确定。
[WebMethod]
public string GetRunningProcesses()
{
ProcessStartInfo pInfo = new ProcessStartInfo();
pInfo.FileName = @"E:\bin\PsList.exe";
pInfo.WindowStyle = ProcessWindowStyle.Hidden;
pInfo.CreateNoWindow = true;
pInfo.UseShellExecute = false;
pInfo.RedirectStandardOutput = true;
string exitMsg = "";
int exitCode = 1;
using (Process proc = Process.Start(pInfo))
{
exitMsg = proc.StandardOutput.ReadToEnd();
proc.WaitForExit(1000);
exitCode = proc.ExitCode;
}
return exitMsg;
}
我认为必须有一些关于用户运行代码的东西。作为Web服务,此代码在asp.net用户下运行,这可能会解决问题。
请建议我如何解决这个问题。非常感谢你。
分辨
问题出在EULA对话框上,该对话框已加速,但由于ProcessStartInfo设置而导致其无法访问。 当我通过CMD在帐户下运行PsList.exe时,该帐户也用于此Web服务的应用程序池,我会收到EULA协议的提示,并且在此之后工作正常。
奇怪的是我有“pInfo.Arguments =”/ accepteula“;”在我的真实代码中。这应该可以防止我的探测,但它没有,我不知道为什么。 如果有人知道原因,请告诉我。
非常感谢您的帮助。你是这里的好人。
答案 0 :(得分:1)
我认为你唯一的问题是:
proc.WaitForExit(1000);
指示程序等待一秒钟以完成该过程。在您的机器上,该过程完成。但是,在另一台机器上,可能需要更长时间。尝试更改为:
proc.WaitForExit();
将无限期地等待程序退出。
您可能还想重定向Process的输出,以查看编程是否挂起或等待您的其他内容(或者,在本例中为您的代码)。
此外,该过程可能会遇到错误并将消息写入StandardError
而不是StandardOutput
。尝试设置pInfo.RedirectStandardError = true;
并阅读它,看看是否有任何遗漏。
答案 1 :(得分:1)
问题出在EULA对话框上,该对话框已加速,但由于ProcessStartInfo设置而导致其无法访问。 当我通过CMD在帐户下运行PsList.exe时,该帐户也用于此Web服务的应用程序池,我会收到EULA协议的提示,并且在此之后工作正常。
奇怪的是我有“pInfo.Arguments =”/ accepteula“;”在我的真实代码中。这应该可以防止我的探测,但它没有,我不知道为什么。 如果有人知道原因,请告诉我。
非常感谢您的帮助。你是这里的好人。
答案 2 :(得分:0)
尝试将业务逻辑包装在try / catch块中,该块捕获任何异常并将其写入输出或日志文件。