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

为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适配器的选项 我们这样做有很好的理由,别担心 在此基础上,我们实现了一个自定义适配器提供程序,但在使其工作时遇到了问题 我们遵循一个(旧)示例,如下

使用BizTalk ESB Toolkit 2.0

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

我们这样做有很好的理由,别担心

在此基础上,我们实现了一个自定义适配器提供程序,但在使其工作时遇到了问题

我们遵循一个(旧)示例,如下所示:

自定义适配器提供程序继承自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);
并将传输类型设置为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适配器

目前,您的解决方案很奇怪,因为您的入口匝道直接连接到出口匝道。我从来没有在我的行程中看到过。您可能需要在中间创建一个中间消息传递或编排行程服务


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

我将首先尝试进入您的适配器代码,看看那里到底发生了什么,看看您是否首先获得了消息数据。感谢您的回复;我们还按照您的建议从编排中调用了代理。然而,我们仍然希望采用这种方法。是的,我同意这绝非小事:)。