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>