Почему 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, который перехватывает любое исключение и записывает его либо в выходной файл, либо в файл журнала.

Другие вопросы по тегам