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