C# 为什么Process.Start不';无法从asp.net web服务工作?
为什么这段代码作为控制台应用程序在我的开发计算机(win7 32位)和目标服务器(2008r2 64位)上完美运行。但是,当我尝试在目标服务器上作为web服务运行它时,它什么也不做。没有错误,什么都没有 如果我删除C# 为什么Process.Start不';无法从asp.net web服务工作?,c#,asp.net,web-services,ipc,external-application,C#,Asp.net,Web Services,Ipc,External Application,为什么这段代码作为控制台应用程序在我的开发计算机(win7 32位)和目标服务器(2008r2 64位)上完美运行。但是,当我尝试在目标服务器上作为web服务运行它时,它什么也不做。没有错误,什么都没有 如果我删除 exitMsg = proc.StandardOutput.ReadToEnd(); 然后它失败并出现错误: System.InvalidOperationException: 进程必须在请求之前退出 信息是可以确定的 我认为一定有一些关于用户的东西,代码在其中运行。作为web服务
exitMsg = proc.StandardOutput.ReadToEnd();
然后它失败并出现错误:
System.InvalidOperationException:
进程必须在请求之前退出
信息是可以确定的
我认为一定有一些关于用户的东西,代码在其中运行。作为web服务,此代码在asp.net用户下运行,这可能会导致问题
请告诉我如何解决这个问题。多谢各位
已解决
问题在于弹出的EULA对话框,但由于ProcessStartInfo设置,该对话框不可见。 当我在这个web服务的应用程序池中使用的帐户下通过CMD运行PsList.exe时,系统会提示我需要一个EULA协议,然后一切正常 奇怪的是,我的真实代码中有“pInfo.Arguments=“/accepteula”;”。这应该可以预防我的问题,但没有,我也不知道为什么。 如果你们当中有人知道原因,请告诉我
非常感谢你的帮助。你们是这里真正的好人。我想你们唯一的问题是:
proc.WaitForExit(1000);
它指示程序等待一秒钟,等待进程完成。在您的机器上,该过程完成得很好。不过,在另一台机器上,这可能需要更长的时间。尝试更改为:
proc.WaitForExit();
它将无限期地等待程序退出
您可能还希望重定向进程的输出,以查看编程是否挂起或等待您的其他信息(或者,在本例中,您的代码)
此外,该过程可能会遇到错误并将消息写入
StandardError
,而不是StandardOutput
。尝试设置pInfo.RedirectStandardError=true编码>并读取该代码,以查看是否缺少任何内容。尝试将业务逻辑包装在一个Try/catch块中,该块捕获任何异常并将其写入输出或日志文件。问题在于EULA对话框弹出,但由于ProcessStartInfo设置,该对话框不可见。
当我在这个web服务的应用程序池中使用的帐户下通过CMD运行PsList.exe时,系统会提示我需要一个EULA协议,然后一切正常
奇怪的是,我的真实代码中有“pInfo.Arguments=“/accepteula”;”。这应该可以预防我的问题,但没有,我也不知道为什么。
如果你们当中有人知道原因,请告诉我
非常感谢你的帮助。这里的人真的很好。正如你提到的,权限很可能是问题所在。您能否模拟具有更高权限的用户?仅根据错误消息,您是否在执行ReadToEnd
之前尝试过执行WaitForExit
?另外,删除timeout参数,因为现在如果花费的时间超过1秒,就会出现异常。如果这是您想要的,请捕获并处理异常。@George我如何才能模拟用户?web.config?@Primoz-Yes中的一些设置,还请注意,多个调用的这种原因会很快导致线程池耗尽。如果这是一个'once every now and then'类型的call-prob ok,但是要注意-我会尝试一个异步方法。@Primoz-您是否尝试过在该行之前使用或不使用该语句?我的意思是不用它就可以尝试。我是这样尝试的:使用(Process proc=Process.Start(pInfo)){proc.WaitForExit();exitCode=proc.exitCode;}@Primoz-我刚刚更新了我的答案。这个过程也可能是将某些内容写入StandardError,然后挂起(而不是完成)。你也应该检查一下,像这样?exitsg=proc.StandardError.ReadToEnd();进程WaitForExit();exitCode=proc.exitCode;它还是什么也没做。@Primoz-这给你带来了什么,或者只是让它再次挂起来?
proc.WaitForExit();