• WebService WSDL动态访问


    ClassName:WebServiceInvoke.cs

    ClassCode:

      1 using System;
      2 using System.CodeDom;
      3 using System.CodeDom.Compiler;
      4 using System.IO;
      5 using System.Linq;
      6 using System.Net;
      7 using System.Reflection;
      8 using System.Text;
      9 using System.Web.Services.Description;
     10 using Microsoft.CSharp;
     11 
     12 /// <summary>
     13 ///动态链接web server
     14 /// </summary>
     15 public class WebServiceInvoke
     16 {
     17     public WebServiceInvoke()
     18     {
     19         //
     20         //TODO: 在此处添加构造函数逻辑
     21         //
     22     }
     23 
     24     /// <summary>
     25     /// 调用web 服务
     26     /// </summary>
     27     /// <param name="url">webServer url</param>
     28     /// <param name="className">web Server ClassName</param>
     29     /// <param name="methodName">web Server methodName</param>
     30     /// <param name="parameters">method parameter</param>
     31     /// <returns>retValue</returns>
     32     public object InvokeWebService(string url,string className,string methodName,object[] parameters)
     33     {
     34         //1. 从目标 URL 下载 WSDL 数据。
     35         //2. 使用 ServiceDescription 创建和格式化 WSDL 文档文件。
     36         //3. 使用 ServiceDescriptionImporter 创建客户端代理类。
     37         //4. 使用 CodeDom 动态创建客户端代理类程序集。
     38         //5. 利用反射调用相关 WebService 方法。
     39 
     40         string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
     41         if (string.IsNullOrEmpty(className))
     42             className = GetClassName(url);
     43 
     44         try
     45         {
     46             //获取WSDL数据
     47             WebClient webClient = new WebClient();
     48             Stream stream= webClient.OpenRead(url + "?WSDL");
     49             ServiceDescription sDescription = ServiceDescription.Read(stream);
     50             ServiceDescriptionImporter sDescriptionImporter = new ServiceDescriptionImporter();
     51             sDescriptionImporter.AddServiceDescription(sDescription, "", "");
     52 
     53             //生成客户端代理类代码
     54             CodeNamespace codeNamespace = new CodeNamespace(@namespace);
     55             CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
     56             codeCompileUnit.Namespaces.Add(codeNamespace);
     57             sDescriptionImporter.Import(codeNamespace, codeCompileUnit);
     58 
     59             //设定编译参数
     60             CompilerParameters compilerList = new CompilerParameters 
     61             {
     62                 GenerateExecutable=false,
     63                 GenerateInMemory=true
     64             };
     65             compilerList.ReferencedAssemblies.Add("System.dll");
     66             compilerList.ReferencedAssemblies.Add("System.XML.dll");
     67             compilerList.ReferencedAssemblies.Add("System.Web.Services.dll");
     68             compilerList.ReferencedAssemblies.Add("System.Data.dll");
     69 
     70             //编译代理类
     71             CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider();
     72             CompilerResults compilerResult = csharpCodeProvider.CompileAssemblyFromDom(compilerList, codeCompileUnit);
     73             if (compilerResult.Errors.HasErrors == true)
     74             {
     75                 StringBuilder errorSb = new StringBuilder();
     76                 foreach (var item in compilerResult.Errors)
     77                 {
     78                     errorSb.Append(item.ToString());
     79                     errorSb.Append(System.Environment.NewLine);
     80                 }
     81                 throw new Exception(errorSb.ToString());
     82             }
     83 
     84             //生成代理实例,调用方法
     85             Assembly assembly = compilerResult.CompiledAssembly;
     86             Type t = assembly.GetType(@namespace + "." + className, true, true);
     87             object obj = Activator.CreateInstance(t);
     88             MethodInfo methodInfo = t.GetMethod(methodName);
     89             var retValue= methodInfo.Invoke(obj, parameters);
     90             return retValue;
     91         }
     92         catch (Exception ex)
     93         {
     94             throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
     95         }
     96     }
     97 
     98     /// <summary>
     99     /// 获取ClassName
    100     /// </summary>
    101     /// <param name="url">web Server url</param>
    102     /// <returns>className</returns>
    103     private string GetClassName(string url)
    104     {
    105         string[] urlArray = url.Split('/');
    106         return urlArray[urlArray.Count() - 1].Split('.')[0];
    107     }
    108 }

    Use Code:

    1   WebServiceInvokewi = new WebServiceInvoke();
    2             byte[] byteArray = System.Text.Encoding.Default.GetBytes(XML);
    3             object[] parameters = { byteArray, "0" };
    4             wi.InvokeWebService(url_to, "DisService", "ImpLes", parameters);
  • 相关阅读:
    结对-结对编项目贪吃蛇-开发环境搭建过程
    gitbook serve运行报错TypeError: cb.apply is not a function
    iOS 工程添加的framework转成pod形式加入
    selector not recognized
    Errors were encountered while preparing your device for development. Please check the Devices and Simulators Window.
    podspec 添加xcassets
    后缀自动机(SAM)构造实现过程演示+习题集锦
    数组中存在undefined,0,null,false等的情况该如何去除
    Uncaught TypeError: date.clone is not a function 【报错解决】
    React·前端URL参数丢失符号的解决办法
  • 原文地址:https://www.cnblogs.com/pyffcwj/p/3772689.html
Copyright © 2020-2023  润新知