zoukankan      html  css  js  c++  java
  • C#动态调用webservice

    最近项目需要调用对方java写的webservice接口

    调用示例:

          //接收结果      
    XmlNode xmlNode1;
    string strSenddata = "";//这个是要发送的报文数据 Hashtable ht = new Hashtable(); ht.Add("xmlIn", strSenddata); xmlNode1 = PrintFaPiao.WebServiceCaller.QuerySoapWebService("http://testservicebus.sinosig.com/servicemgr/services/outputOtherSubject", "outputOtherSubject", ht);//接口地址,方法名,发送报文

    WebServiceCaller类:

      1 using System;
      2 using System.Collections;
      3 using System.IO;
      4 using System.Net;
      5 using System.Text;
      6 using System.Xml;
      7 using System.Xml.Serialization;
      8 namespace PrintFaPiao
      9 {
     10     /// <summary>
     11     /// 利用WebRequest/WebResponse进行WebService调用的类
     12     /// </summary>
     13     public class WebServiceCaller
     14     {
     15         #region Tip:使用说明
     16         //webServices 应该支持Get和Post调用,在web.config应该增加以下代码
     17         //<webServices>
     18         // <protocols>
     19         //  <add name="HttpGet"/>
     20         //  <add name="HttpPost"/>
     21         // </protocols>
     22         //</webServices>
     23 
     24         //调用示例:
     25         //Hashtable ht = new Hashtable(); //Hashtable 为webservice所需要的参数集
     26         //ht.Add("str", "test");
     27         //ht.Add("b", "true");
     28         //XmlDocument xx = WebSvcCaller.QuerySoapWebService("http://localhost:81/service.asmx", "HelloWorld", ht);
     29         //MessageBox.Show(xx.OuterXml);
     30         #endregion
     31 
     32         /// <summary>
     33         /// 需要WebService支持Post调用
     34         /// </summary>
     35         public static XmlDocument QueryPostWebService(String URL, String MethodName, Hashtable Pars)
     36         {
     37             HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName);
     38             request.Method = "POST";
     39             request.ContentType = "application/x-www-form-urlencoded";
     40             SetWebRequest(request);
     41             byte[] data = EncodePars(Pars);
     42             WriteRequestData(request, data);
     43             return ReadXmlResponse(request.GetResponse());
     44         }
     45 
     46         /// <summary>
     47         /// 需要WebService支持Get调用
     48         /// </summary>
     49         public static XmlDocument QueryGetWebService(String URL, String MethodName, Hashtable Pars)
     50         {
     51             HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars));
     52             request.Method = "GET";
     53             request.ContentType = "application/x-www-form-urlencoded";
     54             SetWebRequest(request);
     55             return ReadXmlResponse(request.GetResponse());
     56         }
     57 
     58         /// <summary>
     59         /// 通用WebService调用(Soap),参数Pars为String类型的参数名、参数值
     60         /// </summary>
     61         public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars)
     62         {
     63             if (_xmlNamespaces.ContainsKey(URL))
     64             {
     65                 return QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString());
     66             }
     67             else
     68             {
     69                 return QuerySoapWebService(URL, MethodName, Pars, GetNamespace(URL));
     70             }
     71         }
     72 
     73         private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars, string XmlNs)
     74         {
     75             _xmlNamespaces[URL] = XmlNs;//加入缓存,提高效率
     76             HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
     77             request.Method = "POST";
     78             request.ContentType = "text/xml; charset=UTF-8";
     79             request.Headers.Add("SOAPAction", """ + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + MethodName + """);
     80             SetWebRequest(request);
     81             byte[] data = EncodeParsToSoap(Pars, XmlNs, MethodName);
     82             WriteRequestData(request, data);
     83             XmlDocument doc = new XmlDocument(), doc2 = new XmlDocument();
     84             doc = ReadXmlResponse(request.GetResponse());
     85 
     86             XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
     87             mgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
     88             String RetXml = doc.SelectSingleNode("//soap:Body/*/*", mgr).InnerXml;
     89             doc2.LoadXml("<root>" + RetXml + "</root>");
     90             AddDelaration(doc2);
     91             return doc2;
     92         }
     93         private static string GetNamespace(String URL)
     94         {
     95             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");
     96             SetWebRequest(request);
     97             WebResponse response = request.GetResponse();
     98             StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default);
     99             XmlDocument doc = new XmlDocument();
    100             string test = sr.ReadToEnd();
    101           
    102     
    103             doc.LoadXml(test);
    104             sr.Close();
    105             return doc.SelectSingleNode("//@targetNamespace").Value;
    106         }
    107 
    108         private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName)
    109         {
    110             XmlDocument doc = new XmlDocument();
    111             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>");
    112             AddDelaration(doc);
    113             //XmlElement soapBody = doc.createElement_x_x("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
    114             XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
    115             //XmlElement soapMethod = doc.createElement_x_x(MethodName);
    116             XmlElement soapMethod = doc.CreateElement(MethodName);
    117             soapMethod.SetAttribute("xmlns", XmlNs);
    118             foreach (string k in Pars.Keys)
    119             {
    120                 //XmlElement soapPar = doc.createElement_x_x(k);
    121                 XmlElement soapPar = doc.CreateElement(k);
    122                 soapPar.InnerXml = ObjectToSoapXml(Pars[k]);
    123                 soapMethod.AppendChild(soapPar);
    124             }
    125             soapBody.AppendChild(soapMethod);
    126             doc.DocumentElement.AppendChild(soapBody);
    127             return Encoding.UTF8.GetBytes(doc.OuterXml);
    128         }
    129         private static string ObjectToSoapXml(object o)
    130         {
    131             XmlSerializer mySerializer = new XmlSerializer(o.GetType());
    132             MemoryStream ms = new MemoryStream();
    133             mySerializer.Serialize(ms, o);
    134             XmlDocument doc = new XmlDocument();
    135             doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));
    136             if (doc.DocumentElement != null)
    137             {
    138                 return doc.DocumentElement.InnerXml;
    139             }
    140             else
    141             {
    142                 return o.ToString();
    143             }
    144         }
    145 
    146         /// <summary>
    147         /// 设置凭证与超时时间
    148         /// </summary>
    149         /// <param name="request"></param>
    150         private static void SetWebRequest(HttpWebRequest request)
    151         {
    152             request.Credentials = CredentialCache.DefaultCredentials;
    153             request.Timeout = 10000;
    154         }
    155 
    156         private static void WriteRequestData(HttpWebRequest request, byte[] data)
    157         {
    158             request.ContentLength = data.Length;
    159             Stream writer = request.GetRequestStream();
    160             writer.Write(data, 0, data.Length);
    161             writer.Close();
    162         }
    163 
    164         private static byte[] EncodePars(Hashtable Pars)
    165         {
    166             return Encoding.UTF8.GetBytes(ParsToString(Pars));
    167         }
    168 
    169         private static String ParsToString(Hashtable Pars)
    170         {
    171             StringBuilder sb = new StringBuilder();
    172             foreach (string k in Pars.Keys)
    173             {
    174                 if (sb.Length > 0)
    175                 {
    176                     sb.Append("&");
    177                 }
    178                 //sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(Pars[k].ToString()));
    179             }
    180             return sb.ToString();
    181         }
    182 
    183         private static XmlDocument ReadXmlResponse(WebResponse response)
    184         {
    185             StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
    186             String retXml = sr.ReadToEnd();
    187             sr.Close();
    188             XmlDocument doc = new XmlDocument();
    189             doc.LoadXml(retXml);
    190             return doc;
    191         }
    192 
    193         private static void AddDelaration(XmlDocument doc)
    194         {
    195             XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);
    196             doc.InsertBefore(decl, doc.DocumentElement);
    197         }
    198 
    199         private static Hashtable _xmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调用GetNamespace
    200     }
    201 }
    View Code

    如果遇到xml转换错误,可能是编码问题,更改下请求的编码格式或者更改下接收的编码格式(上面例子中开始用utf-8接收结果转换xml的时候提示缺少根元素,于是改成默认编码后编译成功)

    代码引用:https://www.cnblogs.com/zpx1986/p/5584370.html

  • 相关阅读:
    linux系统调用是通过软中断实现的吗
    Linux系统调用怎么和内核或底层驱动交互的
    strace命令
    linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解
    C语言string.h常用函数总结
    shall的过去式和should怎么区分
    P(Y|X) 和 P(X,Y)
    Sourceinsight最佳配色方案及颜色字体调整方法
    float 为什么可以表示很大的整数
    协方差矩阵
  • 原文地址:https://www.cnblogs.com/xuxiaoshuan/p/10026526.html
Copyright © 2011-2022 走看看