WF从入门到精通(第十八章):在你的工作流中调用Web服务2010-06-03 cnblogs GuoYong.Che学习完本章,你将掌握:1.在你的工作流中调用web服务2.添加和配置web服务代理3.在你的工作流中进行会话(sessions)管理拿我来说,一些基于网络进行数据的发送和接收的事情很吸引我,由此多年以来我很喜欢写基于通信的代码。当我看到wf内置了连接web服务和作为web服务的能力时,我就更深入地对其进行了研究。wf集成了几个基于xml web服务的活动,我们将在本章调查客户端(client)一侧的活动。(在最后一章“把工作流作为web服务”中我们将讨论服务器一侧的活动)。在实际使用invokewebservice活动之前,我认为我应该描述一下web服务是怎样工作的,因为在本章以及最后一章中我们需要去理解该术语。web服务架构一个观点是任何基于internet的根据你的请求来执行任务的服务器就是一个web服务。但是,在本章以及下一章我将用这个术语来和一个更为精确的解释作对比。这里,我将提到xml web服务,它是一个基于soap协议的服务。备注:“soap”来源于simple object access protocol(简单对象访问协议)的首字母缩写,它是一个基于xml的通信框架。但是,在当前soap的正式发行版本中,该协议就被简单地称为soap协议。你能在http://www.w3.org/tr/soap/找到最新的soap规范。促使创建soap协议的基本的想法是意图能把原有的数据类型甚至是复杂的数据结构从原来的二进制格式转换到xml中,然后该xml就能在internet之上发送,就像通过使用html发送网页一样。起初的soap规范清晰地勾勒了“序列化格式(serialization format)”来对整数、字符串、枚举到数组和复杂结构的描述。后来的规范随着序列化描述语言(serialization descripton languages)的出现而对序列化格式进行了放宽。当前,选择的序列化描述语言是web服务描述语言(web service description language),或者称作wsdl。wsdl可让你的soap消息以你认为合适的内容进行格式化。在wsdl格式中你可以简单方便地对内容进行描述并把你的wsdl提供给用户,因此,使用你的服务,从中它们能对你的web服务输出的结构和方法进行解释。虽然原来的soap规范想把soap用在远程方法调用方面,但是最新的规范加上了wsdl,允许用在更多的基于消息的架构中,消息的内容可以是你能序列化进xml中的任何东西。因此,当你引用一个远程的web服务的时候,你将下载并解释该服务为你提供的wsdl。当你使用.net的时候,.net framework内置的工具会为你做这些解释工作并为你创建一个c#类,你能使用该类去调用远程服务的方法。这个c#类被称作代理(proxy),因为它的行为是替换真正的服务。最终,除了通信延迟,你的软件甚至不会知道它实际上是在和一个internent上的服务通信。该代理(proxy)使它看起来仿佛该服务就在你的本地计算机上。再回顾一下,你可以引用一个web服务,届时它会把它的wsdl发送给你。.net为你创建一个代理,你能使用它根据远程服务器的规范(按照它的wsdl)去和远程服务器进行通信。当你进行通信的时候,你发送的数据会被转换到xml中并在(通信)线路上使用soap协议进行发送。远程服务器对你的请求和响应进行解释。当你接收到服务器的响应时,响应的xml会被转化回你的代码所要使用的二进制数据。备注:对你来说,继续讨论web服务以及它们是如何执行的来说将是非常容易的,但是我们真正需要的是继续深入并把它迁移进工作流中。但是,假如你想学习更多东西的话,这方面知识的许多的书籍和在线的参考文献都是可以得到的。一个很不错的起点是:http://msdn.microsoft.com/webservices/。使用invokewebservice活动wf内置的面向客户端的xml web服务支持来源于invokewebservice活动。在许多方面,invokewebservice活动仅仅是你的一个代理,但是它新增了使用一个单一的session cookie来控制多个调用的能力。在使用invokewebservice活动的时候会需要用到一些关键的属性,它们如表18-1所示。表18-1 invodewebservice活动的一些关键属性
属性 | 功能 |
methodname | 获取或设置在执行活动时所要调用的方法。这个属性代表了你想调用的远程方法的方法名称。 |
proxyclass | 获取或设置代理类的类型名称。你既可以亲自提供它也可以在你拖拽该活动到你的工作流的时候通过创建一个代理类来让wf帮你提供。 |
sessionid | 获取或设置要被使用的session。你可以使用这个机制来把不同的xml web服务调用全部都捆在一起。我将在“带会话(session)协同工作”一节中更进一步地讨论这个属性。 |
url | 获取或设置要用来和xml web服务进行通信的url。尽管你能容易地使用属性面板来为你的invokewebservice活动对它进行修改,但实际上该url本身被保存在你工作流项目的设置属性包(settings property bag)中。 |