使用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之后,我发布了行程,上下文和发送端口过滤器的屏幕截图。
Itinerary, Context, Port filters
非常感谢,奈杰尔。
答案 0 :(得分:1)
首先,我会说你正试图过度设计解决方案。适配器开发并非易事,您需要考虑各种各样的事情。开发和部署适配器被归类为平台更改,这会影响整个环境,因此如果您不熟悉,那么您不应该这样做。我建议你采取其他一些路线。此时我个人对ESB内部结构没有足够的了解,因此无法对其进行评论。在最坏的情况下,您可能最好直接在业务流程(表达式或消息形状)中使用.NET代理DLL,而不是构建适配器。虽然它不推荐使用,但我觉得它比自定义适配器方法更好。
答案 1 :(得分:0)
从语义上讲,我不明白为什么涉及WCF-BasicHtpp适配器的解决方案在您的方案中不起作用。在任何情况下,我肯定会试着看看WCF-BasicHttp适配器会发生什么,一旦我得到了一个可行的解决方案,如果真的有必要,我会切换到自定义SOAP适配器。
目前,您的解决方案很奇怪 - 从某种意义上说,您的On-Ramp直接连接到Off-Ramp。我在任何一个行程中都没见过。您可能需要在两者之间创建中间消息传递或业务流程行程服务。
否则,消息会有效地发布到消息框中,显然没有订阅者,因此会遇到错误。