Событие Process Exited не запускается изнутри веб-службы - PullRequest
0 голосов
/ 02 июня 2010

Я пытаюсь обернуть стороннее приложение командной строки в веб-сервис.

Если я запускаю следующий код из консольного приложения:

Process process= new System.Diagnostics.Process();
process.StartInfo.FileName = "some_executable.exe";

// Do not spawn a window for this process
process.StartInfo.CreateNoWindow = true;
process.StartInfo.ErrorDialog = false;

// Redirect input, output, and error streams
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.EnableRaisingEvents = true;


process.ErrorDataReceived += (sendingProcess, eventArgs) => {
    // Make note of the error message
    if (!String.IsNullOrEmpty(eventArgs.Data))
        if (this.WarningMessageEvent != null)
            this.WarningMessageEvent(this, new MessageEventArgs(eventArgs.Data));
};

process.OutputDataReceived += (sendingProcess, eventArgs) => {
    // Make note of the message
    if (!String.IsNullOrEmpty(eventArgs.Data))
        if (this.DebugMessageEvent != null)
            this.DebugMessageEvent(this, new MessageEventArgs(eventArgs.Data));
};

process.Exited += (object sender, EventArgs e) => {
    // Make note of the exit event
    if (this.DebugMessageEvent != null)
        this.DebugMessageEvent(this, new MessageEventArgs("The command exited"));
};

process.Start();
process.StandardInput.Close();
process.BeginOutputReadLine();
process.BeginErrorReadLine();

process.WaitForExit();

int exitCode = process.ExitCode;
process.Close();
process.Dispose();

if (this.DebugMessageEvent != null)
    this.DebugMessageEvent(this, new MessageEventArgs("The command exited with code: " + exitCode));

Все события, включая событие «process.Exited», запускаются, как и ожидалось. Тем не менее, когда этот код вызывается из метода веб-службы, все события за исключением события "process.Exited".

Казалось бы, казнь на линии:

process.WaitForExit();

Кто-нибудь сможет пролить свет на то, чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 04 июня 2010

Как оказалось, проблема была вызвана исполняемым файлом, который я пытался вызвать.

К сожалению, этот исполняемый файл третьей стороны был портом команды UNIX, который запускался через своего рода эмулятор. Исполняемый файл был разработан для вывода сообщений в поток вывода и ошибок, как и следовало ожидать. Однако инструментарий, используемый нашим поставщиком для переноса двоичных файлов в Windows, не использует стандартные выходные потоки.

Когда я прошел через веб-сервис и вручную вызвал процесс из командной строки, я увидел, что эмулятор отображает диалоговое окно с сообщением об ошибке. С точки зрения C # процесс не завершится, пока в диалоговом окне не будет нажата кнопка [OK], поэтому событие «Exited» никогда не запускается.

Поговорив с нашим поставщиком об исполняемом файле, я узнал, что он не полностью поддерживается в 64-битной Windows. Я установил веб-сервис в 32-битной среде, и все было хорошо.

0 голосов
/ 02 июня 2010

Какой процесс вы там выполняете? Поскольку вы упомянули его консольное приложение, возможно, оно ожидало большего ввода? Поскольку он выполняется в качестве веб-службы, выполняется ли исполняемый файл с теми же разрешениями, что и веб-служба ASP? Возможно, веб-служба не освобождает исполняемый файл в том виде, в котором он загружен в процессе, или что веб-служба предназначена для постоянной работы до тех пор, пока IIS не будет перезапущен, и затем может вызвать событие Exit процесса .

Мое внимание также привлекло то, что нет никакого предложения using вокруг экземпляра объекта Process, т.е.

using (Process proc = new Process())
{
}

Редактировать: Также, пожалуйста, смотрите здесь ссылку на похожую концепцию. После сравнения результатов единственное, что свойство WindowStyle установлено ...

ps.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...