Я пытаюсь выполнить динамическую маршрутизацию изнутри оркестровки, вызывая приемный конвейер, очень похожий на предоставленный порт получения ItinerarySelectReceiveXml, чтобы разрешить маршрут для данного сообщения и отправить его на порт с прямой привязкой для маршрутизации ESB. Настройка аналогична образцу ComposedMessageProcessor BizTalk.
Насколько я вижу, мой приемный конвейер в точности похож на ItinerarySelectReceiveXml, за исключением компонента конвейера ESB Itinerary Select (на этапе ResolveParty). Я жестко закодировал строку подключения и ItineraryFactName (например, BRI: \ policy = MyResolveItineraryRule; useMsg = true; признатьMessageFormat = true; и Resolver.Itinerary), чтобы мне не приходилось делать трюки с петлевыми адаптерами и не посещать дополнительные сообщения.
Код для вызова приемного конвейера из формы выражения выглядит следующим образом:
// Первое сообщение, которое я хочу направить, это просто узел моего входящего сообщения
strXPath = "/*[local-name()='BeginConversationMessage' and namespace-uri()='http://MyCompany.BeginConversationMessage.v001']/*[local-name()='BeginConversationMessage' and namespace-uri()='http://MyCompany.BeginConversationMessage.v001']";
BeginConversationMessage = xpath(InboundMsg, strXPath);
RcvPipeOutput = Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteReceivePipeline(typeof(MyCompany.Itinerary_GenericSelector), BeginConversationMessage);
Это идет довольно хорошо, я вижу, что правильный маршрут для типа сообщения разрешается с помощью SQL Profiler, и я знаю, что маршрут хорош, потому что я использую его для этого типа сообщения с общим маршрутом на трассе.
Но я получаю исключение из Microsoft.Practices.ESB.PipelineComponents.Dispatcher, который у меня есть сразу после Microsoft.Practices.ESB.Itinerary.PipelineComponents.ItinerarySelector (на этапе принятия решения)
В документе указано, что компонент конвейерного выбора ESB должен установить сегмент маршрута Microsoft BizTalk Server, используя следующие свойства: correlationToken, reqRespTransmitPipelineID, interchangeId, receiveInstanceId, epmRRCorrelationToken.
Исключение выглядит так:
Значение не может быть нулевым.
Имя параметра: interchangeId
Источник: Microsoft.Practices.ESB.PipelineComponents.Dispatcher
Метод: Microsoft.BizTalk.Message.Interop.IBaseMessage Execute (Microsoft.BizTalk.Component.Interop.IPipelineContext, Microsoft.BizTalk.Message.Interop.IBaseMessage)
Ошибка Источник: Microsoft.Practices.ESB.Itinerary.OM.V1
Ошибка TargetSite: System.Object [] GetItineraryDataForBAM (Microsoft.Practices.ESB.Itinerary.OM.V1.Itinerary, Microsoft.Practices.ESB.Itinerary.IItineraryStep, System.String)
Ошибка StackTrace: в Microsoft.Practices.ESB.Itinerary.OM.V1.BAMItineraryProcess.GetItineraryDataForBAM (Маршрутный маршрут, шаг IItineraryStep, String interchangeId)
в Microsoft.Practices.ESB.Itinerary.OM.V1.BAMItineraryProcess.SubmitToBAM (Маршрутный маршрут, шаг IItineraryStep, контекст IPipelineContext, сообщение IBaseMessage)
в Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1. <> c__DisplayClassa.b__8 ()
в Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.AdvanceByOrder (ItineraryMessageDirection messageDirection, String serviceInstanceId, IItineraryStep, действие submitToBam, Boolean advanceStep)
в Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.Advance (сообщение IBaseMessage, контекст IPipelineContext, шаг IItineraryStep, логический advanceStep)
в Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.Advance (сообщение IBaseMessage, контекст IPipelineContext, шаг IItineraryStep)
в Microsoft.Practices.ESB.PipelineComponents.Dispatcher.Execute (контекст IPipelineContext, сообщение IBaseMessage)
Буду признателен за любую помощь.
p.s. Я также разместил этот вопрос в форме ESB Toolkit здесь http://social.msdn.microsoft.com/Forums/en/biztalkesb/thread/28c5befe-4c7f-4dc1-a5e7-8fe5b3ec1c75