动态调用WebService(传对象返回接受对象)
基础属性
//客户端代理服务命名空间,可以设置成需要的值。
string ns = string.Format("WindowsForms");
private Assembly assembly;
// 服务端程序Assembly
public Assembly Assembly
{
get { return assembly; }
set { assembly = value; }
}
private object agent;
//获取服务端程序集
public object Agent
{
get { return agent; }
set { agent = value; }
} private Type agentType;
//获取程序集类型
public Type AgentType
{
get { return agentType; }
set { agentType = value; }
}
下面是构造函数,自己命名
public 构造函数(string url)
{
//获取WSDL
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(url + "?WSDL");
ServiceDescription sd = ServiceDescription.Read(stream);//服务的描述信息都可以通过ServiceDescription获取
string classname = sd.Services[].Name;
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, "", "");
CodeNamespace cn = new CodeNamespace(ns);
//生成客户端代理类代码
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
CSharpCodeProvider csc = 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 = csc.CompileAssemblyFromDom(cplist, ccu);
if (cr.Errors.HasErrors == true)
{
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());
}
Assembly = cr.CompiledAssembly;
AgentType = Assembly.GetType(ns + "." + classname, true, true);
Agent = Activator.CreateInstance(agentType);
}
两个函数用于,转对象和对象赋值
/// <summary>
/// 获取存在的对象并赋值
/// </summary>
/// <param name="methodName"></param>
/// <returns></returns>
public object SerializeObj<T>(string propertieName, T t)
{
Type ObjType = Assembly.GetType(ns + "." + propertieName, true, true);
object obj = Activator.CreateInstance(ObjType);
if (obj == null) throw new Exception("no " + propertieName);
var Types = t.GetType();//获得类型
Type tt = obj.GetType();
foreach (PropertyInfo sp in Types.GetProperties())//获得类型的属性字段
{
FieldInfo fi = tt.GetField(sp.Name);
if (fi != null)
{
fi.SetValue(obj, sp.GetValue(t, null));
}
}
return obj;
}
/// <summary>
/// 获取的Service程序集对象并赋值
/// </summary>
public void DeserializeObj<T>(T t, object obj)
{
var Types = t.GetType();//获得类型
Type tt = obj.GetType();
foreach (PropertyInfo sp in Types.GetProperties())//获得类型的属性字段
{
FieldInfo fi = tt.GetField(sp.Name);
if (fi != null)
{
sp.SetValue(t, fi.GetValue(obj), null);
}
}
}
最后Demo调用
//返回对象并把数据赋值到指定对象
WebServicesWsdl WebService = new WebServicesWsdl("WebService.asmx");
Field = "";
Fields = new object[] { Field };
_return = WebService.GetMethod("函数名称", Fields);
Model model = new Model();
WebService.DeserializeObj<Model >(model, _return);
//将对象当参数传过去
WebServicesWsdl WebInterface = new WebServicesWsdl("WebInterface.asmx");
var Field = WebInterface.SerializeObj<Model>("对象名称", model);
object[] Fields = new object[]{ Field };
object _return = WebInterface.GetMethod("函数名称", Fields);
动态调用WebService(传对象返回接受对象)的更多相关文章
- 动态调用WebService(C#) (非常实用)
通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...
- 动态调用WebService(C#)
通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...
- 用C#通过反射实现动态调用WebService 告别Web引用(转载)
我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...
- C# .NET 动态调用webservice的三种方式
转载自 百度文库 http://wenku.baidu.com/link?url=Q2q50wohf5W6UX44zqotXFEe_XOMaib4UtI3BigaNwipOHKNETloMF4ax4W ...
- 用C#通过反射实现动态调用WebService 告别Web引用
我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...
- 动态调用Webservice 支持Soapheader身份验证(转)
封装的WebserviceHelp类: using System; using System.CodeDom; using System.CodeDom.Compiler; using System. ...
- [转]Net 下采用GET/POST/SOAP方式动态调用WebService C#实现
本文转自:http://www.cnblogs.com/splendidme/archive/2011/10/05/2199501.html 一直以来,我们都为动态调用WebService方法而烦恼. ...
- .Net 下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#) [轉]Redfox
一直以来,我都为动态调用WebService方法而烦恼.在.Net环境下,最常用的方法就是采用代理类来调用WebService,可以通过改变代理类的Url属性来实现动态调用,但当xmlns改变时就会出 ...
- Java动态调用webService,axis2动态调用webService
Java动态调用webService axis2动态调用webService >>>>>>>>>>>>>>>& ...
随机推荐
- 日积月累--Lock锁机制
对象监视器 什么是监视器? 监视器可以看做是经过特殊布置的建筑,这个建筑有一个特殊的房间,该房间通常包含一些数据和代码,但是一次只能一个消费者(thread)使用此房间, 当一个消费者(线程)使用了这 ...
- goroutine和channel
近期在学习golang的goroutine和channel时候有一些疑惑: 带缓冲的channel和不带缓冲的channel有什么区别? goroutine和主进程的有哪些影响和关系? 多个gorou ...
- 在Linux系统上安装Oracle数据库
前期准备:我用的是虚拟机上的CentOS 64位系统.所以需要设置网卡,时间,EPEL源,安装一些必备的软件. 1.1在虚拟机上安装好Linux系统后选择虚拟机设置—>网络适配器—>网络连 ...
- protel dxp 2004安装与破解
安装准备 压缩文件包内容: dxp2004汉化补丁 dxp2004元件库 Network License Setup网络版注册机 Protel DXP2004原程序 Protel2004_sp2_单机 ...
- java 反射简说
1 Class类 就是类的类型.研究反射先了解下Class类. 获取类的类型的三种方法: Class c1 = 对象.getClass(); Class c2 = Class.forName(&quo ...
- 解决tomcat同时部署两个SpringBoot应用提示InstanceAlreadyExistsException
问题描述:Caused by: javax.management.InstanceAlreadyExistsException: com.alibaba.druid.pool:name=primary ...
- [C# 基础知识系列]专题二:委托的本质论 (转载)
引言: 上一个专题已经和大家分享了我理解的——C#中为什么需要委托,专题中简单介绍了下委托是什么以及委托简单的应用的,在这个专题中将对委托做进一步的介绍的,本专题主要对委本质和委托链进行讨论. 一.委 ...
- SQL数据库中查询中加N'' 前缀是什么意思
It's declaring the string as nvarchar data type, rather than varchar You may have seen Transact-SQL ...
- 总结React写参数的几种方式
1.在render方法内 class Text extends Component{ render(){ const data=[1,2,3]; return( { data.map((item,in ...
- 获取choice的value