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. 微信小程序首次官方分享的纪要

    先交代备注: 这次有关小程序的分享只有技术的 QA环节,其他如产品.入口.流量.与公众号的整合等等,回答都是暂时无法给出答案或不确定: 小程序最终发布时间官方也还未确定,不过说应该就是近期: 小程序的 ...

  2. jQuery +ajax +json+实现分页

    正文 首先我们创建一般处理程序,来读取数据库中内容,得到返回值. 创建文件,GetData.ashx. 我这里是用的存储过程,存储过程会再下面粘出来,至于数据只是实例,你们可根据需求自行读取数据 代码 ...

  3. HTML5_05之SVG扩展、地理定位、拖放

    1.SVG绘图总结: ①方法一:已有svg文件,<img src="x.svg">  方法二:<body><svg></svg>&l ...

  4. javascript继承的三种模式

    javascript继承一般有三种模式:组合继承,原型式继承和寄生式继承: 1组合继承:javascript最为广泛的继承方式通过原型链实现对原型属性和方法的继承,通过构造函数实现对实例属性的继承,同 ...

  5. 龙之谷手游WebVR技术分享

    主要面向Web前端工程师,需要一定Javascript及three.js基础:本文主要分享内容为基于three.js开发WebVR思路及碰到的问题:有兴趣的同学,欢迎跟帖讨论. 目录:一.项目体验1. ...

  6. iOS开发之三个Button实现图片无限轮播(参考手机淘宝,Swift版)

    这两天使用Reveal工具查看"手机淘宝"App的UI层次时,发现其图片轮播使用了三个UIButton的复用来实现的图片循环无缝滚动.于是乎就有了今天这篇博客,看到“手机淘宝”这个 ...

  7. PHP的学习--使用phar打包

    前段时间写了几个PHP的脚本,但是因为脚本的项目是基于composer安装的,给别人使用的时候不太方便,就希望能够打包成一个能直接使用的文件. 搜索了一下,发现可以使用phar打包. 假设我们有如下一 ...

  8. java代码的初始化过程研究

        刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻……)但 ...

  9. DataAccess通用数据库访问类,简单易用,功能强悍

    以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...

  10. 用VS Code写Python程序

    安装python 常见的Linux发行版本中已经安装了python,而且可能不止一个版本,以Ubuntu14.04为例,预装的python有2个版本,分别是2.7.6和3.4.3,python2和py ...