zoukankan      html  css  js  c++  java
  • C# 动态生成WebService,无需添加引用

    C#项目调用WebService是很常见的现象,但一旦修改链接地址就需要重新更新引用很是麻烦,这里跟大家分享一个通过地址,无需添加引用动态生成Webservice的小方法

    方法类:
      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.ServiceModel;
      6 using System.ServiceModel.Channels;
      7 using System.Net;
      8 using System.Web.Services.Description;
      9 using System.CodeDom;
     10 using Microsoft.CSharp;
     11 using System.CodeDom.Compiler;
     12 using System.IO;
     13 
     14 namespace AlarmPublish.Common
     15 {
     16     /// <summary>
     17     /// Webservice 帮助工具类
     18     /// </summary>
     19     public static class WebserviceHelper
     20     {
     21         /// <summary>
     22         /// 根据 Url 创建 webservice 实例
     23         /// </summary>
     24         /// <typeparam name="T"></typeparam>
     25         /// <param name="url"></param>
     26         /// <returns></returns>
     27         public static T CreateInstance<T>(string url)
     28         {
     29             if (url.EndsWith("svc"))
     30             {
     31                 return CreateWCF<T>(url);
     32             }
     33 
     34             if (url.EndsWith("asmx"))
     35             {
     36                 return CreateAsmx<T>(url);
     37             }
     38 
     39             return default(T);
     40         }
     41 
     42         private static T CreateWCF<T>(string url)
     43         {
     44             BasicHttpBinding basicBinding = new BasicHttpBinding();
     45             CustomBinding binding = new CustomBinding(basicBinding);
     46             BindingElement binaryElement = new BinaryMessageEncodingBindingElement();
     47             binding.Elements.Remove(binding.Elements[0]);
     48             binding.Elements.Insert(0, binaryElement);
     49 
     50             EndpointAddress endPoint = new EndpointAddress(url);
     51 
     52             T client = (T)Activator.CreateInstance(typeof(T), binding, endPoint);
     53 
     54             return client;
     55         }
     56 
     57         private static T CreateAsmx<T>(string url)
     58         {
     59             BasicHttpBinding basicBinding = new BasicHttpBinding();
     60             basicBinding.MaxBufferSize = int.MaxValue;
     61             basicBinding.MaxReceivedMessageSize = int.MaxValue;
     62             basicBinding.ReceiveTimeout = TimeSpan.FromMinutes(10);
     63             basicBinding.OpenTimeout = TimeSpan.FromMinutes(1);
     64 
     65             CustomBinding binding = new CustomBinding(basicBinding);
     66             EndpointAddress endPoint = new EndpointAddress(url);
     67 
     68             T client = (T)Activator.CreateInstance(typeof(T), binding, endPoint);
     69 
     70             return client;
     71         }
     72 
     73         #region 动态调用WebService动态调用地址
     74         /// < summary>           
     75         /// 动态调用web服务         
     76         /// < /summary>          
     77         /// < param name="url">WSDL服务地址< /param> 
     78         /// < param name="methodname">方法名< /param>           
     79         /// < param name="args">参数< /param>           
     80         /// < returns>< /returns>          
     81         public static object InvokeWebService(string url, string methodname, object[] args)
     82         {
     83             return WebserviceHelper.InvokeWebService(url, null, methodname, args);
     84         }
     85         /// <summary>
     86         /// 动态调用web服务
     87         /// </summary>
     88         /// <param name="url">WSDL服务地址</param>
     89         /// <param name="classname">服务接口类名</param>
     90         /// <param name="methodname">方法名</param>
     91         /// <param name="args">参数值</param>
     92         /// <returns></returns>
     93         public static object InvokeWebService(string url, string classname, string methodname, object[] args)
     94         {
     95 
     96             string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
     97             if ((classname == null) || (classname == ""))
     98             {
     99                 classname = WebserviceHelper.GetWsClassName(url);
    100             }
    101             try
    102             {
    103 
    104                 //获取WSDL   
    105                 WebClient wc = new WebClient();
    106                 Stream stream = wc.OpenRead(url + "?WSDL");
    107                 ServiceDescription sd = ServiceDescription.Read(stream);
    108                 //注意classname一定要赋值获取 
    109                 classname = sd.Services[0].Name;
    110 
    111                 ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
    112                 sdi.AddServiceDescription(sd, "", "");
    113                 CodeNamespace cn = new CodeNamespace(@namespace);
    114 
    115                 //生成客户端代理类代码          
    116                 CodeCompileUnit ccu = new CodeCompileUnit();
    117                 ccu.Namespaces.Add(cn);
    118                 sdi.Import(cn, ccu);
    119                 CSharpCodeProvider icc = new CSharpCodeProvider();
    120 
    121 
    122                 //设定编译参数                 
    123                 CompilerParameters cplist = new CompilerParameters();
    124                 cplist.GenerateExecutable = false;
    125                 cplist.GenerateInMemory = true;
    126                 cplist.ReferencedAssemblies.Add("System.dll");
    127                 cplist.ReferencedAssemblies.Add("System.XML.dll");
    128                 cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
    129                 cplist.ReferencedAssemblies.Add("System.Data.dll");
    130                 //编译代理类                 
    131                 CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
    132                 if (true == cr.Errors.HasErrors)
    133                 {
    134                     System.Text.StringBuilder sb = new System.Text.StringBuilder();
    135                     foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
    136                     {
    137                         sb.Append(ce.ToString());
    138                         sb.Append(System.Environment.NewLine);
    139                     }
    140                     throw new Exception(sb.ToString());
    141                 }
    142                 //生成代理实例,并调用方法                 
    143                 System.Reflection.Assembly assembly = cr.CompiledAssembly;
    144                 Type t = assembly.GetType(@namespace + "." + classname, true, true);
    145                 object obj = Activator.CreateInstance(t);
    146                 System.Reflection.MethodInfo mi = t.GetMethod(methodname);
    147                 return mi.Invoke(obj, args);
    148 
    149             }
    150             catch (Exception ex)
    151             {
    152                 throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
    153                 // return "Error:WebService调用错误!" + ex.Message;
    154             }
    155         }
    156         private static string GetWsClassName(string wsUrl)
    157         {
    158             string[] parts = wsUrl.Split('/');
    159             string[] pps = parts[parts.Length - 1].Split('.');
    160             return pps[0];
    161         }
    162         #endregion
    163     }
    164 }
    View Code

    方法调用:
     1  /// <summary>
     2         /// 调用操作
     3         /// </summary>
     4         /// <param name="sender"></param>
     5         /// <param name="e"></param>
     6         private void Operation()
     7         {
     8            #region 动态调用 webservices地址
     9             try
    10             {
    11                
    12                 object[] args = new object[2];
    13                 args[0] = ("参数一");
    14                 args[1] = ("参数二");
    15 
    16                 object result = WebServiceHelper.InvokeWebService("http://10.135.10.110:8000/ServiceTest.asmx", "serviceMethod", args);
    17                 string message = result.ToString();
    18 
    19             }
    20             catch { }
    21             #endregion
    22         }
    View Code
  • 相关阅读:
    web中间件之nginx
    JVM之工具分析
    jprofiler监控tomcat
    如何查看端口被占用
    训练赛第二场C题 zoj 2339 Hyperhuffman
    训练赛第三场A题 zoj 559
    训练赛第二场G题 ZOJ 2343
    训练赛第一场D题
    训练赛第一场A题 (ZOJ 2313)
    HDU 1422 重温世界杯 DP题
  • 原文地址:https://www.cnblogs.com/mengfangchao/p/7543660.html
Copyright © 2011-2022 走看看