.net自定义WebService WSDL

最近工作需要向第三方提供一个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即可实现自定义了。

原文地址:https://www.cnblogs.com/adu1218/p/3230450.html