123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Text;
- using System.Threading.Tasks;
- using System.Xml;
- using System.Xml.Serialization;
- using ZLPlugin_LisPacs_MR.Domain.Units;
- namespace ZLPlugin_LisPacs_MR.Domain.Web
- {
- public class WebServiceCaller
- {
- #region Tip:使用说明
- //调用示例:
- //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调用(Soap),参数Pars为string类型的参数名、参数值
- /// </summary>
- public static string SoapWebQuery(string URL, string MethodName, Hashtable Pars)
- {
- try
- {
- Log.Info("Web调用:");
- Log.Info("URL:" + URL);
- Log.Info("MethodName:" + MethodName);
- HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
- request.Method = "POST";
- request.ContentType = "text/xml; charset=utf-8";
- SetWebRequest(request);
- var message = Encoding.UTF8.GetBytes(ParsToSoapMessage(MethodName, Pars).OuterXml);
- Log.Info("message:" + Encoding.UTF8.GetString(message));
- WriteRequestData(request, message);
- var result = ReadXmlResponse(request.GetResponse());
- Log.Info("result:" + result.OuterXml);
- return GetReturnString(result);
- }
- catch (Exception ex)
- {
- throw new Exception("平台信息:" + ex.Message);
- }
- }
- /// <summary>
- /// 根据方法名和参数生成请求报文
- /// </summary>
- /// <param name="MethodName">方法名</param>
- /// <param name="Pars">参数</param>
- /// <returns></returns>
- private static XmlDocument ParsToSoapMessage(string MethodName, Hashtable Pars)
- {
- XmlDocument doc = new XmlDocument();
- doc.LoadXml("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"></s:Envelope>");
- XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);
- doc.InsertBefore(decl, doc.DocumentElement);
- XmlElement soapBody = doc.CreateElement("s", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
- soapBody.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
- soapBody.SetAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
- XmlElement soapMethod = doc.CreateElement(MethodName);
- soapMethod.SetAttribute("xmlns", "http://service.delivery.gzsino.com/");
- foreach (string k in Pars.Keys)
- {
- XmlElement soapPar = doc.CreateElement(k);
- soapPar.InnerXml = ObjectToSoapXml(Pars[k]);
- soapPar.SetAttribute("xmlns", "");
- soapMethod.AppendChild(soapPar);
- }
- soapBody.AppendChild(soapMethod);
- doc.DocumentElement.AppendChild(soapBody);
- return doc;
- }
- /// <summary>
- /// 类型转化成Xml
- /// </summary>
- /// <param name="o"></param>
- /// <returns></returns>
- private static string ObjectToSoapXml(object o)
- {
- Type type = o.GetType();
- if (!type.Name.Contains("string"))
- {
- XmlSerializer mySerializer = new XmlSerializer(type);
- 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();
- }
- }
- else return o.ToString();
- }
- /// <summary>
- /// 设置凭证与超时时间
- /// </summary>
- /// <param name="request"></param>
- private static void SetWebRequest(HttpWebRequest request)
- {
- request.Credentials = CredentialCache.DefaultCredentials;
- request.Timeout = 10000;
- }
- /// <summary>
- /// 网络请求写入内容
- /// </summary>
- /// <param name="request"></param>
- /// <param name="data"></param>
- private static void WriteRequestData(HttpWebRequest request, byte[] data)
- {
- request.ContentLength = data.Length;
- Stream writer = request.GetRequestStream();
- writer.Write(data, 0, data.Length);
- writer.Close();
- }
- /// <summary>
- /// 网络请求读取内容
- /// </summary>
- /// <param name="response"></param>
- /// <returns></returns>
- 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;
- }
- /// <summary>
- /// 读取内容解析返回值
- /// </summary>
- /// <param name="doc"></param>
- /// <returns></returns>
- private static string GetReturnString(XmlDocument doc)
- {
- string str = doc.InnerText;
- str = str.Replace("&", "&");
- return str;
- }
- }
- }
|