Webservice一般是先开发服务,发布wsdl后由客户端调用,但也有先有标准的wsdl文件,反过来开发服务的情况。为了保证开发的服务和wsdl一样,可以把往wsdl生成服务端代码,实现其中方法,再发布服务。
VS提供了一个命令,可以将wsdl生成服务端或客户端代码。打开:开始-所有程序-Microsoft Visual Studio2008-Visual Studio Tools-Visual Studio 2008命令提示
执行 wsdl /?,可以看到wsdl的说明,默认生成语言是CS,也可以设置VB、JS、CPP等;默认生成是客户端代码,也可生成服务端的抽象类或接口。
如wsdl d:\Hello.wsdl /server /out:d:\HelloServer.cs
生成Hello.wsdl服务端代码的抽象类,稍加修改并实现其中内容即可发布。
我遇到的问题
在开发过程中,我拿到的wsdl是由Java用endpoint发布的,我重新生成C#服务端代码再发布服务,得到的wsdl比不完全一样
本以为也没什么事,然而java那边调用我的时候,说我的wsdl里<service>节点的<port>里没有name=HelloHttpSoap11EndPoint的端口。
我注意了一下,标准的wsdl里有HelloHttpSoap11EndPoint(soap11)、HelloHttpSoap12EndPoint(soap12)和HelloHttpEndPoint,而我的wsdl里只有HelloSoap11(soap11)和HelloSoap12(soap12)两个端口
对方说,他必须按照端口名称才能调用到服务,我也不太清楚他那边java是怎么调用的,总之我自己发布的wsdl和标准的不一样,我也没办法,弄了整整一天,终于把这个问题大致解决好了,对,是大致!
将WebServiceBindingAttribute的name改成HelloHttpSoap11EndPoint(或者添加一个WebServiceBindingAttribute)
然后在所有函数说明的SoapDocumentMethodAttribute中,添加Binding=“HelloHttpSoap11EndPoint”,把方法绑定到端口上去。
如果你把所有方法都Binding=“HelloHttpSoap11EndPoint”,那发布的wsdl里就只有HelloHttpSoap11EndPoint(soap11)和HelloHttpSoap11EndPoint1(soap12)两个端口,如果不是所有方法都Binding=“HelloHttpSoap11EndPoint”,那还会有原来的HelloSoap11和HelloSoap12端口
至此为止,我已经无能为力了,soap11的端口名称对了,soap12端口名称是自己生成的,和标准的还是不一样,到现在也不知道怎么改。总之现在我们都用soap1.1协议,所以暂时没有问题。期待高手帮忙解答。
-------------------------------------------------------------------------------------------
以下为例子:
E:\projects>wsdl /out:.\WebService.cs /protocol:SOAP /n:命名空间 .\DrugStore_xxx.wsdl