• 动态调用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());
    }
    }
    }

     

  • 相关阅读:
    SDN第二次上机作业
    全面而清晰的网络流
    source命令详解
    C++ 优先队列存放自定义类型的指针时自定义优先级失效的解决方法
    find命令查找文件和文件夹
    OOAD
    NULL与nullptr
    Segment fault 常见原因
    虚函数的用法
    使用gdb调试段错误
  • 原文地址:https://www.cnblogs.com/ccccc05/p/4330096.html
Copyright © 2020-2023  润新知