Почему Process.Start не работает с веб-службы asp.net? - PullRequest
3 голосов
/ 30 июня 2011

Почему этот код отлично работает на моем компьютере разработчика (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 ]

1 голос
/ 01 июля 2011

Проблема была в диалоговом окне EULA, которое всплывало, но было невидимым из-за настроек ProcessStartInfo.Когда я запускаю PsList.exe через CMD под учетной записью, которая также используется для пула приложений для этого веб-сервиса, мне предлагается соглашение EULA, и после этого все работает нормально.

Странно, что у меняpInfo.Arguments = "/ accepteula"; "в моем реальном коде.Это должно предотвратить мою проблему, но это не так, и я не знаю почему.Если кто-то из вас знает почему, пожалуйста, скажите мне.

Большое спасибо за помощь.Вы действительно хорошие люди здесь.

1 голос
/ 30 июня 2011

Я думаю, что ваша единственная проблема с:

proc.WaitForExit(1000);

Который указывает программе подождать секунду, пока процесс не завершится. На вашей машине процесс завершается нормально. На другой машине, однако, это может занять больше времени. Попробуйте изменить на:

proc.WaitForExit();

Который будет бесконечно ждать выхода из программы.

Возможно, вы также захотите перенаправить вывод Процесса, чтобы увидеть, зависает ли программирование или ожидает что-то еще от вас (или, в данном случае, вашего кода).

Кроме того, процесс может вызвать ошибку и записать сообщение в StandardError, а не StandardOutput. Попробуйте установить pInfo.RedirectStandardError = true; и прочитать его, чтобы увидеть, пропускаете ли вы что-нибудь.

0 голосов
/ 01 июля 2011

Попробуйте обернуть свою бизнес-логику в блок try / catch, который перехватывает любое исключение и записывает его в выходной файл или файл журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...