BizTalk ESB门户 - 异常处理

Red*_*ter 2 biztalk esb esb-toolkit-2.0 biztalk-2010

我在BizTalk方面经验丰富,但对ESB工具包是新手.我们并不真的需要ESB解决方案,但我想使用ESB Portal来显示错误,修改消息并重新提交.

  • 据我所知,我已经成功地在我的开发机器上正确安装和配置了ESB工具包.

  • 我已经设法通过为失败的消息启用路由并通过创建消息从Orchestration中发送错误来向门户发送错误: 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. 
Run Code Online (Sandbox Code Playgroud)

我认为我需要在这里配置一些东西,也许是我的消息的解析器,但到目前为止,我还没有找到一个可以帮助我解决这个问题的指南.是否有一些在那里展示了ESB Portal的完整端到端异常处理?我已经设法找到了很多帮助来获取消息,但没有配置重新提交.谢谢.

小智 5

巧合的是,我今天也试图让这项工作......

如果在WCF OnRamp的接收管道组件配置上设置行程解析程序连接字符串以使用ITINERARY-STATIC:\ headerRequired = true; (而不是ITINERARY-STATIC:\ headerRequired = false;),然后您将在事件查看器中收到以下消息:

行程名称是必需的,未提供

这意味着自定义SOAP标头中不存在行程.

我还使用Fiddler跟踪来自ESB.Portal的消息(在关闭ESB.Portal和BizTalk接收位置中的Message安全性之后).没有行程自定义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;
         }
      }
Run Code Online (Sandbox Code Playgroud)

SubmitRequest的第一个参数是Itinerary,它被设置为null.这意味着当您重新提交邮件时,ESB.Portal不会将行程重新发送为BizTalk的自定义SOAP标头.

目前,我可以考虑以下选项来完成这项工作:1)创建(或修改现有的)通用WCF OnRamp以使用BRE来确定与重新提交的消息相关联的行程.然而,这可能变得复杂,因为您需要创建规则以便能够处理从您的行程中的任何步骤重新提交的任何消息.2)修改ESB.Portal的代码,以便能够将行程+当前步骤重新发送为自定义SOAP标头.

我可能会选择2.