2

我在 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 门户进行完整的端到端异常处理?我已经设法找到了很多关于将消息输入其中但没有配置重新提交的帮助。谢谢。

4

3 回答 3

5

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

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

行程名称为必填项,未提供

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

我还使用 Fiddler 跟踪了来自 ESB.Portal 的消息(在关闭 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 的第一个参数是 Itinerary,设置为 null。这意味着当您重新提交消息时,ESB.Portal 不会将行程作为自定义 SOAP 标头重新发送到 BizTalk。

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

我可能会选择选项2。

于 2012-09-11T16:44:58.603 回答
2

WCF OnRamp 使用 ItinerarySelectReceiveXml 管道,可以将其配置为指向行程或业务规则,因此可以根据消息类型和内容轻松路由消息。 通过管道重新路由错误

我现在的问题是第三方在我之前安装了我们的安装,所以我现在正在考虑创建一个新的 OnRamp 并配置 ESB 门户以在其重新提交列表中选择它。

于 2012-09-18T08:53:48.763 回答
0

我们最近遇到了类似的问题。当我们将行程导出到本地数据库并进行部署时,ESB 将无法找到行程。

结果发现,我们现场的一位顾问修改了 ESB Toolkit 中的 esb.config 文件,以便在服务器而不是本地计算机上查找行程。

因此,如果您像我一样确定行程已导出到正确的位置并且已部署,请修改 esb.config 连接字符串。

<connectionStrings>
    <add name="ItineraryDb" connectionString="Data Source=.;Initial Catalog=EsbItineraryDb;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionString>
于 2014-06-05T12:13:20.573 回答