摘 自: http://www.hao5191.cn/a/chengxukaifa/c_/20130109/115819.html

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Web.Services.Description;
using System.Xml.Serialization;
using System.CodeDom; namespace CN100.Member.Utility
{
public class WebServiceHelper
{
private static WebServiceHelper webService = null; public static WebServiceHelper Instance(string webServiceUrl, string NamSpace)
{
if (webService == null)
{
webService = new WebServiceHelper(webServiceUrl, NamSpace);
}
return webService;
} private WebServiceHelper()
{ } /// <summary>
/// webService地址
/// </summary>
public string ServerUrl
{
get;
set;
} /// <summary>
/// 调用类命名空间
/// </summary>
public string NameSpace
{
get;
set;
} private WebServiceHelper(string webServiceUrl, string namSpace)
{
ServerUrl = webServiceUrl;
NameSpace = namSpace;
} /// <summary>
/// 生成动态引用DLL
/// </summary>
/// <returns></returns>
public bool GenerateWebService()
{
WebClient client = new WebClient();
String url = ServerUrl + "?WSDL";//这个地址可以写在Config文件里面,,这里取出来就行了.在原地址后面加上: ?WSDL
Stream stream = client.OpenRead(url);
ServiceDescription description = ServiceDescription.Read(stream);
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//创建客户端代理代理类。
importer.ProtocolName = "Soap"; //指定访问协议。
importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理。
importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
importer.AddServiceDescription(description, null, null); //添加WSDL文档。
CodeNamespace nmspace = new CodeNamespace(); //命名空间
nmspace.Name = NameSpace;
CodeCompileUnit unit = new CodeCompileUnit();
unit.Namespaces.Add(nmspace); ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); CompilerParameters parameter = new CompilerParameters();
parameter.GenerateExecutable = false;
parameter.OutputAssembly = NameSpace + ".dll";//输出程序集的名称
parameter.ReferencedAssemblies.Add("System.dll");
parameter.ReferencedAssemblies.Add("System.XML.dll");
parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
parameter.ReferencedAssemblies.Add("System.Data.dll"); CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
if (result.Errors.HasErrors)
{
// 显示编译错误信息
return false;
}
return true;
} private Assembly LoadAssembly(string nameSpace)
{
Assembly asm = null;
try
{
asm=Assembly.LoadFrom(nameSpace + ".dll");//加载前面生成的程序集
}
catch (FileNotFoundException ex)
{
if (GenerateWebService())
{
asm=Assembly.LoadFrom(nameSpace + ".dll");//加载前面生成的程序集
}
}
catch (Exception e)
{
throw e;
}
return asm;
} /// <summary>
/// 执行无返回值方法
/// </summary>
/// <param name="methodName"></param>
/// <param name="nameSpace"></param>
/// <param name="args"></param>
public void ExcuteMethod(string methodName,string nameSpace,params object[] args)
{
Assembly asm = LoadAssembly(nameSpace);
Type t = asm.GetType(nameSpace);
object o = Activator.CreateInstance(t);
MethodInfo method = t.GetMethod(methodName);
method.Invoke(o, args);
} public void ExcuteMethod(string methodName,params object[] args)
{
string nameSpace = NameSpace;
ExcuteMethod(methodName, nameSpace, args);
} /// <summary>
/// 执行带返回值方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="methodName"></param>
/// <param name="nameSpace"></param>
/// <param name="args"></param>
/// <returns></returns>
public T ExcuteMethod<T>(string methodName, string nameSpace,params object[] args)
{
Assembly asm = LoadAssembly(nameSpace);
Type t = asm.GetType(nameSpace);
object o = Activator.CreateInstance(t);
MethodInfo method = t.GetMethod(methodName);
T result = (T)method.Invoke(o, args);
return result;
} public T ExcuteMethod<T>(string methodName,params object[] args)
{
string nameSpace=NameSpace;
return ExcuteMethod<T>(methodName, nameSpace, args);
} }
}

C#动态调用webservice方法的更多相关文章

  1. 动态调用WebService方法

      好像很多人做WebService的时候都是直接添加引用的方式,然后调用服务端的方法.这样就个问题,就是每次我服务端添加了方法或者修改了方法后都要更新Web引用,这样比较麻烦.下面给一个不用添加引用 ...

  2. .Net 下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#) [轉]Redfox

    一直以来,我都为动态调用WebService方法而烦恼.在.Net环境下,最常用的方法就是采用代理类来调用WebService,可以通过改变代理类的Url属性来实现动态调用,但当xmlns改变时就会出 ...

  3. [转]Net 下采用GET/POST/SOAP方式动态调用WebService C#实现

    本文转自:http://www.cnblogs.com/splendidme/archive/2011/10/05/2199501.html 一直以来,我们都为动态调用WebService方法而烦恼. ...

  4. 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法

    [导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS201 ...

  5. Atitit 动态调用webservice与客户端代理方式调用

    Atitit 动态调用webservice与客户端代理方式调用 方式1: 使用call.invoke  直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解 ...

  6. 动态调用WebService(C#) (非常实用)

    通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...

  7. 动态调用webservice(部分转载)

    动态调用webservice,做个笔记: public class WSHelper { /// < summary> /// 动态调用web服务 /// < /summary> ...

  8. C# 动态调用webservice

    最近项目中,用到动态调用webservice的内容,此处记录下来,留着以后COPY(我们只需要在XML,config文件,或者数据库中配置webservice连接地址和方法名即可使用): using ...

  9. 动态调用webservice及WCF服务

    动态调用web服务,该方法只针对Web service, WCF的服务不行,如果是WCF的就通过工具直接生产代理类,把代理类配置到调用的项目中,通过配置客户端的终结点动态的取实现: 通过Svcutil ...

随机推荐

  1. MySQL中的内连接、外连接、交叉连接

    内连接(INNER JOIN):   分为三种 等值连接.自然连接.不等连接        外连接(OUTER JOIN):   左外连接(LEFT OUTER JOIN或LEFT JOIN)   右 ...

  2. Linux和Windows双系统安装要点

    这里主要说下CentOS和Windows7的双系统安装遇到的一些问题 一.磁盘分区 这个不得不说下在Windows下坑爹的设定了,如果是用默认的磁盘划分,系统会自己先划出一个100M左右的区,关键还是 ...

  3. Docker 常用命令收集

    查看Docker版本 docker version 查看 Image docker images 打包 Image docker save -o ‘packageName.tar’ ‘imageNam ...

  4. python数据库编程_sqlite

    原文请看:http://blog.csdn.net/jj_liuxin/article/details/3584448 sqlite是一个轻量级的数据库,与很多大型的数据库(例如DB2,Oracle, ...

  5. python 理解高阶函数

    高阶函数 高阶函数英文叫Higher-order function.什么是高阶函数? 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用abs(): >>> a ...

  6. Ubuntu 16.04LTS 常用软件安装

    一.遇到的问题 1.su认证失败 sudo passwd //输入命令,然后修改密码即可 2.移动启动器 gsettings set com.canonical.Unity.Launcher laun ...

  7. 初识Ant-Design

    设计价值观 Ant-Design在设计方面,存在两个大的价值观,自然和确定.自然即顺其自然,在顺应用户的自我感知和行为方式来开发更自然的产品.确定即探索设计规律,并将其抽象成对象,减少设计者的主观干扰 ...

  8. FeignClient与RestTemplate的区别比较简单研究

    题外:个人觉得可能还没达到那种境界,还体会不到真正的实质性区别,就好比用HttpClient可以实现的用FeignClient同样可以实现,反之也是. JAVA 项目中接口调用怎么做 ? Httpcl ...

  9. minGW cygwin gnuwin32

    首先,三个的官方网站分别是: minGW:http://www.mingw.org cygwin:  http://www.cygwin.com gnuwin32:  https://sourcefo ...

  10. JavaScript基础入门教程(三)

    说明 前面的两篇博客介绍了js中的基本知识中的变量类型.标识符等.这篇博客主要谈表达式以及运算符. 原始表达式 原始表达式就是表达式中最小的,不能在分割的表达式,一般指变量.常数直接量.关键字(tru ...