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 ...
随机推荐
- "GrabCut" - Interactive Foreground Extraction using Iter
转载自:http://blog.csdn.net/zouxy09/article/details/8534954 有源代码的博客:http://www.cnblogs.com/xrwang/archi ...
- AC日记——小魔女帕琪 洛谷 P3802
小魔女帕琪 思路: 概率公式计算: 代码: #include <bits/stdc++.h> using namespace std; ],sig; int main() { ;i< ...
- 五十 常用第三方模块 PIL
PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 由于PIL仅支持到Python 2.7,加上年久失修 ...
- Python进程间通信:Queue
Python进程间通信Queue 1.Queue使用方法: Queue.qsize():返回当前队列包含的消息数量: Queue.empty():如果队列为空,返回True,反之False : Que ...
- Vue生命周期总结
查看生命周期图 <!DOCTYPE html> <html> <head> <title></title> <meta http-eq ...
- Mybatis框架-1
1.Mybatis框架: Mybatis是一个半自动的对象关系映射(ORM),实现结果集的自动封装,sql写到配置文件中: Mybatis使用的是DTD约束. 2.Mybatis模块调用: 3.Sql ...
- 虚拟机Visualbox安装CentOS
选择安装CentOS系统 进入了安装界面,选择语言,并选择继续 安装的主界面 1.先选择日期时间,选择了亚洲,并选择上海,再点击左上角的完成按钮 2.再选择键盘,选择英文 3.选择语言为英语 4.选择 ...
- LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))
#6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给 ...
- 洛谷P3216 [HNOI2011] 数学作业 [矩阵加速,数论]
题目传送门 数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N和 M,要求计算 Concatenate (1 .. N)Mod M 的值,其中 C ...
- Thupc2017"礼"?
题面 先粘上gouzhi的题面,听说是thupc的题 [问题背景] 情人节要到了,zhx 要给女朋友买礼物. [问题描述] 橱窗里摆放了 n 种不同的玩偶,购买第 i 种玩偶需要价格 a[i],价值为 ...