最近工作需要向第三方提供一个WebService服务,坑爹的是第三方背景牛X,我方提供的服务必须完全遵照其客户端方预先定义好了的接口,一个符号都不允许修改。
.net平台编写的WebService由于是根据微软的标准,所以在wsdl方法名上面加上了特定的后缀,如<wsdl:port name="Service1Soap" binding="tns:Service1Soap"> 其中Soap就是默认加入的。为了完全适应调用方,这种默认方式显然是不行的,网上、网下研究了半天,最终采用了扩展SoapExtensionReflector类的方法来截获WSDL的最终生成。其方法如下:
自定义一个继承自SoapExtensionReflector的类,重载ReflectDescription方法,在这个方法中对WSDL进行特定干预,基本上是想干啥就干啥,呵呵。
using System; using System.Collections.Generic; using System.Web; using System.Web.Services.Description; using System.Xml.Serialization; using System.Xml.Schema; using System.Xml; public class WSDLReflector : SoapExtensionReflector { /// <summary> /// ws方法不做修改 /// </summary> public override void ReflectMethod() { } /// <summary> /// 继承修改描述方法 /// </summary> public override void ReflectDescription() { ServiceDescription description = ReflectionContext.ServiceDescription; foreach (Service service in description.Services) { foreach (Port port in service.Ports) { port.Name = port.Name.Replace("uaService", "uaWebService"); } } } }
此类根据自己的实际需要编写完毕后,需要在项目Web.confing设置节点,才能应用,节点设置如下:
<system.web> <webServices> <!--处理WSDL标签修改--> <soapExtensionReflectorTypes> <!--<add type ="DUS.Pub.Ws.WSDLReflector,DUS.Pub"/>--> <add type ="AppManager.Code.WSDLReflector,AppManager"/> </soapExtensionReflectorTypes> </webServices> </system.web>
至此编译生成,本项目生成的WebService服务WSDL即可实现自定义了。
转载请注明出处:
未经允许不得转载:lxfamn » .net自定义WebService WSDL