当你写好了一个web services,肯定会需要一个客户端(调用端)来调用它,以检查运行是否正常。在visual studio.net中你可以直接点击“运行”按钮,系统会自动生成一个web services的测试页来调用web method,虽然很方便,但这个测试页是通过http/get协议将参数加在url后面传给web method的,这种调用方式(http/post也一样)只适合比较简单的web services,比如:传进来的参数是简单类型的,或者soap请求中不含soap消息头等等。
如果我们的web services应用了一些比较复杂的功能,例如:请求参数为get和post协议都不能编码的复杂类型,应用了定制的soap消息编码格式(soap encoding),使用了soap扩展等等。这个时候就需要使用wsdl的soap绑定,通过soap协议进行消息编码来进行调用,也就是说我们得自己去专门为这个web services写一个客户端。其中很重要的一点就是如果web services客户端要使用soap进行调用,客户端的代理类必须从 soaphttpclientprotocol 类派生,而vs.net自动生成的测试页的代理类是从httpgetclientprotocol类派生的。当然vs.net也能比较方便的编写客户端,而且你根本不必去理会代理类,因为这是自动生成的,你要做的就是像在本地一样调用web method。
但问题又来了,如果你想直接编辑客户端发送的soap请求消息并查看接收到的响应消息时,在vs.net里的实现就比较麻烦了,还得编一个soap扩展,这样一来工作量可就大了。好在microsoft发布了.net webservice studio(wss),它是用来对web services进行交互性测试的一个万能的工具。wss是一个很小(116k)的windows form应用程序,它结合了gotdotnet网站早期的wsdl verification和wsdl browser工具的特点,并增加了一个直观的用户界面,目前版本号为1.0。
下面我就按照对一个web services的方法的调用步骤来讲解一下这个软件的使用:
首先,在wsdl endpoint文本框中输入一个有效的asmx或wsdl文件的url,你也可以通过browse wsdl按钮打开一个本地的wsdl文件。然后在文本框中回车,wss就下载wsdl(如果文本框中是asmx文件就生成它的wsdl),自动为该web services生成并编译一个客户端代理,整个过程可在massages面板中看到。最后在invoke面板中显示出一个包括该web services所有方法的树状视图。同时你可以在wsdl & proxy面板中看到由这个工具自动生成的wsdl文件和其链接的xml文档定义schema、客户端代理类(proxy)、客户端调用代码(clientcode)的详细内容。在proxy代码中我们可以清楚地看到代理类继承自soaphttpclientprotocol,因此这个工具毫无疑问是基于soap协议对web sevices进行调用,这样我们就可以使用与soap相关的各种功能。
再来看看invoke面板,点击一个web方法,右边的input框中会马上按照soap消息的结构以树形方式显示出调用这个方法所需的参数和其结构;在某个参数上点击一下,对应input的value框中也会马上显示出这个参数的类型信息,并且可以直接填入这个参数的值或指定其值为空,参数都填好后就可以通过invoke按钮进行调用了。调用结束后,output框中也会按照与input框一样的方式显示这个方法调用返回的结果和其数据结构,并且同样能显示出返回结果的数据类型和值。
让人兴奋的是,在input和output框中可以直接编辑消息头中的元素,这在测试要求提供消息头的web sevices时是十分必要的。如果要使用消息头(当然,前提是wsdl里做了相关约定),在消息头里的某个头元素上点击一下,对应的value框中会显示出相关的类型信息,然后将isnull设置为false,这时头元素前面就多了个加号,展开它就可以看到其下的参数,按上面讲过的方法可以设置头元素的参数的值。设置好各参数后,就可以调用需要消息头的web sevices了。真是方便至极呀!
最后就该介绍request/response了,这个面板主要显示的是利用wss这个工具调用远程方法时生成的请求消息和接收到的响应消息的内容。当你在invoke面板中调用了一个方法之后,就可以在request和response框里看到原始的请求消息和响应消息,而且可以直接对soap请求消息进行修改,比如修改某元素的值或属性等等,然后按send重新调用就可以看到结果,这对于深入理解soap消息有很大的帮助。在该面板的左边还可以设置发送请求的属性(get/post)、基本认证的用户名和密码、是否使用cookie等,以便用更灵活的方式调用web services。
如果你在局域网中用vs.net进行过web services相关的开发,可能会发现通过web引用只能添加局域网内的web services,而对internet上提供的服务的却无能为力(这个问题可以通过编码的方式对客户端代理类的http代理属性进行设置来解决),这是因为绝大部分web services都是通过http协议进行调用,而局域网的http代理服务器需要对外部的访问请求进行认证。正因为vs.net中对于web引用没有代理设置机制才会导致上述问题。所以,必须填入正确的验证信息(例如用户名和密码等)才能使绑定了http协议的soap请求消息跨越防火墙到达服务端。在这一点上wss又一次很好的简化了繁琐的步骤。
打开edit菜单的options,在wsdlsettings项中可以设置代理服务器的域、用户名、密码,这样就可以方便地在局域网中直接调用internet上的web services了,够简单吧!同时你还可以选择除soap外的其它的数据编码方式(http/get、http/post)和自动生成的代码的语言(c#、vb.net、js)以及soap消息内容的显示风格等。
当然遗憾还是有的,比如缺乏对数据集dateset的支持、不能通过uddi进行web services查询等,但愿这些问题能在下一版中得到解决和完善。但瑕不掩瑜,wss会给你带来一种绝对不一样的感受,只要你愿意,甚至可以直接把它当成所有web services的客户端,快来尽情享受web services的乐趣吧!