程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> webservice 偽靜態地址處理,數據獲取

webservice 偽靜態地址處理,數據獲取

編輯:C#入門知識

 服務處理端: 
[csharp] 
public class UvService 
    { 
        //<webServices> 
        //  <protocols> 
        //    <add name="HttpGet"/> 
        //    <add name="HttpPost"/> 
        //  </protocols> 
        //</webServices> 
 
        private static Hashtable _xmlNamespaces = new Hashtable();//緩存xmlNamespace,避免重復調用GetNamespace 
 
        /**/ 
        /// <summary> 
        /// 需要WebService支持Post調用 
        /// </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支持Get調用 
        /// </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> 
        /// 通用WebService調用(Soap),參數Pars為String類型的參數名、參數值 
        /// </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;//加入緩存,提高效率 
        //    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; 
        //} 
 
 
        private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable 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; 
        } 
 
        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=\"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); 
 
 
            //<Request><Date>2011-03-20</Date></Request> 
            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); 
        } 
        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.CreateElement("") 
            doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray())); 
            if (doc.DocumentElement != null) 
            { 
                return doc.DocumentElement.InnerXml; 
            } 
            else 
            { 
                return o.ToString(); 
            } 
        } 
        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); 
        } 
    } 
 

 調用端:
         
[csharp]
Hashtable pars = new Hashtable(); 
if (Url == string.Empty) 
    return; 
pars["pInput"] = string.Format("<Request><Date>{0}</Date></Request>", DateTime.Now.ToString("yyyy-MM-dd")); 
XmlDocument doc = UvService.QuerySoapWebService(Url, "OperationScheduleQuery", pars); 
string str = doc.InnerXml; 
str = str.Split(new string[] { "[CDATA[" }, StringSplitOptions.None)[1]; 
str = str.Split(new string[] { "]]" }, StringSplitOptions.None)[0]; 
XmlDocument doc2 = new XmlDocument(); 
doc2.LoadXml(str); 
DataSet dataset = new DataSet(); 
using (XmlNodeReader reader = new XmlNodeReader(doc2)) 

    dataset.ReadXml(reader); 
    reader.Close(); 

if (dataset != null) 

    this.dsMain.Merge(dataset); 


作者:loveandangle

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved