积极答复者
Biztalk Orchestration中如何对webservices进行异步调用

问题
答案
-
tutorial3中的异步方式就是Secle说的方式,“ReceiveASN_Port”和“ReceiveInvoice_Port”这两个Port其实是这个orchestration对外发布的web services。文档里注释是是写着“This code was generated by a tool. “,其实在tutorail中的每一操作步骤显示是用发布web services向导做的。“tutorial3中应该使用发布web services向导生成web services,但是实例中并没有使用用向导生成的web services。
示例中有两个orchestration的接收端口需要发布为web services,ReceiveASN_Port和ReceiveInvoice_Port,文档中也在步骤四用web services发布向导生成了对应这两个端口的web services,但是在实际中并没有使用向导生成的web services,而是使用了预先准备好的预先生成好的web services,这个web services放在路径“C:\tutorial\Solutions\B2BSolution\B2BOrchestrations_webservice”中,并在tutorial 2 中“步骤4: 设置供货商的Web Service中”配置到IIS的http://localhost/B2BOrchestrations_webservice虚拟目录下。而用web services发布向导生成了web services的url是 http://localhost/B2BOrchestrations_Proxy
所以文档中在web services的最后一步,没有设置给应用程序生成相应的接收位置,而是在biztalk管理器中手工新建接收位置以对应到http://localhost/B2BOrchestrations_webservice。
就因为使用了在别的机器上预先生成的web services,所以才有了“第二步:更新token”。因为是在别的机器用向导做的web services,在生成web services时要引用包含orchestration的assembly,assembly有自己的token,所以它需要把每个试验者给assembly生成的token替换它预先生成的web services中使用的token。如果使用自己用向导生成的web services,引用的assembly就是要使用的那个assembly,就没必要更新token,这一步是不必要的一步。这一点文档上没有说明这一点,很容易产生误导。”
全部回复
-
biztalk是没有直接支持web services的异步调用,可以采用变通方法,楼上Secle版主提出了一个方案,还有一个方案可以参考,使用self Correlating来实现,如下图:
-
使用start orchestration形状启动一个子流程,同时把实际要调用web services的消息作为参数传给子流程
-
子流程的作用就是调用一个web services,然后把结果返回到主流程
-
主流程接收子流程返回的接收端口设置为Self Correlating的直接绑定的接收端口
-
主流程跟子流程之间是异步的关系,主流程启动子流程后继续运行,直到遇到等待接收子流程返回的接收形状。
关于自相关的内容可以参考 深入biztalk中各种端口绑定方式(六)-- 直接绑定之Self Correlating -
-
谢谢两位指点!
后来,我还发现一种异步调用的方法,在Biztalk 附带的tutorial3中,流程图如下:
在Send_CommonPO中调用webservices,这个是One-Way的调用,然后可以中该webservices进行业务逻辑或数据处理,
然后再在该webservices中分别调用“ReceiveASN_Port”和“ReceiveInvoice_Port”这两个Port所“指向”(绑定)的webservices——通过“Correlation Set”来接收消息。
但我不清楚“ReceiveASN_Port”和“ReceiveInvoice_Port”这两个Port所“指向”(绑定)的webservices是如何生成的?我找到webservices的源代码,上面注释是是写着“This code was generated by a tool. .... Generated by "Microsoft.BizTalk.WebServices, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"”是用什么工具生成呢? Any Idea?
-
tutorial3中的异步方式就是Secle说的方式,“ReceiveASN_Port”和“ReceiveInvoice_Port”这两个Port其实是这个orchestration对外发布的web services。文档里注释是是写着“This code was generated by a tool. “,其实在tutorail中的每一操作步骤显示是用发布web services向导做的。“tutorial3中应该使用发布web services向导生成web services,但是实例中并没有使用用向导生成的web services。
示例中有两个orchestration的接收端口需要发布为web services,ReceiveASN_Port和ReceiveInvoice_Port,文档中也在步骤四用web services发布向导生成了对应这两个端口的web services,但是在实际中并没有使用向导生成的web services,而是使用了预先准备好的预先生成好的web services,这个web services放在路径“C:\tutorial\Solutions\B2BSolution\B2BOrchestrations_webservice”中,并在tutorial 2 中“步骤4: 设置供货商的Web Service中”配置到IIS的http://localhost/B2BOrchestrations_webservice虚拟目录下。而用web services发布向导生成了web services的url是 http://localhost/B2BOrchestrations_Proxy
所以文档中在web services的最后一步,没有设置给应用程序生成相应的接收位置,而是在biztalk管理器中手工新建接收位置以对应到http://localhost/B2BOrchestrations_webservice。
就因为使用了在别的机器上预先生成的web services,所以才有了“第二步:更新token”。因为是在别的机器用向导做的web services,在生成web services时要引用包含orchestration的assembly,assembly有自己的token,所以它需要把每个试验者给assembly生成的token替换它预先生成的web services中使用的token。如果使用自己用向导生成的web services,引用的assembly就是要使用的那个assembly,就没必要更新token,这一步是不必要的一步。这一点文档上没有说明这一点,很容易产生误导。”