2009-07-24 31 views
2

自定义SOAP适配器使用BizTalk ESB工具包2.0创建为BizTalk ESB工具包2.0

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

我们为什么要这样做,有一个很好的理由,不用担心。

继此之后,我们实现了一个自定义适配器提供程序,但在使其正常工作时遇到问题。

我们遵循所示here的(旧的)例子:

定制适配器提供从继承BaseAdapterProvider和覆盖对setEndpoint(词典,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); 

,并设置传输类型到皂:

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

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

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

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

The Messaging engine failed to process a message submitted by adapter:SOAP Source URL:/ESB.ItineraryServices.Response/ProcessItinerary.asmx. Details:The published message could not be routed because no subscribers were found. This error occurs if the subscribing orchestration or send port has not been enlisted, or if some of the message properties necessary for subscription evaluation have not been promoted. Please use the Biztalk Administration console to troubleshoot this failure.

调查组概述悬浮服务instamces示出了两件事情: 装配名称,类型名称,和方法名的值正被正确设置。 邮件正文缺失。 我们已经尝试配置发送端口上的发送和接收管道是XMLTransmit/XMLReceive和ItinerarySendPassthrough/PassthroughReceive,它没有区别。

有什么明显的我们可能错过了?你是否必须明确地传递消息体?如果是这样如何?

编辑:

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

Itinerary, Context, Port filters

非常感谢,奈杰尔。

+0

我会先尝试进入您的适配器代码,看看那里发生了什么,看看您是否首先获取消息数据。 – 2009-07-24 20:38:45

回答

1

首先,我会说你试图过度设计解决方案。适配器开发不是微不足道的,您需要考虑各种事情。开发和部署适配器被归类为平台更改,这会影响整个环境,所以如果您不熟悉,则不应该这样做。我会建议你采取其他的路线。在这一点上,我个人对ESB内部没有足够的了解,所以无法评论它。在最糟糕的情况下,您最好直接在编排(表达式或消息形状)内部使用.NET代理DLL,而不是构建适配器。尽管不推荐使用这种方法,但我仍觉得它比自定义适配器更好。

+0

感谢您的回应;我们也按照您的建议走下了从编排调用代理的路线。不过,我们仍然想要采取这种方法。是的,我同意这不是微不足道:)。 – Nigel 2009-07-27 11:15:45

0

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

目前,您的解决方案很奇怪 - 从某种意义上说,您有一个直接连接到斜坡的斜坡。我从未在任何行程中看到过。您可能需要在中间创建中间消息传递或编排行程服务。

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

相关问题