using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Web; using System.Xml; using System.Xml.Serialization; using Newtonsoft.Json; using HZQR.Common; namespace Personnel.WebSite.Shanxi { /// /// 利用WebRequest/WebResponse进行WebService调用的类 /// public class WebServiceCaller { #region Tip:使用说明 //webServices 应该支持Get和Post调用,在web.config应该增加以下代码 // // // // // // //调用示例: //Hashtable ht = new Hashtable(); //Hashtable 为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 /// /// 需要WebService支持Post调用 /// 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()); } /// /// 需要WebService支持Get调用 /// 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()); } /// /// 通用WebService调用(Soap),参数Pars为String类型的参数名、参数值 /// 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, false)); } } private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars, string XmlNs) { LogUtil.WriteLog(null, "JSPSoap接口命名空间:" + XmlNs + ",MethodName:" + MethodName, "同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd")); _xmlNamespaces[URL] = XmlNs;//加入缓存,提高效率 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL); request.ServicePoint.Expect100Continue = false; request.Method = "POST"; request.ContentType = "application/soap+xml;charset=UTF-8"; request.Credentials = CredentialCache.DefaultCredentials; 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(); LogUtil.WriteLog(null, "RequestData:" + JsonConvert.SerializeObject(request), "同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd")); doc = ReadXmlResponse(request.GetResponse()); LogUtil.WriteLog(null, "JSPSoap接口返回值:" + doc.OuterXml, "同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd")); return doc; } private static string GetNamespace(String URL) { return GetNamespace(URL, true); } private static string GetNamespace(String URL, bool expect100Continue) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create( URL.ToLower().Contains("?wsdl") ? URL : URL + "?WSDL"); request.ServicePoint.Expect100Continue = expect100Continue; request.Method = "GET"; request.ContentType = "application/x-www-form-urlencoded"; 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(""); AddDelaration(doc); XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/"); XmlElement soapMethod = doc.CreateElement(MethodName); soapMethod.SetAttribute("xmlns", XmlNs); 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.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 = System.Security.SecurityElement.Escape(sr.ReadToEnd()); LogUtil.WriteLog(null, "retXml转译前:" + retXml, "同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd")); retXml = HTMLDeCode(retXml); retXml = HTMLDeCode(retXml); LogUtil.WriteLog(null, "retXml转译后:" + retXml, "同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd")); sr.Close(); XmlDocument doc = new XmlDocument(); int startIndex = retXml.IndexOf("") + 9; int endIndex = retXml.IndexOf(""); retXml = retXml.Substring(startIndex, endIndex - startIndex); LogUtil.WriteLog(null, "retXml:" + retXml, "同步用户信息" + DateTime.Now.ToString("yyyy-MM-dd")); 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); } //缓存xmlNamespace,避免重复调用GetNamespace private static Hashtable _xmlNamespaces = new Hashtable(); /// /// HTMLs the de code. /// /// The HTML. /// public static string HTMLDeCode(string sHTML) { string sTemp = ""; if (sHTML.Length == 0) { return ""; } sTemp = sHTML.Replace("<", "<"); sTemp = sTemp.Replace(">", ">"); sTemp = sTemp.Replace("'", "'"); sTemp = sTemp.Replace(" ", " "); sTemp = sTemp.Replace(""", "\""); sTemp = sTemp.Replace("&", "&"); sTemp = sTemp.Replace("
", "\n"); return sTemp; } } }