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;