为BizTalk ESB Toolkit 2.0创建自定义SOAP适配器

时间:2009-07-24 16:00:58

标签: biztalk esb esb-toolkit-2.0

使用BizTalk ESB Toolkit 2.0

我们正在开发一个项目,我们需要调用代理到一个DLL的Web服务。我们通过编排执行此操作没有任何问题,因为您可以使用静态端口并将其配置为使用SOAP适配器,并将Web服务设置指向BizTalk Admin界面中的程序集。在行程中虽然似乎没有明显的方法可以做到这一点,因为动态端口没有使用SOAP适配器的选项。

我们有充分的理由想要这样做,不用担心。

接下来,我们实现了一个自定义适配器提供程序,但在使其工作时遇到了问题。

我们按照here显示的(旧)示例:

自定义适配器提供程序继承自BaseAdapterProvider并覆盖SetEndPoint(Dictionary,IBaseMessageContext)方法。

该方法提取通过解析程序字典传入的程序集名称,类型名称和方法名称,然后将它们写入管道上下文:

pipelineContext.Write("TypeName", 
    "http://schemas.microsoft.com/BizTalk/2003/soap-properties", typeName);
pipelineContext.Write("MethodName", 
   "http://schemas.microsoft.com/BizTalk/2003/soap-properties", action);
pipelineContext.Write("AssemblyName", 
    "http://schemas.microsoft.com/BizTalk/2003/soap-properties", assembly);

并将传输类型设置为soap:

pipelineContext.Write("TransportType",
    "http://schemas.microsoft.biztalk.practices.esb.com/itinerary", "SOAP");

在所有其他方面,适配器提供程序几乎与上面链接中显示的示例相同,除了从SMTP到SOAP的明显更改。

适配器提供程序程序集已签名,GACed并添加到esb.config。

从仅调用服务的行程中调用适配器提供程序,然后返回响应。我们正在测试工具包附带的行程测试客户端的行程。自定义适配器中的事件日志记录显示正在调用适配器代码。问题是邮件未被路由到服务代理。事件查看器给出以下错误:

  

Messaging引擎无法处理   适配器提交的消息:SOAP   资源   网址:/ESB.ItineraryServices.Response/ProcessItinerary.asmx。   详细信息:已发布的消息可以   不会因为没有订阅者而被路由   被找到。如果出现此错误   订阅编排或发送端口   尚未入伍,或者如果有的话   必要的消息属性   订阅评估尚未进行   推广。请使用Biztalk   管理控制台进行故障排除   这次失败。

调查组概述中暂停的服务实例显示了两件事: 正确设置程序集名称,类型名称和方法名称的值。 邮件正文丢失了。 我们已经尝试将发送端口上的发送和接收管道配置为XMLTransmit / XMLReceive和ItinerarySendPassthrough / PassthroughReceive,它没有任何区别。

我们可能错过了一些明显的东西吗?您是否必须明确传递邮件正文?如果是这样的话?

编辑:

request from the BizTalk ESB Toolkit forum之后,我发布了行程,上下文和发送端口过滤器的屏幕截图。

ItineraryContextPort filters

非常感谢,奈杰尔。

2 个答案:

答案 0 :(得分:1)

首先,我会说你正试图过度设计解决方案。适配器开发并非易事,您需要考虑各种各样的事情。开发和部署适配器被归类为平台更改,这会影响整个环境,因此如果您不熟悉,那么您不应该这样做。我建议你采取其他一些路线。此时我个人对ESB内部结构没有足够的了解,因此无法对其进行评论。在最坏的情况下,您可能最好直接在业务流程(表达式或消息形状)中使用.NET代理DLL,而不是构建适配器。虽然它不推荐使用,但我觉得它比自定义适配器方法更好。

答案 1 :(得分:0)

从语义上讲,我不明白为什么涉及WCF-BasicHtpp适配器的解决方案在您的方案中不起作用。在任何情况下,我肯定会试着看看WCF-BasicHttp适配器会发生什么,一旦我得到了一个可行的解决方案,如果真的有必要,我会切换到自定义SOAP适配器。

目前,您的解决方案很奇怪 - 从某种意义上说,您的On-Ramp直接连接到Off-Ramp。我在任何一个行程中都没见过。您可能需要在两者之间创建中间消息传递或业务流程行程服务。

否则,消息会有效地发布到消息框中,显然没有订阅者,因此会遇到错误。