动态调用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 6 Recipes 2nd Edition(10-4)译 -> 从存储过程返回一个复杂类型
10-4. 从存储过程返回一个复杂类型 问题 想在方法中使用一个返回复杂类型的存储过程 解决方案 假设我们已经有如Figure 10-3.所示的模型,该Employee (雇员)模型包含Employe ...
- Atitit MATLAB 图像处理attilax总结
Atitit MATLAB 图像处理attilax总结 1.1. 下载 Matlab7.0官方下载_Matlab2012 v7.0 官方简体中文版-办公软件-系统大全.html1 1.2. Matla ...
- iOS获取iPhone系统等信息和服务器返回空的异常处理
前言: 在项目中经常会遇到需要获取系统的信息来处理一些特殊的需求和服务端返回为空的处理,写在这里只是笔记一下. 获取设备的信息 NSLog(@"globallyUniqueString=%@ ...
- Linux Hadoop2.7.3 安装(单机模式) 一
Linux Hadoop2.7.3 安装(单机模式) 一 Linux Hadoop2.7.3 安装(单机模式) 二 java环境安装 http://www.cnblogs.com/zeze/p/590 ...
- jQuery系列:DOM操作
1. 访问元素 在访问页面时,需要与页面中的元素进行交互式的操作.在操作中,元素的访问主要包括对元素属性.内容.值.CSS的操作. 1.1 元素属性操作 1.1.1 设置或返回被选元素的属性值 语法格 ...
- Python:认识模块
一.了解 Python 模块: -- 什么是函数: 函数是实现一项或多项功能的一段程序 模块是实现一类功能的程序块,是包含函数和其他语句的脚本文件,以".py"为后缀名 默认,C: ...
- Android 中关于static的使用问题
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5251564.html 项目中,在不停地接收串口数据很长一段时间(几小时)后,会偶然性的报错.初步排除了oom ...
- 【分布式】Zookeeper使用--命令行
一.前言 在学习了Zookeeper相关的理论知识后,下面接着学习对Zookeeper的相关操作. 二.Zookeeper部署 Zookeeper的部署相对来说还是比较简单,读者可以在网上找到相应的教 ...
- Java I/O and NIO [reproduced]
Java I/O and NIO.2---Five ways to maximize Java NIO and NIO.2---Build more responsive Java applicati ...
- 在DevExpress程序中使用内置的图标构建美观的界面元素
在我们一般的程序中,为一般的界面元素添加一定的图标展示,有助于提升界面的整体的美观.结合排版布局,以及固定场景的图标,往往给用户非常好的直观感受:统一.美观.易理解.因此在一般的程序界面中,都尽量在略 ...