博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
http请求POST和GET调用接口以及反射动态调用Webservices类
阅读量:5329 次
发布时间:2019-06-14

本文共 10305 字,大约阅读时间需要 34 分钟。

此代码是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; } /// /// 获取数据 /// /// 响应对象 /// 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; } }}

  

转载于:https://www.cnblogs.com/xbzsz/p/6786168.html

你可能感兴趣的文章
asp.net 写入excel时,不能更新。数据库或对象为只读。
查看>>
题1简化版
查看>>
linux清空日志文件内容 (转)
查看>>
jsp中对jstl一些标签的引用方式
查看>>
100. Same Tree
查看>>
[转]java classLoader 体系结构
查看>>
mkdir命令(转)
查看>>
安卓第十三天笔记-服务(Service)
查看>>
css3学习笔记之背景
查看>>
Servlet接收JSP参数乱码问题解决办法
查看>>
【bzoj5016】[Snoi2017]一个简单的询问 莫队算法
查看>>
[dpdk] 熟悉SDK与初步使用 (二)(skeleton源码分析)
查看>>
Ajax : load()
查看>>
分布式版本控制系统
查看>>
Java出现OutOfMemoryError
查看>>
可行性报告
查看>>
[预打印]使用vbs给PPT(包括公式)去背景
查看>>
HTML5学习笔记简明版(1):HTML5介绍与语法
查看>>
使用IntelliJ IDEA 配置Maven
查看>>
django基础入门(3)django中模板
查看>>