利用WebRequest/WebResponse/Soap进行WebService调用的类

首先定义一个工具类:

/// <summary>
///  利用WebRequest/WebResponse/Soap进行WebService调用的类
/// </summary>
public class WebServiceHelper
{
    //<webServices>
    //  <protocols>
    //    <add name="Get"/>
    //    <add name="Post"/>
    //    <add name="Soap"/>
    //  </protocols>
    //</webServices>
    //缓存xmlNamespace,避免重复调用GetNamespace
    private static Dictionary<object,object> _xmlNamespaces = new Dictionary<object, object>();

    /// <summary>
    /// 需要WebService支持Post调用
    /// </summary>
    public static XmlDocument QueryPostWebService(string url, string methodName, Dictionary<object, object> pars)
    {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url + "/" + methodName);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        SetWebRequest(request);
        byte[] data = EncodePars(pars);
        WriteRequestData(request, data);
        return ReadXmlResponse(request.GetResponse());
    }

    /// <summary>
    /// 需要WebService支持Get调用
    /// </summary>
    public static XmlDocument QueryGetWebService(string url, string methodName, Dictionary<object, object> pars)
    {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url + "/" + methodName + "?" + ParsToString(pars));
        request.Method = "GET";
        request.ContentType = "application/x-www-form-urlencoded";
        SetWebRequest(request);
        return ReadXmlResponse(request.GetResponse());
    }


    /// <summary>
    /// 通用WebService调用(Soap),参数pars为string类型的参数名、参数值
    /// </summary>
    public static XmlDocument QuerySoapWebService(string url, string methodName, Dictionary<object,object> pars)
    {
        if (_xmlNamespaces.ContainsKey(url))
        {
            return QuerySoapWebService(url, methodName, pars, _xmlNamespaces[url].ToString());
        }
        else
        {
            return QuerySoapWebService(url, methodName, pars, GetNamespace(url));
        }
    }

    /// <summary>
    /// 通用WebService调用(Soap)
    /// </summary>
    /// <param name="url"></param>
    /// <param name="methodName"></param>
    /// <param name="pars"></param>
    /// <param name="xmlNs"></param>
    /// <returns></returns>
    private static XmlDocument QuerySoapWebService(string url, string methodName, Dictionary<object, object> pars, string xmlNs)
    {
        _xmlNamespaces[url] = xmlNs;//加入缓存,提高效率
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        request.Method = "POST";
        request.ContentType = "text/xml; charset=utf-8";
        request.Headers.Add("SOAPAction", "\"" + xmlNs + (xmlNs.EndsWith("/") ? "" : "/") + methodName + "\"");
        SetWebRequest(request);
        byte[] data = EncodeParsToSoap(pars, xmlNs, methodName);
        WriteRequestData(request, data);
        XmlDocument doc = new XmlDocument(), doc2 = new XmlDocument();
        doc = ReadXmlResponse(request.GetResponse());
        XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
        mgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
        string RetXml = doc.SelectSingleNode("//soap:Body/*/*", mgr).InnerXml;
        doc2.LoadXml("<root>" + RetXml + "</root>");
        AddDelaration(doc2);
        return doc2;
    }

    /// <summary>
    /// 通过WebService的WSDL获取XML名称空间
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    private static string GetNamespace(string url)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "?WSDL");
        SetWebRequest(request);
        WebResponse response = request.GetResponse();
        StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(sr.ReadToEnd());
        sr.Close();
        return doc.SelectSingleNode("//@targetNamespace").Value;
    }

    /// <summary>
    /// 动态生成SOP请求报文内容
    /// </summary>
    /// <param name="pars"></param>
    /// <param name="xmlNs"></param>
    /// <param name="methodName"></param>
    /// <returns></returns>
    private static byte[] EncodeParsToSoap(Dictionary<object, object> pars, string xmlNs, string methodName)
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"></soap:Envelope>");
        AddDelaration(doc);
        XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
        XmlElement soapMethod = doc.CreateElement(methodName);
        soapMethod.SetAttribute("xmlns", xmlNs);
        foreach (string k in pars.Keys)
        {
            XmlElement soapPar = doc.CreateElement(k);
            soapPar.InnerXml = ObjectToSoapXml(pars[k]);
            soapMethod.AppendChild(soapPar);
        }
        soapBody.AppendChild(soapMethod);
        doc.DocumentElement.AppendChild(soapBody);
        return Encoding.UTF8.GetBytes(doc.OuterXml);
    }

    /// <summary>
    /// 将对象转换成XML节点格式
    /// </summary>
    /// <param name="o"></param>
    /// <returns></returns>
    private static string ObjectToSoapXml(object o)
    {
        XmlSerializer mySerializer = new XmlSerializer(o.GetType());
        MemoryStream ms = new MemoryStream();
        mySerializer.Serialize(ms, o);
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));
        if (doc.DocumentElement != null)
        {
            return doc.DocumentElement.InnerXml;
        }
        else
        {
            return o.ToString();
        }
    }

    /// <summary>
    /// 设置WEB请求
    /// </summary>
    /// <param name="request"></param>
    private static void SetWebRequest(HttpWebRequest request)
    {
        request.Credentials = CredentialCache.DefaultCredentials;
        request.Timeout = 10000;
    }

    /// <summary>
    /// 设置请求数据
    /// </summary>
    /// <param name="request"></param>
    /// <param name="data"></param>
    private static void WriteRequestData(HttpWebRequest request, byte[] data)
    {
        request.ContentLength = data.Length;
        Stream writer = request.GetRequestStream();
        writer.Write(data, 0, data.Length);
        writer.Close();
    }

    /// <summary>
    /// 获取字符串的UTF8码字符串
    /// </summary>
    /// <param name="pars"></param>
    /// <returns></returns>
    private static byte[] EncodePars(Dictionary<object, object> pars)
    {
        return Encoding.UTF8.GetBytes(ParsToString(pars));
    }

    /// <summary>
    /// 将Hashtable转换成WEB请求键值对字符串
    /// </summary>
    /// <param name="pars"></param>
    /// <returns></returns>
    private static string ParsToString(Dictionary<object, object> pars)
    {
        StringBuilder sb = new StringBuilder();
        foreach (string k in pars.Keys)
        {
            if (sb.Length > 0)
            {
                sb.Append("&");
            }
            sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(pars[k].ToString()));
        }
        return sb.ToString();
    }

    /// <summary>
    /// 获取Webservice响应报文XML
    /// </summary>
    /// <param name="response"></param>
    /// <returns></returns>
    private static XmlDocument ReadXmlResponse(WebResponse response)
    {
        StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
        string retXml = sr.ReadToEnd();
        sr.Close();
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(retXml);
        return doc;
    }

    /// <summary>
    /// 设置XML文档版本声明
    /// </summary>
    /// <param name="doc"></param>
    private static void AddDelaration(XmlDocument doc)
    {
        XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);
        doc.InsertBefore(decl, doc.DocumentElement);
    }
}

 

服务代码:

        [WebMethod]
        public string HelloWorld(string key)
        {
            var list = new List<Users>();
            list.Add(new Users
            {
                Name = "张三",
                Code = "001"
            });
            list.Add(new Users
            {
                Name = "李四",
                Code = "002"
            });
            
            if(!string.IsNullOrEmpty(key))
            {
                list = list.Where(x => x.Name.Contains(key)).ToList();
            }

            return Newtonsoft.Json.JsonConvert.SerializeObject(list);
        }

调用示例:

            //构造soap请求信息
            //服务地址
            var url = "http://localhost:8077/TestWebService.asmx";
            //调用方法名
            const string methodName = "HelloWorld";
            //构建参数对象
            var hab = new Dictionary<object, object>();
            hab.Add("key", "");

            //通过Soap调用
            var xmlDoc = WebServiceHelper.QuerySoapWebService(url, methodName, hab);

            //获取返回数据
            var result = xmlDoc.InnerText;

返回结果如下:

转载地址:http://www.cnblogs.com/zuowj/p/4267585.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值