2025-03-27 15:05:14 +08:00

254 lines
9.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// 利用WebRequest/WebResponse进行WebService调用的类
/// </summary>
public class WebServiceCaller
{
#region Tip:使
//webServices 应该支持Get和Post调用在web.config应该增加以下代码
//<webServices>
// <protocols>
// <add name="HttpGet"/>
// <add name="HttpPost"/>
// </protocols>
//</webServices>
//调用示例:
//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
/// <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, 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("<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);
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();
}
}
/// <summary>
/// 设置凭证与超时时间
/// </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 = 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("<ns1:out>") + 9;
int endIndex = retXml.IndexOf("</ns1:out>");
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();
/// <summary>
/// HTMLs the de code.
/// </summary>
/// <param name="sHTML">The HTML.</param>
/// <returns></returns>
public static string HTMLDeCode(string sHTML)
{
string sTemp = "";
if (sHTML.Length == 0)
{
return "";
}
sTemp = sHTML.Replace("&lt;", "<");
sTemp = sTemp.Replace("&gt;", ">");
sTemp = sTemp.Replace("&#39;", "'");
sTemp = sTemp.Replace("&nbsp;", " ");
sTemp = sTemp.Replace("&quot;", "\"");
sTemp = sTemp.Replace("&amp;", "&");
sTemp = sTemp.Replace("<br />", "\n");
return sTemp;
}
}
}