动态调用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 >>>>>>>>>>>>>>>& ...
随机推荐
- NOIP2007奖学金题解——洛谷1093
题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高 ...
- java14周
1.web server Web Server中文名称叫网页服务器或web服务器.WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务.Web服务器可以解析( ...
- 花了2小时写bug
程序员的工作,写bug,修bug,改bug 写了2小时逻辑关系,没写明白 比昨天多了一个返回上一层的功能 也很简单,清除下数组内容即可 emm..明天继续深究吧 dic = { "植物&qu ...
- python-2018.03.03
本周用python实现了 1.通过svn模块检出远程代码到本地(ps:修改了windows svn的一个编码模块的小bug),并通过调用MSbuild 编译.发布并打包发布后的代码 (注:以上需要安装 ...
- C语言的AT指令
今天跟人聊嵌入式,对面是某国际硬盘生产商的嵌入式软件工程师,问了我很简单的问题,如何快速将一个变量赋给某个特定的地址. 按我们思路就是unsigned *a = address1: *a = add ...
- python3学习笔记及常见问题
1,mac自带的python是2.7版本,我们需要按照python3,这样在terminal下可以直接使用,但是编译打包的时候会默认使用python2.7 解决办法:安装virtualenv,一个管理 ...
- [转载]JS中 map, filter, some, every, forEach, for in, for of 用法总结
转载地址:http://codebay.cn/post/2110.html 1.map 有返回值,返回一个新的数组,每个元素为调用func的结果. let list = [1, 2, 3, 4, 5] ...
- php 浏览记录功能
/** * 历史浏览记录 * $data array 浏览记录里作品的必要信息 */ private function _history($data){ if(!$data || !is_array( ...
- thinkphp5.0--编写api,返回json格式
前几天没有写php代码,今天写了一下,今天的任务主要是构建自己的异常体系类,出现一个问题,就是返回结果不是json格式,而是一个页面,我找了一两个小时,没有找到问题,以为代码的问题,用断点调试了一通, ...
- 多线程系列之自己实现一个 lock 锁
我们面试中经常会被问到多线程相关知识,这一块内容往浅了说大家都会,但是一问到底层实现原理,我们往往就一脸懵逼. 这段时间准备好好学习多线程,接下来会写一系列关于多线程的知识. 我们首先要了解线程,百度 ...