曾经做好几个项目,由于考虑不同的平台,所以基本上都是基于Webservice(SOAP协议)来实现,服务器一般是使用Java来实现。本文只要说明C#的Webservice代理的使用及代理代码的生成。
由于项目算是比较大的,服务接口比较多,所以Webservice发布层都是有多个Url的,这种情况使用VS提供的WSDL生成工具好像就出现问题了,实体类代码和通信类(操作方法)代码都是放到一个文件里面了,如果Webservice发布时没有手动指定命名空间时,还会涉及到命名空间的问题,即实体类的属性完全相同,也会报命名空间的错误。所以在调用方,出现了同一实体,多处命名的问题。还有命名规范问题,如果发布方没有指定发布时的名称(如:实体中的属性,类名等),Java的Webservice发布工具默认是小写的,所以和C#通常为大写的做法不符,影响可读性。
具体做法:把WSDL生成的代理类的有关的实体手动分离出来,并把每个实体类的有关的命名空间注释去。(如果是同一个团队开发,可以按照指定的要求一起遵守,但如果是不同公司,一般来说都是调用方自己想办法解决了),把所有实体类放到同一个程序集里(有很多相同的可以保留一份),这样,我们基本上可以做实体做了统一管理,基本上可以使整个程序运行正常了。
维护成本:这些手动的工作的维护成本是相当大的,只要服务器每更改一次实体和操作方法(指要通过Webservice发布的方法),调用方必须得同步更新代理的代码,又得重新手动分离实体等,这种手动工作,往往带有很多隐性的错误,导致调试的时间增长,稳定度降低。
为了解决以上问题,本人牺牲了个人的休息时间,基于WSDL.exe上写了一个C#代理生成工具《Webservice代理生成工具》,从生成到代码导出,不需要更改一点代码,特别是在项目开发的初期,带来的效率和速度是不可比拟的。
本工具的