动态调用WebService
WebService内容
using Microsoft.CSharp;
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Web;
using System.Web.Services.Description;
/// <summary>
/// CallWebService 的摘要说明
/// </summary>
public class CallWebService
{
public CallWebService()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#region InvokeWebService
/// < summary>
/// 动态调用web服务
/// < /summary>
/// < param name="url">WSDL服务地址(WebService的http形式的地址)< /param>
/// < param name="methodname">欲调用的WebService的方法名< /param>
/// < param name="args">参数< /param>
/// < returns>< /returns>
/// <example>
/// <code>
/// 使用方法
/// string url = "http://90.10.1.51/Service.asmx";
/// string[] args = new string[1];
/// args[0] = "P000001";
/// object result = CallWebService.InvokeWebService(url, "PDAService", null);
/// </code>
/// </example>
public static object InvokeWebService(string url, string methodname, object[] args)
{
return InvokeWebService(url, null, methodname, args);
}
/// < summary>
/// 动态调用web服务
/// < /summary>
/// < param name="url">WSDL服务地址(WebService的http形式的地址)< /param>
/// < param name="classname">欲调用的WebService的类名(不包括命名空间前缀)< /param>
/// < param name="methodname">欲调用的WebService的方法名< /param>
/// < param name="args">参数< /param>
/// < returns>< /returns>
public static object InvokeWebService(string url, string classname, string methodname, object[] args)
{
//欲调用的WebService的命名空间(不知道的可以通过类视图查看)
string @namespace = "PDAWeb";
if ((classname == null) || (classname == ""))
{
classname = GetWsClassName(url);
}
try
{
//一、使用 WebClient 下载 WSDL 信息,获取服务描述语言(WSDL)
//提供向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(url + "?WSDL");
/*下表描述从资源下载数据的 WebClient 方法.相对应的是上载到资源的 WebClient 方法。
* OpenRead 资源以 Stream 的形式返回数据,对应与OpenWrite()
* OpenReadAsync 在不阻止调用线程的情况下,从资源返回数据
* DownloadData 从资源下载数据并返回 Byte 数组。
* DownloadDataAsync 在不阻止调用线程的情况下,从资源下载数据并返回 Byte 数组。
* DownloadFile 从资源将数据下载到本地文件。
* DownloadFileAsync 在不阻止调用线程的情况下,将数据从资源下载到本地文件。
* DownloadString 从资源下载 String 并返回 String。
* DownloadStringAsync 在不阻止调用线程的情况下,从资源下载 String
*/
//创建和格式化 WSDL 文档。
//ServiceDescription 类与 WSDL 文件的根元素 definitions 相对应。
ServiceDescription sd = ServiceDescription.Read(stream);
//创建客户端代理代理类。
//使用 ServiceDescriptionImporter 类可以方便地将 WSDL 说明中包含的信息导入到System.CodeDom.CodeCompileUnit 对象
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
//sdi.ProtocolName = "Soap"; // 指定访问协议。
//sdi.Style = ServiceDescriptionImportStyle.Client; // 生成客户端代理。
//sdi.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
//添加 WSDL 文档。
sdi.AddServiceDescription(sd, "", "");
//使用 CodeDom 编译客户端代理类。
//为代理类添加命名空间,缺省为全局空间。
CodeNamespace cn = new CodeNamespace(@namespace);
//二、生成客户端代理类代码
/*CodeCompileUnit 包含以下几个集合:可以存储包含
* CodeDOM 源代码图形的 CodeNamespace 对象的集合、项目引用的程序集的集合,
* 以及项目程序集的属性集合。
*/
CodeCompileUnit ccu = new CodeCompileUnit();
// Add the new namespace to the compile unit.
ccu.Namespaces.Add(cn);
//导入指定的 ServiceDescriptions 值,并将按照 Style 属性的指定来生成代码。
// Add the new namespace import for the System namespace
sdi.Import(cn, ccu);
CSharpCodeProvider icc = 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");
CompilerParameters parameter = new CompilerParameters();
parameter.GenerateExecutable = false;
parameter.OutputAssembly = "test.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 cr = icc.CompileAssemblyFromDom(cplist, ccu);
if (true == cr.Errors.HasErrors)
{
StringBuilder sb = new StringBuilder();
foreach (CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(Environment.NewLine);
}
throw new Exception(sb.ToString());
}
//五、生成代理实例,并调用方法
Assembly assembly = cr.CompiledAssembly;
// 如果在前面为代理类添加了命名空间,此处需要将命名空间添加到类型前面。
Type t = assembly.GetType(@namespace + "." + classname, true, true);
//包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用
object obj = Activator.CreateInstance(t);
//发现方法的属性 (Attribute) 并提供对方法元数据的访问。
MethodInfo mi = t.GetMethod(methodname);
return mi.Invoke(obj, args);
/*
PropertyInfo propertyInfo = type.GetProperty(propertyname);
return propertyInfo.GetValue(obj, null);
*/
}
catch (Exception ex)
{
throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
}
}
/// <summary>
/// 获取webService类名
/// </summary>
/// <param name="wsUrl"></param>
/// <returns></returns>
private static string GetWsClassName(string wsUrl)
{
string[] parts = wsUrl.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}
#endregion
}
调用页面内容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
try
{
string url = "http://90.10.1.51/Service.asmx";
//string[] args = new string[1];
//args[0] = "P000001";
object result = CallWebService.InvokeWebService(url, "PDAService", null);
Response.Write(result.ToString());
}
catch (Exception ex)
{
Response.Write(ex.Message.ToString());
}
}
}
动态调用WebService的更多相关文章
- 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 ...
- C# .NET 动态调用webservice的三种方式
转载自 百度文库 http://wenku.baidu.com/link?url=Q2q50wohf5W6UX44zqotXFEe_XOMaib4UtI3BigaNwipOHKNETloMF4ax4W ...
- WebService – 2.动态调用WebService
在本节课程中,将演示如何通过程序动态添加.调用.编译.执行WebService并返回结果. WebService动态调用示意图 WebService相关知识 代码文档对象模型CodeDom的使用 编程 ...
- 用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方法而烦恼. ...
随机推荐
- Entity Framework 与 面向对象
说要分享,我了个*,写了一半放草稿箱了两个星期都快发霉了,趁着周末写完发出来吧. 文章分为五部分: 基础.类讲述的是用到的一些EF与面向对象的基础: 业务是讲怎么划分设计业务: 设计模式和工作模式讲述 ...
- VirtualBox 桥接上网方式的配置
最近在搞Redis所以装了个virtualbox的ubuntu的虚拟机, redis不是在ubuntu上. 因为需要使用本机客户端访问redis服务,所以需要配置虚拟机和本地机器的双向访问,所以就用到 ...
- C#中的委托解析
谈及到C#的基本特性,“委托”是不得不去了解和深入分析的一个特性.对于大多数刚入门的程序员谈到“委托”时,都会想到“将方法作为方法的参数进行传递”,很多时候都只是知道简单的定义,主要是因为“委托”在理 ...
- 用php实现一个简单的链式操作
最近在读<php核心技术与最佳实践>这本书,书中第一章提到用__call()方法可以实现一个简单的字符串链式操作,比如,下面这个过滤字符串然后再求长度的操作,一般要这么写: strlen( ...
- 【分布式】Zookeeper服务端启动
一.前言 前面已经了解了Zookeeper会话相关知识点,接着来学习Zookeeper服务端相关细节. 二.服务端 服务端整体架构如下 Zookeeper服务器的启动,大致可以分为以下五个步骤 1. ...
- PHP实现查询Memcache内存中的所有键与值
使用Memcache时,我们可以用memcache提供的get方法,通过键查询到当前的数据,但是有时候需要查询内存中所有的键和值,这个时候可以使用下面的代码实现: <?php /** * Cre ...
- PHP实现全排列(递归算法)
算法描述:如果用P表示n个元素的全排列,而Pi表示n个元素中不包含元素i的全排列,(i)Pi表示在排列Pi前面加上前缀i的排列,那么n个元素的全排列可递归定义为: ① 如果n=1,则排列P只有一 ...
- IE6+未知尺寸元素水平垂直居中
首先讨论在IE8以上(也就是支持伪元素after的基础上)的2种情况 当有一段不知道长度大小的文字在你面前,你需要使它垂直居中的时候,你肯定会想到:1.text-align:center;水平居中没错 ...
- thinkphp怎么修改配置进入默认首页
thinkphp文件夹下config 里面有个convention.php文件 里面有三个配置 'DEFAULT_MODULE' => 'Home', // 默认模块 'DEFAULT_CONT ...
- JavaWeb_day02_登录校验_查询所有员工信息_DeBug
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! WEB_day02 servlet 协议转对象 服务器 ...