Почему Process.Start не работает с веб-службы asp.net?
Почему этот код отлично работает на моем компьютере разработчика (win7 32bit) и на целевом сервере (2008r2 64bit) в качестве консольного приложения. Но когда я пытаюсь запустить его как веб-сервис на целевом сервере, он ничего не делает. Нет ошибок, ничего.
Если я удалю
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;
}
Я думаю, что должно быть что-то о пользователе, под которым работает код. Как веб-сервис, этот код работает под пользователем asp.net, и это может решить проблемы.
Пожалуйста, посоветуйте мне, как это исправить. Большое спасибо.
ПОСТАНОВИЛИ
Проблема была в диалоговом окне EULA, которое всплывало, но было невидимым из-за настроек ProcessStartInfo. Когда я запускаю PsList.exe через CMD под учетной записью, которая также используется для пула приложений для этого веб-сервиса, мне предлагается соглашение EULA, и после этого все работает нормально.
Странно то, что у меня есть "pInfo.Arguments = "/accepteula";" в моем реальном коде. Это должно предотвратить мою проблему, но это не так, и я не знаю почему. Если кто-то из вас знает почему, пожалуйста, скажите мне.
Большое спасибо за помощь. Вы действительно хорошие люди здесь.
3 ответа
Проблема была в диалоговом окне EULA, которое всплывало, но было невидимым из-за настроек ProcessStartInfo. Когда я запускаю PsList.exe через CMD под учетной записью, которая также используется для пула приложений для этого веб-сервиса, мне предлагается соглашение EULA, и после этого все работает нормально.
Странно то, что у меня есть "pInfo.Arguments = "/accepteula";" в моем реальном коде. Это должно предотвратить мою проблему, но это не так, и я не знаю почему. Если кто-то из вас знает почему, пожалуйста, скажите мне.
Большое спасибо за помощь. Вы действительно хорошие люди здесь.
Я думаю, что ваша единственная проблема с:
proc.WaitForExit(1000);
Который инструктирует программу ждать секунду для завершения процесса. На вашей машине процесс завершается нормально. На другой машине, однако, это может занять больше времени. Попробуйте перейти на:
proc.WaitForExit();
Который будет бесконечно ждать выхода программы.
Возможно, вы также захотите перенаправить вывод Process, чтобы узнать, не зависает ли программирование или ожидает что-то еще от вас (или, в данном случае, от вашего кода).
Кроме того, в процессе может возникнуть ошибка и записать сообщение StandardError
скорее, чем StandardOutput
, Попробуйте установить pInfo.RedirectStandardError = true;
и читать это, чтобы увидеть, есть ли что-то, что вы пропустили.
Попробуйте обернуть свою бизнес-логику в блок try / catch, который перехватывает любое исключение и записывает его либо в выходной файл, либо в файл журнала.