C#动态调用webservice方法
摘 自: 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方法的更多相关文章
- 动态调用WebService方法
好像很多人做WebService的时候都是直接添加引用的方式,然后调用服务端的方法.这样就个问题,就是每次我服务端添加了方法或者修改了方法后都要更新Web引用,这样比较麻烦.下面给一个不用添加引用 ...
- .Net 下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#) [轉]Redfox
一直以来,我都为动态调用WebService方法而烦恼.在.Net环境下,最常用的方法就是采用代理类来调用WebService,可以通过改变代理类的Url属性来实现动态调用,但当xmlns改变时就会出 ...
- [转]Net 下采用GET/POST/SOAP方式动态调用WebService C#实现
本文转自:http://www.cnblogs.com/splendidme/archive/2011/10/05/2199501.html 一直以来,我们都为动态调用WebService方法而烦恼. ...
- 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法
[导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS201 ...
- Atitit 动态调用webservice与客户端代理方式调用
Atitit 动态调用webservice与客户端代理方式调用 方式1: 使用call.invoke 直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解 ...
- 动态调用WebService(C#) (非常实用)
通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...
- 动态调用webservice(部分转载)
动态调用webservice,做个笔记: public class WSHelper { /// < summary> /// 动态调用web服务 /// < /summary> ...
- C# 动态调用webservice
最近项目中,用到动态调用webservice的内容,此处记录下来,留着以后COPY(我们只需要在XML,config文件,或者数据库中配置webservice连接地址和方法名即可使用): using ...
- 动态调用webservice及WCF服务
动态调用web服务,该方法只针对Web service, WCF的服务不行,如果是WCF的就通过工具直接生产代理类,把代理类配置到调用的项目中,通过配置客户端的终结点动态的取实现: 通过Svcutil ...
随机推荐
- DBUtile
DBUtils是Python的一个用于实现数据库连接池的模块. 模式: - 每个线程创建一个连接,关闭(默认不关闭),线程终止时,才关闭连接. - 创建共享连接池 应用:只要写原生SQL,用户数据框连 ...
- 论文笔记 《Maxout Networks》 && 《Network In Network》
论文笔记 <Maxout Networks> && <Network In Network> 发表于 2014-09-22 | 1条评论 出处 maxo ...
- hdu 1247 (字典树入门)
Hat’s Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- Linux下cp命令的使用说明
[root@www ~]# cp [-adfilprsu] 来源档(source) 目标档(destination)[root@www ~]# cp [options] source1 source2 ...
- 我的第一个web开发框架
怎么才能成为一名架构师?需要具备哪些条件? 作为一名码农我迫切希望自己成为一个比较合格的web架构师,昨晚心血来潮小弟花了4个小时的时间整了个简易的web开发框架,本着开源的精神做个分享,希望和更多的 ...
- CentOS7.5安装配置Oh-My-Zsh
一.安装 首先安装zshyum -y install zsh 下载 oh-my-zsh 项目来帮我们配置 zsh,采用wget安装(需要先安装git)sh -c "$(wget https: ...
- 解决Django在mariadb创建的表插入中文乱码的问题
1.确保你的mariadb数据库的character_set_connection.character_set_database.character_set_server的编码均为utf8 Maria ...
- nginx安装及配置文件详解
一)nginx安装及模块讲解 1.1.nginx安装步骤 mkdir /soft wget http://nginx.org/download/nginx-1.12.0.tar.gz tar zxf ...
- (error) DENIED Redis is running in protected mode because protected mode is enabled
在通过Java程序链接配置好的redis服务时出现 DENIED Redis is running in protected mode because protected mode is enable ...
- 归并排序(MergeSort)
原帖:http://blog.csdn.net/magicharvey/article/details/10192933 算法描述 归并排序(MergeSort)是采用分治法的一个非常典型的应用.通过 ...