此代码是API、WebSrvices动态调用的类,做接口调用时很实用。
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;
}
}
}