此代码是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{//获取WSDLWebClient 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;}}
}

  

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

http请求POST和GET调用接口以及反射动态调用Webservices类相关推荐

  1. 反射动态调用DLL类库测试

    定义:可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌 ...

  2. (C#)利用反射动态调用类成员[转载]

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember(    string name ...

  3. 利用反射动态调用类成员C#

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember(    string name ...

  4. C# 利用反射动态调用类成员

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下: public object InvokeMember( string name, BindingFla ...

  5. C# 知识点笔记:IEnumerable的使用,利用反射动态调用方法

    IEnumerable<T>的使用 创建一个IEnumerable对象 List<string> fruits = new List<string> { " ...

  6. 通过.NET反射动态调用SetValue方法给属性PropertyInfo动态类型赋值

    注意:若不动态转换属性的值,简单调用SetValue方法赋值经常出错!特别是日期类型.带符号的数字类型等. 解决方案: 通过TypeDescriptor.GetConverter方法获取对应数值类型的 ...

  7. 调用接口的方法 java_java调用接口的方法

    java调用接口的方法 发布时间:2020-06-24 10:42:58 来源:亿速云 阅读:85 作者:Leah 这期内容当中的小编将会给大家带来有关java调用接口的方法,以专业的角度为大家分析和 ...

  8. HTTP 调用 WebService、CXF 动态调用 WebService

    概述   Web Service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用 ...

  9. 通过反射动态调用webservices

    该方法可以使程序不通过web引用的方式去调用webservices方法,直接在代码里调用该方法就能达到动态调用webservices的目的.使用前先引用System.Web.Services动态链接库 ...

  10. python调用函数示例_python 动态调用函数实例解析

    1. 根据字符串名称 动态调用 python文件内的方法eval("function_name")(参数) 2. 根据字符串 动态调用类中的静态方法,getattr(ClassNa ...

最新文章

  1. linux虚拟网络设备之tun/tap驱动程序设计原理(五)
  2. 参考灵敏度_美信MAXREFDES103评测:集成算法处理的高灵敏度健康传感器腕带参考设计方案...
  3. python mysql倒序_day40:MySQL:python操作mysql:pymysql模块SQL注入攻击
  4. EOJ Monthly 2019.2 (based on February Selection) D.进制转换
  5. 【最优解法】1030 完美数列 (25分)_23行代码AC
  6. One order event display tool
  7. LeetCode 514. 自由之路(记忆化递归 / DP)
  8. 系统维护好帮手—Starter
  9. 中国首个开源基金会来了
  10. ionic-cordova 支付宝支付插件cordova-plugin-alipay-v2使用篇
  11. 关于Java书籍的最佳阅读顺序
  12. linux 进程间通信机制(IPC机制)一消息队列
  13. linux 虚拟机网卡配置
  14. 计算机视觉中的论文常见单词总结
  15. 修改RAC中的私网地址导致CRS启动失败
  16. hive中的UDF 自定义函数 : 如何创建临时/永久函数
  17. cass块参照怎么改颜色_【干货】CASS自定义图斑填充技巧
  18. 关于连接校园网却无法上网的问题回顾
  19. java案例之制作系统
  20. Java Condition类使用及分析

热门文章

  1. in作为介词的用法_思维导图:为孩子收藏——常出错的英语用法集锦
  2. 有效的java限定名称_java - 如何获取java类的完全限定名称 - SO中文参考 - www.soinside.com...
  3. Lan Xiang's Square nyoj 1099(已经四边形四点坐标 如何判断正方形)
  4. C/C++[codeup 2046]8皇后
  5. 自动驾驶的Pipline -- 如何打造自动驾驶的数据闭环?(中)
  6. 自动驾驶 2-5 自动驾驶汽车的未来 The Future of Autonomous Vehicles
  7. docker常用操作和命令
  8. conda安装tensorflow-GPU出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url错误
  9. hdu acm 2569
  10. 在linux centos中加入中文输入法