• 通过反射动态调用webservices


    该方法可以使程序不通过web引用的方式去调用webservices方法,直接在代码里调用该方法就能达到动态调用webservices的目的。使用前先引用System.Web.Services动态链接库,是.net自带的dll。

    方法如下:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Web.Services.Description;
    using System.CodeDom;
    using Microsoft.CSharp;
    using System.CodeDom.Compiler;

    namespace TestSkin
    {
        
    class Webservices
        {
            
    /// <summary>
            
    /// 实例化WebServices
            
    /// </summary>
            
    /// <param name="url">WebServices地址</param>
            
    /// <param name="methodname">调用的方法</param>
            
    /// <param name="args">把webservices里需要的参数按顺序放到这个object[]里</param>
            public static object InvokeWebService(string url, string methodname, object[] args)
            {

                
    //这里的namespace是需引用的webservices的命名空间,在这里是写死的,大家可以加一个参数从外面传进来。
                string @namespace = "client";
                
    try
                {
                    
    //获取WSDL
                    WebClient wc = new WebClient();
                    Stream stream 
    = wc.OpenRead(url + "?WSDL");
                    ServiceDescription sd 
    = ServiceDescription.Read(stream);
                    
    string classname = sd.Services[0].Name;
                    ServiceDescriptionImporter sdi 
    = new ServiceDescriptionImporter();
                    sdi.AddServiceDescription(sd, 
    """");
                    CodeNamespace cn 
    = new CodeNamespace(@namespace);

                    
    //生成客户端代理类代码
                    CodeCompileUnit ccu = new CodeCompileUnit();
                    ccu.Namespaces.Add(cn);
                    sdi.Import(cn, ccu);
                    CSharpCodeProvider csc 
    = new CSharpCodeProvider();
                    ICodeCompiler icc 
    = csc.CreateCompiler();

                    
    //设定编译参数
                    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");

                    
    //编译代理类
                    CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
                    
    if (true == cr.Errors.HasErrors)
                    {
                        System.Text.StringBuilder sb 
    = new System.Text.StringBuilder();
                        
    foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
                        {
                            sb.Append(ce.ToString());
                            sb.Append(System.Environment.NewLine);
                        }
                        
    throw new Exception(sb.ToString());
                    }

                    
    //生成代理实例,并调用方法
                    System.Reflection.Assembly assembly = cr.CompiledAssembly;
                    Type t 
    = assembly.GetType(@namespace + "." + classname, truetrue);
                    
    object obj = Activator.CreateInstance(t);
                    System.Reflection.MethodInfo mi 
    = t.GetMethod(methodname);

                    
    return mi.Invoke(obj, args);
                }
                
    catch
                {
                    
    return null;
                }
            }
        }
    }
  • 相关阅读:
    Java虚拟机JVM学习05 类加载器的父委托机制
    java 接口
    java 抽象类
    代码块(2)
    获取超额收益的思考
    HttpServer
    交易过程思考
    A股时间窗口
    redash学习记录
    MySQL学习记录
  • 原文地址:https://www.cnblogs.com/wang123/p/1034742.html
Copyright © 2020-2023  润新知