为BizTalk ESB Toolkit 2.0创建自定义SOAP适配器
使用BizTalk ESB Toolkit 2.0 我们正在进行一个项目,在这个项目中,我们需要调用一个代理来访问作为DLL的web服务。通过编排执行此操作没有问题,因为您可以使用静态端口并将其配置为使用SOAP适配器,web服务设置指向BizTalk管理界面中的程序集。不过,在计划中似乎没有一种明显的方法可以做到这一点,因为动态端口没有使用SOAP适配器的选项 我们这样做有很好的理由,别担心 在此基础上,我们实现了一个自定义适配器提供程序,但在使其工作时遇到了问题 我们遵循一个(旧)示例,如下所示: 自定义适配器提供程序继承自BaseAdapterProvider,并重写SetEndPoint(字典、IBaseMessageContext)方法 该方法提取通过解析器字典传入的程序集名称、类型名称和方法名称,然后将它们写入管道上下文:为BizTalk ESB Toolkit 2.0创建自定义SOAP适配器,biztalk,esb,esb-toolkit-2.0,Biztalk,Esb,Esb Toolkit 2.0,使用BizTalk ESB Toolkit 2.0 我们正在进行一个项目,在这个项目中,我们需要调用一个代理来访问作为DLL的web服务。通过编排执行此操作没有问题,因为您可以使用静态端口并将其配置为使用SOAP适配器,web服务设置指向BizTalk管理界面中的程序集。不过,在计划中似乎没有一种明显的方法可以做到这一点,因为动态端口没有使用SOAP适配器的选项 我们这样做有很好的理由,别担心 在此基础上,我们实现了一个自定义适配器提供程序,但在使其工作时遇到了问题 我们遵循一个(旧)示例,如下
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有明显的变化
适配器提供程序程序集已签名、添加并添加到esb.config
从仅调用服务然后返回响应的日程表调用适配器提供程序。我们正在从工具包附带的行程测试客户端测试行程。自定义适配器内的事件日志显示正在调用适配器代码。问题是消息没有路由到服务代理。事件查看器出现以下错误:
消息引擎无法处理
适配器提交的消息:SOAP
来源
URL:/ESB.inventureservices.Response/processinventurey.asmx。
详细信息:发布的消息可能会丢失
无法路由,因为没有订阅服务器
被发现了。如果
订阅业务流程或发送端口
尚未入伍,或者
所需的消息属性
订阅评估尚未完成
促进。请使用Biztalk
要进行故障排除的管理控制台
这次失败
在Group Overview中调查暂停的服务instamces可以看出两件事:
程序集名称、类型名称和方法名称的值设置正确。
消息正文丢失。
我们已经尝试将发送端口上的发送和接收管道配置为XMLTransmit/XMLReceive和InventureSendPassthrough/PassthroughReceive,这没有什么区别
有什么我们可能错过的吗?您必须显式地传递消息体吗?如果是,怎么做
编辑:
下面是我发布的行程、上下文和发送端口筛选器的屏幕截图
,,
,
非常感谢,奈杰尔。首先,我要说的是,你试图过度设计解决方案。适配器开发不是一件小事,您需要考虑各种各样的事情。开发和部署适配器被归类为平台更改,这会影响整个环境,所以如果您不熟悉,就不应该这样做。我建议你走其他路线。在这一点上,我个人对ESB内部没有足够的了解,因此无法对其进行评论。在最坏的情况下,您最好直接在业务流程(表达式或消息形状)中使用.NET代理dll,而不是构建适配器。尽管它不是推荐的方法,但我仍然觉得它比自定义适配器方法好。从语义上讲,我不明白为什么涉及WCF BasicHtpp适配器的解决方案在您的场景中不起作用。在任何情况下,我都会尝试看看WCF BasicHttp适配器会发生什么,一旦我得到一个可行的解决方案,如果真的有必要,我会切换到自定义SOAP适配器 目前,您的解决方案很奇怪,因为您的入口匝道直接连接到出口匝道。我从来没有在我的行程中看到过。您可能需要在中间创建一个中间消息传递或编排行程服务
否则,消息将有效地发布到消息框中,显然没有订阅服务器,因此您会遇到错误。我将首先尝试进入您的适配器代码,看看那里到底发生了什么,看看您是否首先获得了消息数据。感谢您的回复;我们还按照您的建议从编排中调用了代理。然而,我们仍然希望采用这种方法。是的,我同意这绝非小事:)。