c# Sosp协议 利用WebRequest/WebResponse调用 WebService

新建类:WebServiceCaller

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

调用方法:

Hashtable ht = new Hashtable();  //Hashtable 为webservice所需要的参数集
ht.Add("param", "<userInfo><Name>23</Name><Sex>1</Sex><IDNumber>323</IDNumber></userInfo>");
XmlDocument xx = WebServiceCaller.QuerySoapWebService("http://localhost:8080/server/PatientService.asmx", "AddUser", ht);
return xx.OuterXml;

 

posted @ 2017-11-23 16:13  炮跑灰  阅读(1190)  评论(0编辑  收藏  举报