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的更多相关文章

  1. Atitit 动态调用webservice与客户端代理方式调用

    Atitit 动态调用webservice与客户端代理方式调用 方式1: 使用call.invoke  直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解 ...

  2. 动态调用WebService(C#) (非常实用)

    通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...

  3. 动态调用webservice(部分转载)

    动态调用webservice,做个笔记: public class WSHelper { /// < summary> /// 动态调用web服务 /// < /summary> ...

  4. C# 动态调用webservice

    最近项目中,用到动态调用webservice的内容,此处记录下来,留着以后COPY(我们只需要在XML,config文件,或者数据库中配置webservice连接地址和方法名即可使用): using ...

  5. 动态调用webservice及WCF服务

    动态调用web服务,该方法只针对Web service, WCF的服务不行,如果是WCF的就通过工具直接生产代理类,把代理类配置到调用的项目中,通过配置客户端的终结点动态的取实现: 通过Svcutil ...

  6. C# .NET 动态调用webservice的三种方式

    转载自 百度文库 http://wenku.baidu.com/link?url=Q2q50wohf5W6UX44zqotXFEe_XOMaib4UtI3BigaNwipOHKNETloMF4ax4W ...

  7. WebService – 2.动态调用WebService

    在本节课程中,将演示如何通过程序动态添加.调用.编译.执行WebService并返回结果. WebService动态调用示意图 WebService相关知识 代码文档对象模型CodeDom的使用 编程 ...

  8. 用C#通过反射实现动态调用WebService 告别Web引用

    我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...

  9. 动态调用Webservice 支持Soapheader身份验证(转)

    封装的WebserviceHelp类: using System; using System.CodeDom; using System.CodeDom.Compiler; using System. ...

  10. [转]Net 下采用GET/POST/SOAP方式动态调用WebService C#实现

    本文转自:http://www.cnblogs.com/splendidme/archive/2011/10/05/2199501.html 一直以来,我们都为动态调用WebService方法而烦恼. ...

随机推荐

  1. AVL树原理及实现(C语言实现以及Java语言实现)

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好 ...

  2. 开源组件ExcelReport 1.5.2 使用手册

    ExcelReport是一款基于NPOI开发的报表引擎组件.它基于关注点分离的理念,将数据与样式.格式分离.让模板承载样式.格式等NPOI不怎么擅长且实现繁琐的信息,结合NPOI对数据的处理的优点将E ...

  3. SQL Server-聚焦强制索引查询条件和Columnstore Index(九)

    前言 本节我们再来穿插讲讲索引知识,后续再讲数据类型中的日期类型,简短的内容,深入的理解,Always to review the basics. 强制索引查询条件 前面我们也讲了一点强制索引查询的知 ...

  4. Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  5. C# Excel数据有效性

    C# Excel数据有效性 在Excel中,我们可以使用数据有效性功能来定义哪些数据可以被输入到工作表的单元格中,例如,限制输入的数据为一定范围内的数字或使用下拉列表来限制用户可选择的数据等.这篇文章 ...

  6. JavaScript学习总结(四)——jQuery插件开发与发布

    jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...

  7. 【基于WinForm+Access局域网共享数据库的项目总结】之篇二:WinForm开发扇形图统计和Excel数据导出

    篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...

  8. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  9. C# 系统托盘图标

    C# 系统托盘图标 WPF NotifyIcon 资料 网址: http://www.codeproject.com/Articles/36468/WPF-NotifyIcon http://www. ...

  10. FunDA(0)- Functional Data Access accessible to all

    大数据.多核CPU驱动了函数式编程模式的兴起.因为函数式编程更适合多线程.复杂.安全的大型软件编程.但是,对许多有应用软件开发经验的编程者来说,函数式编程模式是一种全新的.甚至抽象的概念,可能需要很长 ...