Запуск процесса с использованием C #, как узнать, произошла ошибка или нет? - PullRequest
0 голосов
/ 28 июля 2011

В рамках автоматизации развертывания BizTalk я использую следующий код для запуска процесса из C #.

        string commandArguments =
            "ImportApp /ApplicationName:\"" + ApplicationFullName +
            "\" /Package:\"" + MsiFilePath+ "\"";
        Process p = new Process();
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.FileName = "BTSTask.exe";
        p.StartInfo.Arguments = commandArguments;
        p.StartInfo.RedirectStandardError = true;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.CreateNoWindow = true;
        p.Start();
        StreamReader outputStream = p.StandardOutput;
        StreamReader errorStream = p.StandardError;
        // Read the standard output
        //string output = outputStream.ReadToEnd();
        string error = errorStream.ReadToEnd();
        //WriteToLogFile(output);
        if (!error.Equals(""))
        {
            WriteToLogFile(error);
            throw new Exception("Error occurred while importing application " + 
                ApplicationFullName +
                Environment.NewLine +
                error);
        }
        p.WaitForExit();
        p.Close();
        return;

Вывод этого процесса, который я получаю в файле журнала, выглядит следующим образом:

Copyright (c) 2010 Microsoft Corporation. All rights reserved.
Information: Importing package "\\tc6218\BizTalkReceiveDrop\servername\Apps\Core.Artifacts.msi" into application "Core.Artifacts" in BizTalk configuration database (server="TC6218", database="BizTalkMgmtDb")...
Information: Performing action "Create" on host "ConfigurationDb" using package "\\ Apps\Core.Artifacts.msi".
Information: Validating resources (count=6)...
* Validating resource (-Type="System.BizTalk:Assembly" -Luid="TC.BizTalk.Functoid.AdvancedDatabaseLookup, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f68c7d112162f09d")...
* Validating resource (-Type="System.BizTalk:Assembly" -Luid="TaylorCorp.Erp.ServiceBus.MasterData.Components.BusinessRules, Version=1.0.0.2, Culture=neutral, PublicKeyToken=f68c7d112162f09d")...
* Validating resource (-Type="System.BizTalk:BizTalkAssembly" -Luid="ICSM.Schemas, Version=4.0.1.0, Culture=neutral, PublicKeyToken=69c11018615fef04")...
* Validating resource (-Type="System.BizTalk:BizTalkAssembly" -Luid="ICSM.Pipelines, Version=4.0.1.0, Culture=neutral, PublicKeyToken=69c11018615fef04")...
* Validating resource (-Type="System.BizTalk:BizTalkAssembly" -Luid="ICSM.Maps, Version=2.0.0.0, Culture=neutral, PublicKeyToken=69c11018615fef04")...
* Validating resource (-Type="System.BizTalk:BizTalkBinding" -Luid="Application/Core.Artifacts")...
Information: Performing change requests...
Information: Calling BeginTypeChangeRequest for all selected resource types...
PerformingBeginChangeRequest
PerformingBeginChangeRequest
PerformingBeginChangeRequest
Adding resource (-Type="System.BizTalk:Assembly" -Luid="TC.BizTalk.Functoid.AdvancedDatabaseLookup, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f68c7d112162f09d") to store.
Information: PerformingEndChangeRequestsWithRollBack
* Performing EndTypeChangeRequest for resource type "System.BizTalk:Assembly".
* Performing EndTypeChangeRequest for resource type "System.BizTalk:BizTalkAssembly".
* Performing EndTypeChangeRequest for resource type "System.BizTalk:BizTalkBinding".
Error: Resource (-Type="System.BizTalk:Assembly" -Luid="TC.BizTalk.Functoid.AdvancedDatabaseLookup, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f68c7d112162f09d") already in store. 
1) Use BTSTask's overwrite flag or 
2) Set redeploy flag to true in BizTalk Project or 
3) Click overwrite all checkbox in Admin MMC  
to update if the resource exists in the specified target application "Core.Artifacts".
Overwrite flag will be ignored if the resource is associated with another application.


Command failed with 1 errors, 0 warnings.

Теперь все, что мне нужно сделать, это выяснить, ошибся ли процесс или нет. И мне нужно сохранить как выходной поток, а также поток ошибок в строковых переменных. (Я не хочу разбирать эту строку, вы, вероятно, уже знаете это. И я не хочу сталкиваться с проблемами, которые Microsoft называет «тупиками», которые я не совсем понимаю в этом сценарии.

Спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

Согласно: http://msdn.microsoft.com/en-us/library/aa559686(v=bts.20).aspx

Процесс BTSTask.exe возвращает 0 в случае успеха и ненулевой в случае возникновения проблемыЭтот код возврата будет отображаться в вашем p.ExitCode

2 голосов
/ 28 июля 2011

Вспоминается 3 решения:

  1. Подписаться на Process.ErrorDataRectained событие.
  2. Получить код ошибки возврата из процесса.Обычно, если это не 0, это сигнал об ошибке.
  3. Проанализируйте, если ваш процесс сообщает об ошибке в StandartOutput, и прочитайте эту строку, проанализировав ваши "ключевые слова".

К сожалениюиспользуя отдельный процесс, вы «теряете» контроль, поэтому вынуждены переходить между надежной архитектурой и отказоустойчивостью, основанной на решениях во время проектирования вашего проекта.

Надеюсь, это поможет.

С уважением.

...