此代碼是API、WebSrvices動態調用的類,作接口調用時很實用。web
Webservices動態調用使用反射的方式很大的缺點是效率低,如有更好的動態調用webservices方法,望各位仁兄不吝貼上代碼。瀏覽器
using System; using System.IO; using System.Net; using System.Text; using System.Web; using System.Collections.Generic; using System.CodeDom.Compiler; using System.Web.Services.Description; using System.CodeDom; using Microsoft.CSharp; /********************* * 描述:提供http、POST和GET、Webservices動態訪問遠程接口 * *******************/ namespace Demo { public static class HttpHelper { /// /// 有關HTTP請求的輔助類 /// private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";//瀏覽器 private static Encoding requestEncoding = System.Text.Encoding.UTF8;//字符集 #region 建立GET方式的HTTP請求 /// /// 建立GET方式的HTTP請求 /// /// 接口URL /// 接口URL的參數 /// 調用接口返回的信息 /// public static bool HttpGet(string url, Dictionary dctParam, out string HttpWebResponseString) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } HttpWebResponseString = ""; HttpWebRequest request = null; Stream stream = null;//用於傳參數的流 HttpWebResponse httpWebResponse = null; try { int i = 0; StringBuilder buffer = new StringBuilder(); if (!(dctParam == null)) { foreach (string key in dctParam.Keys) { if (i > 0) { buffer.AppendFormat("&{0}={1}", key, (dctParam[key])); } else { buffer.AppendFormat("{0}={1}", key, (dctParam[key])); } i++; } url = url + "?" + buffer.ToString(); } request = WebRequest.Create(url) as HttpWebRequest; request.Method = "GET";//傳輸方式 request.ContentType = "application/x-www-form-urlencoded";//協議 request.UserAgent = DefaultUserAgent;//請求的客戶端瀏覽器信息,默認IE request.Timeout = 6000;//超時時間,寫死6秒 request.KeepAlive = false; //DefaultConnectionLimit是默認的2,而當前的Http的connection用完了,致使後續的GetResponse或GetRequestStream超時死掉 System.Net.ServicePointManager.DefaultConnectionLimit = 50; request.ServicePoint.Expect100Continue = false; httpWebResponse = request.GetResponse() as HttpWebResponse; HttpWebResponseString = ReadHttpWebResponse(httpWebResponse); return true; } catch (Exception ee) { HttpWebResponseString = ee.ToString(); return false; } finally { if (stream != null) { stream.Close(); } if (request != null) { request.Abort(); request = null; } if (httpWebResponse != null) { httpWebResponse.Close(); httpWebResponse = null; } } } #endregion #region 建立POST方式的HTTP請求 /// /// 建立POST方式的HTTP請求 /// /// 接口URL /// 接口URL的參數 /// 調用接口返回的信息 /// public static bool HttpPost(string url, Dictionary dctParam, out string HttpWebResponseString) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } HttpWebResponseString = ""; HttpWebRequest request = null; Stream stream = null;//用於傳參數的流 try { url = EncodePostData(url); request = WebRequest.Create(url) as HttpWebRequest; request.Method = "POST";//傳輸方式 request.ContentType = "application/x-www-form-urlencoded";//協議 request.UserAgent = DefaultUserAgent;//請求的客戶端瀏覽器信息,默認IE request.Timeout = 6000;//超時時間,寫死6秒 //DefaultConnectionLimit是默認的2,而當前的Http的connection用完了,致使後續的GetResponse或GetRequestStream超時死掉 System.Net.ServicePointManager.DefaultConnectionLimit = 50; request.ServicePoint.Expect100Continue = false; //若是需求POST傳數據,轉換成utf-8編碼 byte[] Data = ParamDataConvert(dctParam); if (!(Data == null)) { string s = requestEncoding.GetString(Data); stream = request.GetRequestStream(); stream.Write(Data, 0, Data.Length); } HttpWebResponse HttpWebResponse = request.GetResponse() as HttpWebResponse; HttpWebResponseString = ReadHttpWebResponse(HttpWebResponse); return true; } catch (Exception ee) { HttpWebResponseString = ee.ToString(); return false; } finally { if (stream != null) { stream.Close(); } } } #endregion #region 反射動態調用WebServices /// /// 反射動態調用WebServices /// /// Webservices地址,以?WSDL結尾 /// 調用的方法 /// 調用方法的參數 /// public static object InvokeWebService(string url, string methodname, object[] args) { string @namespace = "Demo";//本頁的命名空間 try { //獲取WSDL WebClient wc = new WebClient(); Stream stream = wc.OpenRead(url); ServiceDescription sd = ServiceDescription.Read(stream); ServiceDescriptionImporter sdi = new ServiceDescriptionImporter(); sdi.AddServiceDescription(sd, "", ""); CodeNamespace cn = new CodeNamespace(@namespace); //生成客戶端代理類代碼 CodeCompileUnit ccu = new CodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn, ccu); CSharpCodeProvider csc = new CSharpCodeProvider(); CSharpCodeProvider icc = new CSharpCodeProvider(); //設定編譯參數 CompilerParameters cplist = new CompilerParameters(); cplist.GenerateExecutable = false; cplist.GenerateInMemory = true; cplist.ReferencedAssemblies.Add("System.dll"); cplist.ReferencedAssemblies.Add("System.XML.dll"); cplist.ReferencedAssemblies.Add("System.Web.Services.dll"); cplist.ReferencedAssemblies.Add("System.Data.dll"); //編譯代理類 CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu); if (true == cr.Errors.HasErrors) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } //生成代理實例,並調用方法 System.Reflection.Assembly assembly = cr.CompiledAssembly; Type[] types = assembly.GetTypes(); Type t = types[0]; object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(methodname); return mi.Invoke(obj, args); } catch (Exception ex) { } return null; } #endregion /// /// 接口參數轉換 /// /// 接口參數集合包 /// private static byte[] ParamDataConvert(Dictionary dctParam) { if (dctParam == null) return null; try { Encoding requestEncoding = System.Text.Encoding.UTF8;//字符集 StringBuilder buffer = new StringBuilder(); int i = 0; foreach (string key in dctParam.Keys) { if (i > 0) { buffer.AppendFormat("&{0}={1}", key, (dctParam[key])); } else { buffer.AppendFormat("{0}={1}", key, (dctParam[key])); } i++; } string PostData = buffer.ToString(); byte[] data = requestEncoding.GetBytes(buffer.ToString()); return data; } catch (Exception ex) { } return null; } /// /// 獲取數據 /// /// 響應對象 /// </returns> public static string ReadHttpWebResponse(HttpWebResponse HttpWebResponse) { Stream responseStream = null; StreamReader sReader = null; String value = null; try { // 獲取響應流 responseStream = HttpWebResponse.GetResponseStream(); // 對接響應流(以"utf-8"字符集) sReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); // 開始讀取數據 value = sReader.ReadToEnd(); } catch (Exception ee) { throw ee; } finally { //強制關閉 if (sReader != null) { sReader.Close(); } if (responseStream != null) { responseStream.Close(); } if (HttpWebResponse != null) { HttpWebResponse.Close(); } } return value; } public static string EncodePostData(string Data) { string EncodeData = HttpUtility.UrlDecode(Data); return EncodeData; } } }