BizTalk ESB Portal - обработка исключений

Я достаточно опытен в BizTalk, но плохо знаком с набором инструментов ESB. На самом деле у нас нет необходимости в решении ESB как таковом, но я бы хотел использовать портал ESB для отображения ошибок, изменения сообщений и повторной отправки.

  • Насколько я могу судить, я успешно установил и настроил набор инструментов ESB на своем компьютере разработчика.

  • Мне удалось отправить ошибки на портал, включив маршрутизацию для сообщений с ошибками, и из оркестровки, создав сообщение таким образом: FaultMessage = Microsoft.Practices.ESB.ExceptionHandling.ExceptionMgmt.CreateFaultMessage();

Сообщения корректно отображаются на портале, и после выбора "Изменить" мне предоставляется возможность повторной отправки через WCF OnRamp, SOAP OnRamp и HTTPReceive. Это где моя проблема начинается. Я использовал WCF OnRamp для повторной отправки, и при этом я получаю сообщение:

Это сообщение было успешно отправлено

Однако, возвращаясь к начальному экрану портала, у меня появилась новая ошибка для приложения Microsoft.Practices.ESB:

There was a failure executing the receive pipeline: "Microsoft.Practices.ESB.Itinerary.Pipelines.ItinerarySelectReceiveXml, Microsoft.Practices.ESB.Itinerary.Pipelines, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Source: "ESB Itinerary Selector" Receive Port: "OnRamp.Itinerary" URI: "/ESB.ItineraryServices.WCF/ProcessItinerary.svc" Reason: Error 135008: The itinerary was not found in the repository. 

Я полагаю, что мне нужно что-то здесь настроить, возможно, средство для разрешения моего сообщения, но я до сих пор не смог найти руководство, которое поможет мне решить эту проблему. Есть ли здесь какой-нибудь обзор, показывающий полную обработку исключений в ESB Portal? Мне удалось найти много помощи в получении сообщений, но не для настройки повторной отправки. Благодарю.

3 ответа

Решение

WCF OnRamp использует конвейер ItinerarySelectReceiveXml, который можно настроить так, чтобы он указывал на маршрут или бизнес-правило, и, следовательно, сообщение можно легко маршрутизировать в зависимости от его типа и содержимого.Перенаправлять ошибки по конвейеру

Теперь моя проблема заключается в том, что до нашей установки во мне появилась третья сторона, поэтому я сейчас изучаю создание нового OnRamp и настройку портала ESB, чтобы выбрать его в своем списке повторных отправок.

По совпадению я пытался сделать эту работу и сегодня...

Если вы задали строку подключения распознавателя маршрута в конфигурации компонента приемного конвейера WCF OnRamp для использования ITINERARY-STATIC:\headerRequired=true; (вместо ITINERARY-STATIC:\headerRequired=false;) вы получите следующее сообщение в средстве просмотра событий:

Название маршрута является обязательным и не было предоставлено

Это означает, что маршрут отсутствует в пользовательском заголовке SOAP.

Я также отследил сообщение, исходящее из ESB.Portal с использованием Fiddler (после отключения защиты сообщений как в ESB.Portal, так и в месте получения BizTalk). Нет Маршрут настраиваемого заголовка SOAP.

Пройдя через код ESB.Portal, я нашел причину в MessageResubmitter.cs:

   [Serializable]
   public static class MessageResubmitter
   {
      /// <summary>
      /// Submits an XML message to the WCF OnRamp.  The URL of the WCF OnRamp is defined in the
      /// portal web.config.  Context properties are not resubmitted, they are expected to be
      /// applied by the receiving pipeline.
      /// </summary>
      /// <param name="doc">The XML document to submit.</param>
      /// <returns>True if the submission was successful, false if the submission failed.</returns>
      public static bool ResubmitWCF(XmlDocument doc)
      {
         try
         {
            ProcessRequestClient onRamp = new ProcessRequestClient();
            onRamp.SubmitRequest(**null**, doc.OuterXml);
            return true;
         }
         catch (Exception)
         {
            return false;
         }
      }

Первым аргументом SubmitRequest является Маршрут, для которого установлено значение NULL. Это означает, что ESB.Portal не отправляет маршрут в качестве настраиваемого заголовка SOAP в BizTalk при повторной отправке сообщения.

В настоящий момент я могу подумать о следующих опциях, чтобы сделать эту работу: 1) Создать (или изменить существующий) универсальный OnFamp WCF, чтобы использовать BRE для определения маршрута, который будет связан с повторно отправленным сообщением. Однако это может стать сложным, потому что вам нужно будет создать свои правила, чтобы иметь возможность обрабатывать любые сообщения, повторно отправленные с любого шага в ваших маршрутах. 2) Измените код ESB.Portal, чтобы можно было повторно отправить маршрут + текущий шаг в качестве настраиваемого заголовка SOAP.

Я, вероятно, иду на вариант 2.

У нас недавно была похожая проблема. Пока мы экспортировали наши маршруты в локальную базу данных и развертывали их, ESB не смог бы найти маршруты.

Оказалось, что наш консультант изменил файл esb.config в ESB Toolkit, чтобы искать маршруты на сервере, а не на локальной машине.

Поэтому, если, как и я, вы уверены, что маршруты экспортируются в нужное место и что они развернуты, измените строку подключения esb.config.

<connectionStrings>
    <add name="ItineraryDb" connectionString="Data Source=.;Initial Catalog=EsbItineraryDb;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionString>
Другие вопросы по тегам