给定了WebService地址和调用接口后动态的生成DLL,第二次再请求时会先判断DLL是否存在,以提高执行效率

核心代码下:

/// <summary>/// 动态生成WebService服务客户端/// </summary>/// <param name="serviceProvider">WebService服务的提供者</param>/// <param name="url">WebService具体地址</param>/// <param name="serviceName">需要调用的类名</param>/// <param name="actionName">需要请求的方法</param>/// <param name="args">方法参数列表</param>/// <returns></returns>public static object InvokeWebService(string serviceProvider, string url, string serviceName, string actionName, object[] args){if (string.IsNullOrEmpty(url)){throw new ArgumentNullException("url");}if (string.IsNullOrEmpty(serviceName)){serviceName = GetWsClassName(url);}var shortUrl = BuildShortUrl(url);var nameSpace = string.Format("{0}_{1}_{2}", serviceProvider, serviceName, shortUrl);var binDir = HttpRuntime.AppDomainId == null ? AppDomain.CurrentDomain.BaseDirectory : HttpRuntime.BinDirectory;var asmFullPath = System.IO.Path.Combine(binDir, string.Format("{0}.dll", nameSpace));#regionif (!File.Exists(asmFullPath)){if (!url.ToLower().EndsWith("?wsdl")){url += "?wsdl";}//获取WSDL WebClient webClient = new WebClient();try{#region 动态生成DLLStream wsdlStream = webClient.OpenRead(url);//服务描述ServiceDescription serviceDesc = ServiceDescription.Read(wsdlStream);//生成客户端代理类ServiceDescriptionImporter clientBuilder = new ServiceDescriptionImporter(){CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateNewAsync | System.Xml.Serialization.CodeGenerationOptions.GenerateProperties,ProtocolName = "Soap",Style = ServiceDescriptionImportStyle.Client};clientBuilder.AddServiceDescription(serviceDesc, null, null);//生成客户端代理类代码CodeNamespace ns = new CodeNamespace(nameSpace);CodeCompileUnit ccu = new CodeCompileUnit();ccu.Namespaces.Add(ns);//按照clientBuilder的配置来生成代码
                    clientBuilder.Import(ns, ccu);//C#代码容器var sourceCodeProvider = new CSharpCodeProvider();//设定编译参数var comParams = new CompilerParameters();comParams.GenerateExecutable = false;//如果此属性的值为 false,则生成 DLLcomParams.GenerateInMemory = false;comParams.OutputAssembly = asmFullPath; // 可以指定你所需的任何文件名。comParams.ReferencedAssemblies.Add("System.dll");comParams.ReferencedAssemblies.Add("System.XML.dll");comParams.ReferencedAssemblies.Add("System.Web.Services.dll");comParams.ReferencedAssemblies.Add("System.Data.dll");comParams.CompilerOptions = "/optimize";//编译                 var comResult = sourceCodeProvider.CompileAssemblyFromDom(comParams, ccu);if (comResult.Errors.HasErrors){System.Text.StringBuilder sb = new System.Text.StringBuilder();foreach (System.CodeDom.Compiler.CompilerError ce in comResult.Errors){sb.Append(ce.ToString());sb.Append(System.Environment.NewLine);}throw new Exception(sb.ToString());}#endregion}catch (Exception ex){}finally{webClient.Dispose();}}#endregion//生成代理实例,并调用方法var asm = System.Reflection.Assembly.LoadFile(asmFullPath);Type t = asm.GetType(nameSpace + "." + serviceName, true, true);object obj = Activator.CreateInstance(t);System.Reflection.MethodInfo mi = t.GetMethod(actionName);return mi.Invoke(obj, args);}

View Code

辅助代码:简化WebService地址,类似生成短链的功能

// Hash an input string and return the hash as// a 32 character hexadecimal string.static string getMd5Hash(string input){// Create a new instance of the MD5CryptoServiceProvider object.System.Security.Cryptography.MD5 md5Hasher = System.Security.Cryptography.MD5.Create();// Convert the input string to a byte array and compute the hash.byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));// Create a new Stringbuilder to collect the bytes// and create a string.StringBuilder sBuilder = new StringBuilder();// Loop through each byte of the hashed data// and format each one as a hexadecimal string.for (int i = 0; i < data.Length; i++){sBuilder.Append(data[i].ToString("x2"));}// Return the hexadecimal string.return sBuilder.ToString();}static string BuildShortUrl(string url){// 可以自定义生成 MD5 加密字符传前的混合 KEYstring key = "fF{#E@#:RJP(#!$";// 要使用生成 URL 的字符string[] chars = new string[] { "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" ,"i" , "j" , "k" , "l" , "m" , "n" , "o" , "p" , "q" , "r" , "s" , "t" ,"u" , "v" , "w" , "x" , "y" , "z" , "0" , "1" , "2" , "3" , "4" , "5" ,"6" , "7" , "8" , "9" , "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" ,"I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" ,"U" , "V" , "W" , "X" , "Y" , "Z"};// 对传入网址进行 MD5 加密string hex = getMd5Hash(url + key);string[] resUrl = new string[4];for (int i = 0; i < 4; i++){// 把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算string sTempSubString = hex.Substring(i * 8, 8);// 这里需要使用 long 型来转换,因为 Inteper .parseInt() 只能处理 31 位 , 首位为符号位 , 如果不用 long ,则会越界long lHexLong = 0x3FFFFFFF & long.Parse(sTempSubString, System.Globalization.NumberStyles.AllowHexSpecifier);string outChars = "";for (int j = 0; j < 2; j++){// 把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引long index = 0x0000003D & lHexLong;// 把取得的字符相加outChars += chars[(int)index];// 每次循环按位右移 7 位lHexLong = lHexLong >> 7;}// 把字符串存入对应索引的输出数组resUrl[i] = outChars;}return string.Join("", resUrl);}

View Code

测试结果:

转载于:https://www.cnblogs.com/smlheart/p/3591916.html

动态生成WebService的客户端相关推荐

  1. wsdl2java 工具下载_利用wsdl2java工具生成webservice的客户端代码

    1.JDK环境 2.下载apache-cxf发布包:http://cxf.apache.org/download.html 目前最新版本为3.2.6, 解压后如下: 解压发布包,设置CXF_HOME, ...

  2. wsdl2java生成客户端代码_利用wsdl2java工具生成webservice的客户端代码

    1.JDK环境 2.下载apache-cxf发布包:http://cxf.apache.org/download.html 目前最新版本为3.2.6, 解压后如下: 解压发布包,设置CXF_HOME, ...

  3. 利用ApacheCXF自动生成webservice的客户端代码

    利用ApacheCXF自动生成webservice的客户端代码 一.环境准备 1.JDK环境 2.下载apache-cxf发布包,举例版本为3.2.14,解压发布包,设置CXF_HOME,并添加%CX ...

  4. 使用axis1.4生成webservice的客户端代码

    最近发现了一个很好用的工具,可以根据WSDL文件来生成webservice客户端代码,省去了我们自己手动开发webservice客户端的麻烦,简单好用,用法如下: 1.下载axis1.4,解压: 2. ...

  5. gsoap生成webservice调用客户端接口

    1.下载gsoap2.82.运行 [plain] view plaincopy wsdl2h.exe -o XXX.h XXX.wsdl wsdl文件可以是本地文件,也可以是服务器的wsdl,比如ht ...

  6. cmd 根据xsd文件生成webservice java客户端代码

    根据xsd 转换成java 对象, jdk1.7 自带 xjc 命令,可以根据xjc 命令直接转换成 java 对象 命令格式:xjc -d dir -p packgeName -verbose xx ...

  7. 根据wsdl文件生成WebService客户端代码

    有时候在项目中,一个项目可能有好几个公司在做.系统之间难免会出现互相调用接口的现象,这时候有一种办法就是使用webService.本篇文章将介绍如何将对接系统提供的WebService接口,根据对方提 ...

  8. cmd命令生成webservice_根据wsdl文件生成WebService客户端代码

    有时候在项目中,一个项目可能有好几个公司在做.系统之间难免会出现互相调用接口的现象,这时候有一种办法就是使用webService.本篇文章将介绍如何将对接系统提供的WebService接口,根据对方提 ...

  9. 用MyEclipse自带工具生成WebService客户端代码

    本文章主要是介绍如何利用已经发布了的Webservice的wsdl来自动生成java的客户端代码.注意:本方法需要你采用的java版本是1.5或者以上的版本,采用MyEclipse来自动生成代码. w ...

  10. cmd命令生成webservice_使用wsimport命令生成webService客户端代码实例

    wsimport简介 在JDK的bin文件夹中,有一个wsimport.exe工具,可依据wsdl文件生成相应的类文件,将生存在本地这些类文件拷贝到需要使用的项目中,就可以像调用本地的类一样调用web ...

最新文章

  1. Adobe宣布Flex Builder将更名为Flash Builder
  2. Java 引用类型变量的声明和使用
  3. 世界杯足球竞赛源码下载
  4. shop--7.店铺信息编辑--Controller层
  5. 西普实验吧-ctf-web-1
  6. JAVA大数据-Week2-DAY5
  7. DoTween插件使用
  8. 装饰模式(Decorate Pattern)
  9. CorelDRAWX4的VBA插件开发{一}前言及最简单的小程序写法
  10. Maven下载安装与配置IDEA
  11. Windows明文密码获取
  12. DFS+记忆化搜索 -- 简单练习
  13. Android 二维码的扫码功能实现(一)
  14. Python如何打印出26个大写字母和26个小写字母
  15. Tomcat服务器日志输出格式设置
  16. FIR窗函数和IIR模拟、数字滤波器的MATLAB实现
  17. 学渣的刷题之旅 leetcode刷题 1.两数之和
  18. SQL Server 数据库实验课第七周——授权:授予与收回
  19. nginx配置连接数及限制客户端请求
  20. Python实现京东价格监控

热门文章

  1. python入门之运算符的使用第一关_python基础教程之python 学习第四天|python基础教程|python入门|python教程...
  2. 翻译: Swift 中信号量的美妙之处
  3. 容器技术Docker K8s 46 Serverless Kubernetes(ASK)详解-场景应用
  4. 算法导论的道与术、工程师思维奠定能走多远
  5. linux sysvinit 机制,Linux基于SysVinit和systemd实现开机自启动服务
  6. 222.完全二叉树的节点个数
  7. Python sys.path、sys.modules模块介绍
  8. 霍夫变换 文本图片倾斜矫正 python实现
  9. linux重新识别逻辑卷,教你认识LVM逻辑卷
  10. 67.二进制求和 (力扣leetcode) 博主可答疑该问题