动态调用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 >>>>>>>>>>>>>>>& ...
随机推荐
- The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
好久没有冒泡了,最近在新环境上搭建应用时,启动报错: INFO: Illegal access: this web application instance has been stopped alre ...
- centos 系统上如何把python升级为3
第一种方式: SCL 源目前由 CentOS SIG 维护,除了重新编译构建 Red Hat 的 Software Collections 外,还额外提供一些它们自己的软件包. 该源中包含不少程序的更 ...
- java后端的知识学习
有良好的计算机基础知识,熟悉计算机网络技术以及常用的设计模式:有扎实的 Java 语言基础,熟悉 Java 多线程编程技术.JVM 虚拟机原理:熟悉J2EE体系架构,熟悉WebService.Spri ...
- 如何使用HTML5的WebSocket实现网页与服务器的双工通信(一)
本系列服务端双工通信包括两种实现方式:一.使用Socket构建:二.使用WCF构建.本文为使用Socket构建服务端的双工通信,客户端同样使用Html5的WebSocket技术进行调用. 一.网页客户 ...
- 求助,我在安装SQL sever2016时遇到了这种情况
哪位大佬能告诉我这怎么解决?多谢!
- JavaScript获取元素尺寸和大小操作总结(转载)
一.获取元素的行内样式 var obj = document.getElementById("test"); alert(obj.height + "\n" + ...
- iOS 跨App数据共享
http://www.jianshu.com/p/169e31cacf42 http://www.jianshu.com/p/7f8472a97aa6 https://segmentfault.com ...
- 【软件安装与环境配置】TX2安装配置caffe过程
Tx2刷机 sudo sh ./caffe_dependency.sh 注意python的版本问题. 问题 LD -o .build_release/lib/libcaffe.so. /usr/bin ...
- C语言权威指南和书单 - 适用于所有级别
注:点击标题免费下载电子书 所有级别 1. The C Programming Language (2nd Edition) 2. C: A Reference Manual (5th Edition ...
- 动态改变Spring定时任务执行频率
@Component@EnableSchedulingpublic class updateCronTask implements SchedulingConfigurer { public stat ...