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

C#靜態webservice挪用接口

編輯:C#入門知識

C#靜態webservice挪用接口。本站提示廣大學習愛好者:(C#靜態webservice挪用接口)文章只能為提供參考,不一定能成為您想要的結果。以下是C#靜態webservice挪用接口正文


C#靜態webservice挪用接口

using System;
using System.Collections;
using System.IO;
using System.Net;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace Hishop.Plugins
{
  /// <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));
      }
    }
 
    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_x_x("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
      XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
      //XmlElement soapMethod = doc.createElement_x_x(MethodName);
      XmlElement soapMethod = doc.CreateElement(MethodName);
      soapMethod.SetAttribute("xmlns", XmlNs);
      foreach (string k in Pars.Keys)
      {
        //XmlElement soapPar = doc.createElement_x_x(k);
        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 = 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);
    }
 
    private static Hashtable _xmlNamespaces = new Hashtable();//緩存xmlNamespace,防止反復挪用GetNamespace
  }
}

//挪用並讀取解析前往成果
 
 DataSet ds = new DataSet(); 
    XmlNode xmlNode1;
    XmlDataDocument xd = new XmlDataDocument();
    StringBuilder sb; 
    Hashtable ht = new Hashtable();
    ht.Add("xmlIn", "<Request><MemCode>001</MemCode></Request>");
    xmlNode1 = Hishop.Plugins.WebServiceCaller.QuerySoapWebService("http://xxx.xxxx.com/Service.asmx", "SinPointQuery", ht);
    if (xmlNode1 == null)
    {
      return;
    }
    string xmlstr= HttpUtility.HtmlDecode(xmlNode1.OuterXml);
    sb = new StringBuilder(xmlstr);
    if (sb.ToString().Equals(""))
    {
      return;
    }
    xd.LoadXml(sb.ToString());
    ds.ReadXml(new XmlNodeReader(xd)); 
    //ds可以前往出成果集

示例二:

1.靜態挪用的辦法:

/// <summary> 
    /// 靜態webservice挪用 
    /// </summary> 
    /// <returns>string</returns>  
    public string wsTest() 
    { 
      string url = "http://localhost:8080/myWebserviceTest/services/myServices?wsdl";//wsdl地址 
      string name = "wsTest";//javaWebService開放的接口 
      WebServiceProxy wsd = new WebServiceProxy(url, name); 
 
      string[] str = { "測試c#挪用java的webService" , "Hello WebService"}; 
 
      string suc = (string)wsd.ExecuteQuery(name, str); 
 
      return suc; 
    } 

2.靜態挪用詳細類:

using System; 
using System.Collections; 
using System.ComponentModel; 
using System.Data; 
using System.Linq; 
using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 
using System.Xml.Linq; 
 
 
using System.IO; 
using System.Net; 
using System.CodeDom; 
using System.CodeDom.Compiler; 
using System.Web.Services.Description; 
using System.Xml.Serialization; 
using System.Web.Services.Discovery; 
using System.Xml.Schema; 
using System.Text; 
using System.Security.Cryptography; 
using System.Reflection; 
using System.Collections.Generic; 
using System.Xml; 
 
namespace TPSVService 
{ 
  /// <summary> 
  /// WebServiceProxy 的摘要解釋 
  /// </summary> 
  [WebService(Namespace = "http://tempuri.org/")] 
  [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
  [ToolboxItem(false)] 
  // 若要許可應用 ASP.NET AJAX 從劇本中挪用此 Web 辦事,請撤消對下行的正文。 
  // [System.Web.Script.Services.ScriptService] 
  public class WebServiceProxy : System.Web.Services.WebService 
  { 
 
    #region 公有變量和屬性界說 
    /// <summary>          
    /// web辦事地址              
    /// </summary>               
    private string _wsdlUrl = string.Empty; 
    /// <summary>          
    /// web辦事稱號              
    /// </summary>               
    private string _wsdlName = string.Empty; 
    /// <summary>          
    /// 署理類定名空間              
    /// </summary>               
    private string _wsdlNamespace = "FrameWork.WebService.DynamicWebServiceCalling.{0}"; 
    /// <summary>          
    /// 署理類類型稱號              
    /// </summary>               
    private Type _typeName = null; 
    /// <summary>          
    /// 法式集稱號               
    /// </summary>               
    private string _assName = string.Empty; 
    /// <summary>          
    /// 署理類地點法式集途徑              
    /// </summary>               
    private string _assPath = string.Empty; 
    /// <summary>          
    /// 署理類的實例              
    /// </summary>               
    private object _instance = null; 
    /// <summary>          
    /// 署理類的實例              
    /// </summary>               
    private object Instance 
    { 
      get 
      { 
        if (_instance == null) 
        { 
          _instance = Activator.CreateInstance(_typeName); 
          return _instance; 
        } 
        else 
          return _instance; 
      } 
    } 
    #endregion 
 
    #region 結構函數 
    public WebServiceProxy(string wsdlUrl) 
    { 
 
      this._wsdlUrl = wsdlUrl; 
      string wsdlName = WebServiceProxy.getWsclassName(wsdlUrl); 
      this._wsdlName = wsdlName; 
      this._assName = string.Format(_wsdlNamespace, wsdlName); 
      this._assPath = Path.GetTempPath() + this._assName + getMd5Sum(this._wsdlUrl) + ".dll"; 
      this.CreateServiceAssembly(); 
    } 
 
    public WebServiceProxy(string wsdlUrl, string wsdlName) 
    { 
      this._wsdlUrl = wsdlUrl; 
      this._wsdlName = wsdlName; 
      this._assName = string.Format(_wsdlNamespace, wsdlName); 
      this._assPath = Path.GetTempPath() + this._assName + getMd5Sum(this._wsdlUrl) + ".dll"; 
      this.CreateServiceAssembly(); 
    } 
    #endregion 
 
    #region 獲得WSDL信息,生本錢地署理類並編譯為DLL,結構函數挪用,類生成時加載 
    /// <summary>              
    /// 獲得WSDL信息,生本錢地署理類並編譯為DLL              
    /// </summary>               
    private void CreateServiceAssembly() 
    { 
      if (this.checkCache()) 
      { 
        this.initTypeName(); 
        return; 
      } 
      if (string.IsNullOrEmpty(this._wsdlUrl)) 
      { 
        return; 
      } 
      try 
      { 
        //應用WebClient下載WSDL信息             
        WebClient web = new WebClient(); 
        Stream stream = web.OpenRead(this._wsdlUrl); 
        ServiceDescription description = ServiceDescription.Read(stream);//創立和格局化WSDL文檔 
        ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//創立客戶端署理署理類 
        importer.ProtocolName = "Soap"; 
        importer.Style = ServiceDescriptionImportStyle.Client; //生成客戶端署理             
        importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; 
        importer.AddServiceDescription(description, null, null);//添加WSDL文檔 
        //應用CodeDom編譯客戶端署理類          
        CodeNamespace nmspace = new CodeNamespace(_assName);  //為署理類添加定名空間         
        CodeCompileUnit unit = new CodeCompileUnit(); 
        unit.Namespaces.Add(nmspace); 
        this.checkForImports(this._wsdlUrl, importer); 
        ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit); 
        CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); 
        CompilerParameters parameter = new CompilerParameters(); 
        parameter.ReferencedAssemblies.Add("System.dll"); 
        parameter.ReferencedAssemblies.Add("System.XML.dll"); 
        parameter.ReferencedAssemblies.Add("System.Web.Services.dll"); 
        parameter.ReferencedAssemblies.Add("System.Data.dll"); 
        parameter.GenerateExecutable = false; 
        parameter.GenerateInMemory = false; 
        parameter.IncludeDebugInformation = false; 
        CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit); 
        provider.Dispose(); 
        if (result.Errors.HasErrors) 
        { 
          string errors = string.Format(@"編譯毛病:{0}毛病!", result.Errors.Count); 
          foreach (CompilerError error in result.Errors) 
          { 
            errors += error.ErrorText; 
          } 
          throw new Exception(errors); 
        } 
        this.copyTempAssembly(result.PathToAssembly); 
        this.initTypeName(); 
      } 
      catch (Exception e) 
      { 
        throw new Exception(e.Message); 
      } 
    } 
    #endregion 
 
    #region 履行Web辦事辦法 
    /// <summary>              
    /// 履行署理類指定辦法,有前往值                
    /// </summary>                 
    /// <param  name="methodName">辦法稱號</param>              
    /// <param  name="param">參數</param>               
    /// <returns>object</returns>                 
    public object ExecuteQuery(string methodName, object[] param) 
    { 
      object rtnObj = null;  
      string[] args = new string[2]; 
      List<string> list = new List<string>(); 
      List<string> list1 = new List<string>(); 
      List<string> list2 = new List<string>(); 
      object[] obj = new object[3]; 
 
      try 
      { 
        if (this._typeName == null) 
        { 
          //記載Web辦事拜訪類名毛病日記代碼地位 
          throw new TypeLoadException("Web辦事拜訪類名【" + this._wsdlName + "】不准確,請檢討!"); 
        } 
        //挪用辦法 
        MethodInfo mi = this._typeName.GetMethod(methodName); 
        if (mi == null) 
        { 
          //記載Web辦事辦法名毛病日記代碼地位 
          throw new TypeLoadException("Web辦事拜訪辦法名【" + methodName + "】不准確,請檢討!"); 
        } 
        try 
        { 
          if (param == null) 
            rtnObj = mi.Invoke(Instance, null); 
          else { 
            list.Add("Hello "); 
            list.Add("WebService "); 
            list.Add(" ! "); 
 
            list1.Add("I "); 
            list1.Add("am "); 
            list1.Add("test "); 
 
            list2.Add("do "); 
            list2.Add("it "); 
            list2.Add("now "); 
 
            obj[0] = list; 
            obj[1] = list1; 
            obj[2] = list2; 
 
            rtnObj = mi.Invoke(Instance, new object[] { obj }); 
            //rtnObj = mi.Invoke(Instance, new object[] { param }); 
          } 
        } 
        catch (TypeLoadException tle) 
        { 
          //記載Web辦事辦法參數個數毛病日記代碼地位 
          throw new TypeLoadException("Web辦事拜訪辦法【" + methodName + "】參數個數不准確,請檢討!", new TypeLoadException(tle.StackTrace)); 
        } 
      } 
      catch (Exception ex) 
      { 
        throw new Exception(ex.Message, new Exception(ex.StackTrace)); 
      } 
      return rtnObj; 
    } 
 
    /// <summary>              
    /// 履行署理類指定辦法,無前往值                
    /// </summary>                 
    /// <param  name="methodName">辦法稱號</param>              
    /// <param  name="param">參數</param>               
    public void ExecuteNoQuery(string methodName, object[] param) 
    { 
      try 
      { 
        if (this._typeName == null) 
        { 
          //記載Web辦事拜訪類名毛病日記代碼地位 
          throw new TypeLoadException("Web辦事拜訪類名【" + this._wsdlName + "】不准確,請檢討!"); 
        } 
        //挪用辦法 
        MethodInfo mi = this._typeName.GetMethod(methodName); 
        if (mi == null) 
        { 
          //記載Web辦事辦法名毛病日記代碼地位 
          throw new TypeLoadException("Web辦事拜訪辦法名【" + methodName + "】不准確,請檢討!"); 
        } 
        try 
        { 
          if (param == null) 
            mi.Invoke(Instance, null); 
          else 
            mi.Invoke(Instance, param); 
        } 
        catch (TypeLoadException tle) 
        { 
          //記載Web辦事辦法參數個數毛病日記代碼地位 
          throw new TypeLoadException("Web辦事拜訪辦法【" + methodName + "】參數個數不准確,請檢討!", new TypeLoadException(tle.StackTrace)); 
        } 
      } 
      catch (Exception ex) 
      { 
        throw new Exception(ex.Message, new Exception(ex.StackTrace)); 
      } 
    } 
    #endregion 
 
    #region 公有辦法 
    /// <summary>                
    /// 獲得署理類類型稱號                 
    /// </summary>                 
    private void initTypeName() 
    { 
      Assembly serviceAsm = Assembly.LoadFrom(this._assPath); 
      Type[] types = serviceAsm.GetTypes(); 
      string objTypeName = ""; 
      foreach (Type t in types) 
      { 
        if (t.BaseType == typeof(SoapHttpClientProtocol)) 
        { 
          objTypeName = t.Name; 
          break; 
        } 
      } 
      _typeName = serviceAsm.GetType(this._assName + "." + objTypeName); 
    } 
 
    /// <summary>            
    /// 依據web  service文檔架構向署理類添加ServiceDescription和XmlSchema               
    /// </summary>                 
    /// <param  name="baseWSDLUrl">web辦事地址</param>              
    /// <param  name="importer">署理類</param>               
    private void checkForImports(string baseWsdlUrl, ServiceDescriptionImporter importer) 
    { 
      DiscoveryClientProtocol dcp = new DiscoveryClientProtocol(); 
      dcp.DiscoverAny(baseWsdlUrl); 
      dcp.ResolveAll(); 
      foreach (object osd in dcp.Documents.Values) 
      { 
        if (osd is ServiceDescription) importer.AddServiceDescription((ServiceDescription)osd, null, null); ; 
        if (osd is XmlSchema) importer.Schemas.Add((XmlSchema)osd); 
      } 
    } 
 
    /// <summary>              
    /// 復制法式集到指定途徑                
    /// </summary>                 
    /// <param  name="pathToAssembly">法式集途徑</param>               
    private void copyTempAssembly(string pathToAssembly) 
    { 
      File.Copy(pathToAssembly, this._assPath); 
    } 
 
    private string getMd5Sum(string str) 
    { 
      Encoder enc = System.Text.Encoding.Unicode.GetEncoder(); 
      byte[] unicodeText = new byte[str.Length * 2]; 
      enc.GetBytes(str.ToCharArray(), 0, str.Length, unicodeText, 0, true); 
      MD5 md5 = new MD5CryptoServiceProvider(); 
      byte[] result = md5.ComputeHash(unicodeText); 
      StringBuilder sb = new StringBuilder(); 
      for (int i = 0; i < result.Length; i++) 
      { 
        sb.Append(result[i].ToString("X2")); 
      } 
      return sb.ToString(); 
    } 
 
    /// <summary>              
    /// 能否曾經存在該法式集                
    /// </summary>                 
    /// <returns>false:不存在該法式集,true:曾經存在該法式集</returns>                
    private bool checkCache() 
    { 
      if (File.Exists(this._assPath)) 
      { 
        return true; 
      } 
      return false; 
    } 
 
    //公有辦法,默許取url進口的文件名為類名 
    private static string getWsclassName(string wsdlUrl) 
    { 
      string[] parts = wsdlUrl.Split('/'); 
      string[] pps = parts[parts.Length - 1].Split('.'); 
      return pps[0]; 
    } 
    #endregion 
  } 
} 

以上所述就是本文的全體內容了,願望年夜家可以或許愛好。

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