Using System; Using System. Collections; Using System. IO; Using System. Net; Using System. Text; Using System. Xml; Using System. Xml. Serialization; Namespace Hishop. Plugins { /// <Summary> /// Use WebRequest/WebResponse to call WebService /// </Summary> Public class WebServiceCaller { # Region Tip: Instructions for use // WebServices should support Get and Post calls. Add the following code in web. config: // <WebServices> // <Protocols> // <Add name = "HttpGet"/> // <Add name = "HttpPost"/> /// </Protocols> // </WebServices> // Call example: // Hashtable ht = new Hashtable (); // Hashtable is the parameter set required by webservice. // Ht. Add ("str", "test "); // Ht. Add ("B", "true "); // XmlDocument xx = WebSvcCaller. QuerySoapWebService ("http: // localhost: 81/service. asmx", "HelloWorld", ht ); // MessageBox. Show (xx. OuterXml ); # Endregion /// <Summary> /// WebService is required to support Post call /// </Summary> Public static XmlDocument QueryPostWebService (String URL, String MethodName, Hashtable 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 is required to support Get call /// </Summary> Public static XmlDocument QueryGetWebService (String URL, String MethodName, Hashtable 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> /// Common WebService call (Soap). The Pars parameter is a String-type parameter name and value. /// </Summary> Public static XmlDocument QuerySoapWebService (String URL, String MethodName, Hashtable Pars) { If (_ xmlNamespaces. ContainsKey (URL )) { Return QuerySoapWebService (URL, MethodName, Pars, _ xmlNamespaces [URL]. ToString ()); } Else { Return QuerySoapWebService (URL, MethodName, Pars, GetNamespace (URL )); } } Private static XmlDocument QuerySoapWebService (String URL, String MethodName, Hashtable Pars, string XmlNs) { _ XmlNamespaces [URL] = XmlNs; // Add cache to improve efficiency HttpWebRequest request = (HttpWebRequest) HttpWebRequest. Create (URL ); Request. Method = "POST "; Request. ContentType = "text/xml; charsets = 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; } 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; } Private static byte [] EncodeParsToSoap (Hashtable Pars, String XmlNs, String MethodName) { XmlDocument doc = new XmlDocument (); Doc. loadXml ("<soap: Envelope xmlns: xsi = \" external "xmlns: xsd = \" http://www.w3.org/2001/XMLSchema\ "xmlns: soap = \" external "> </soap: envelope> "); AddDelaration (doc ); // XmlElement soapBody = doc. createElement_x_x ("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope "); XmlElement soapBody = doc. CreateElement ("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope "); // XmlElement soapMethod = doc. createElement_x_x (MethodName ); XmlElement soapMethod = doc. CreateElement (MethodName ); SoapMethod. SetAttribute ("xmlns", XmlNs ); Foreach (string k in Pars. Keys) { // XmlElement soapPar = doc. createElement_x_x (k ); 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 ); } 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> /// Set the credential and timeout /// </Summary> /// <Param name = "request"> </param> Private static void SetWebRequest (HttpWebRequest request) { Request. Credentials = CredentialCache. DefaultCredentials; Request. Timeout = 10000; } Private static void WriteRequestData (HttpWebRequest request, byte [] data) { Request. ContentLength = data. Length; Stream writer = request. GetRequestStream (); Writer. Write (data, 0, data. Length ); Writer. Close (); } Private static byte [] EncodePars (Hashtable Pars) { Return Encoding. UTF8.GetBytes (ParsToString (Pars )); } Private static String ParsToString (Hashtable 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 (); } 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; } Private static void AddDelaration (XmlDocument doc) { XmlDeclaration decl = doc. CreateXmlDeclaration ("1.0", "UTF-8", null ); Doc. InsertBefore (decl, doc. DocumentElement ); } Private static Hashtable _ xmlNamespaces = new Hashtable (); // cache xmlNamespace to avoid repeated calls to GetNamespace } } |