You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
7.9 KiB
204 lines
7.9 KiB
using System;
|
|
using System.Collections;
|
|
using System.IO;
|
|
using System.Net;
|
|
using System.Text;
|
|
using System.Web;
|
|
using System.Xml;
|
|
using System.Diagnostics;
|
|
using System.Windows.Forms;
|
|
using System.Collections.Generic;
|
|
|
|
namespace SiaSun.LMS.Common
|
|
{
|
|
public class WebServer
|
|
{
|
|
private Hashtable _xmlNamespaces = new Hashtable();
|
|
|
|
private string _Name = SiaSun.LMS.Common.StringUtil.GetConfig("wsUserName");
|
|
|
|
private string _PassWord = SiaSun.LMS.Common.StringUtil.GetConfig("wsUserPsd");
|
|
|
|
public WebServer(string Name, string PassWord)
|
|
{
|
|
if (!string.IsNullOrEmpty(Name))
|
|
{
|
|
this._Name = Name;
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(PassWord))
|
|
{
|
|
this._PassWord = PassWord;
|
|
}
|
|
}
|
|
|
|
private static void AddDelaration(XmlDocument doc)
|
|
{
|
|
XmlDeclaration newChild = doc.CreateXmlDeclaration("1.0", "utf-8", null);
|
|
|
|
doc.InsertBefore(newChild, doc.DocumentElement);
|
|
}
|
|
|
|
private byte[] EncodePars(List<DictionaryEntry> Pars)
|
|
{
|
|
return Encoding.UTF8.GetBytes(ParsToString(Pars));
|
|
}
|
|
|
|
private byte[] EncodeParsToSoap(List<DictionaryEntry> Pars, string XmlNs, string MethodName)
|
|
{
|
|
string str = string.Format("<soapenv:Header><ns1:username soapenv:actor=\"http://schemas.xmlsoap.org/soap/actor/next\" soapenv:mustUnderstand=\"0\" xsi:type=\"soapenc:string\" xmlns:ns1=\"Authorization\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">{0}</ns1:username> <ns2:password soapenv:actor=\"http://schemas.xmlsoap.org/soap/actor/next\" soapenv:mustUnderstand=\"0\" xsi:type=\"soapenc:string\" xmlns:ns2=\"Authorization\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">{1}</ns2:password> </soapenv:Header>",this._Name,this._PassWord);
|
|
|
|
XmlDocument doc = new XmlDocument();
|
|
|
|
doc.LoadXml("<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" + str + "</soapenv:Envelope>");
|
|
|
|
AddDelaration(doc);
|
|
|
|
XmlElement newChild = doc.CreateElement("soapenv", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
|
|
|
|
XmlElement element2 = doc.CreateElement(MethodName);
|
|
|
|
element2.SetAttribute("xmlns", XmlNs);
|
|
|
|
for (int i = 0; i < Pars.Count; i++)
|
|
{
|
|
XmlElement element3 = doc.CreateElement(Pars[i].Key.ToString());
|
|
|
|
element3.SetAttribute("xsi:type", "xsd:string");
|
|
|
|
element3.InnerText = Pars[i].Value.ToString();
|
|
|
|
element2.AppendChild(element3);
|
|
}
|
|
|
|
newChild.AppendChild(element2);
|
|
|
|
doc.DocumentElement.AppendChild(newChild);
|
|
|
|
return Encoding.UTF8.GetBytes(doc.OuterXml);
|
|
}
|
|
|
|
private string GetNamespace(string URL)
|
|
{
|
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");
|
|
SetWebRequest(request);
|
|
try
|
|
{
|
|
StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.UTF8);
|
|
XmlDocument document = new XmlDocument();
|
|
document.LoadXml(reader.ReadToEnd());
|
|
return document.SelectSingleNode("//@targetNamespace").Value;
|
|
}
|
|
catch (WebException exception)
|
|
{
|
|
string str = exception.Status.ToString();
|
|
// MessageBox.Show("******** call webservice GetNamespace err ******** ���ӷ����� ��ȡ WSDL ���� ******* " + exception.Message);
|
|
return (" ������" + exception.Message.ToString());
|
|
}
|
|
}
|
|
|
|
private string ParsToString(List<DictionaryEntry> Pars)
|
|
{
|
|
StringBuilder builder = new StringBuilder();
|
|
|
|
for (int i = 0; i < Pars.Count; i++)
|
|
{
|
|
if (builder.Length > 0)
|
|
{
|
|
builder.Append("&");
|
|
}
|
|
builder.Append(HttpUtility.UrlEncode(Pars[i].Key.ToString()) + "=" + HttpUtility.UrlEncode(Pars[i].Key.ToString()));
|
|
}
|
|
return builder.ToString();
|
|
}
|
|
|
|
public XmlDocument QueryGetWebService(string URL, string MethodName, List<DictionaryEntry> Pars)
|
|
{
|
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars));
|
|
request.Method = "GET";
|
|
request.ContentType = "application/x-www-form-urlencoded";
|
|
SetWebRequest(request);
|
|
return ReadXmlResponse(request.GetResponse());
|
|
}
|
|
|
|
public XmlDocument QueryPostWebService(string URL, string MethodName, List<DictionaryEntry> Pars)
|
|
{
|
|
HttpWebRequest request = (HttpWebRequest)WebRequest.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());
|
|
}
|
|
|
|
public XmlDocument QuerySoapWebService(string URL, string MethodName, List<DictionaryEntry> Pars)
|
|
{
|
|
if (_xmlNamespaces.ContainsKey(URL))
|
|
{
|
|
return QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString());
|
|
}
|
|
string xmlNs = GetNamespace(URL);
|
|
int index = xmlNs.IndexOf("����");
|
|
if (0 < index)
|
|
{
|
|
return null;
|
|
}
|
|
return QuerySoapWebService(URL, MethodName, Pars, xmlNs);
|
|
}
|
|
|
|
private XmlDocument QuerySoapWebService(string URL, string MethodName, List<DictionaryEntry> Pars, string XmlNs)
|
|
{
|
|
_xmlNamespaces[URL] = XmlNs;
|
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
|
|
XmlDocument document = new XmlDocument();
|
|
XmlDocument doc = new XmlDocument();
|
|
try
|
|
{
|
|
request.Method = "POST";
|
|
request.ContentType = "text/xml; charset=utf-8";
|
|
request.Headers.Add("SOAPAction", "\"" + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + MethodName + "\"");
|
|
SetWebRequest(request);
|
|
byte[] data = this.EncodeParsToSoap(Pars, XmlNs, MethodName);
|
|
WriteRequestData(request, data);
|
|
document = ReadXmlResponse(request.GetResponse());
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
string str = e.Message.ToString();
|
|
|
|
return null;
|
|
}
|
|
|
|
XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable);
|
|
nsmgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
|
|
doc.LoadXml("<root>" + document.SelectSingleNode("//soap:Body/*", nsmgr).InnerXml + "</root>");
|
|
AddDelaration(doc);
|
|
return doc;
|
|
}
|
|
|
|
private XmlDocument ReadXmlResponse(WebResponse response)
|
|
{
|
|
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
|
|
string xml = reader.ReadToEnd();
|
|
reader.Close();
|
|
XmlDocument document = new XmlDocument();
|
|
document.LoadXml(xml);
|
|
return document;
|
|
}
|
|
|
|
private void SetWebRequest(HttpWebRequest request)
|
|
{
|
|
request.Credentials = CredentialCache.DefaultCredentials;
|
|
request.Timeout = 0x8710;
|
|
}
|
|
|
|
private void WriteRequestData(HttpWebRequest request, byte[] data)
|
|
{
|
|
request.ContentLength = data.Length;
|
|
System.IO.Stream requestStream = request.GetRequestStream();
|
|
requestStream.Write(data, 0, data.Length);
|
|
requestStream.Close();
|
|
}
|
|
}
|
|
}
|