using System;
using System.Net;
using System.IO;
using System.CodeDom;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Web.Services.Description;
using System.Web.Services.Protocols; namespace GlobalTechnologyInc.SnmpProject.CustomClass
{
    /* 调用方式
     *   string url = "http://www.webservicex.net/globalweather.asmx" ;
     *   string[] args = new string[2] ;
     *   args[0] = "Hangzhou";
     *   args[1] = "China" ;
     *   object result = WebServiceHelper.InvokeWebService(url ,"GetWeather" ,args) ;
     *   Response.Write(result.ToString());
     */
    public class WebServiceHelper
    {
        #region InvokeWebService
        /// <summary>
        /// 动态调用web服务
        /// </summary>
        /// <param name="url">WSDL服务地址</param>
        /// <param name="methodname">方法名</param>
        /// <param name="args">参数</param>
        /// <returns></returns>
        public static object InvokeWebService(string url, string methodname, object[] args)
        {
            return WebServiceHelper.InvokeWebService(url, null, methodname, args);
        }         /// <summary>
        /// 动态调用web服务
        /// </summary>
        /// <param name="url">WSDL服务地址</param>
        /// <param name="classname">类名</param>
        /// <param name="methodname">方法名</param>
        /// <param name="args">参数</param>
        /// <returns></returns>
        public static object InvokeWebService(string url, string classname, string methodname, object[] args)
        {
            string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
            if ((classname == null) || (classname == ""))
            {
                classname = WebServiceHelper.GetWsClassName(url);
            }             try
            {
                //获取WSDL
                WebClient wc = new WebClient();
                Stream stream = wc.OpenRead(url + "?WSDL");
                ServiceDescription sd = ServiceDescription.Read(stream);
                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 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");                 //编译代理类
                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, true, true);
                object obj = Activator.CreateInstance(t);
                System.Reflection.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));
            }
        }         private static string GetWsClassName(string wsUrl)
        {
            string[] parts = wsUrl.Split('/');
            string[] pps = parts[parts.Length - 1].Split('.');             return pps[0];
        }
        #endregion
    }
}

最新文章

  1. 手机sdk 开发
  2. 分享Kali Linux 2016.2第46周虚拟机
  3. ios-自定义alertView提示框
  4. sublime Text Pastry使用
  5. PHP的静态变量和引用函数
  6. HTML5 IE兼容问题
  7. TC HTB r2q
  8. getScript 按需加载javascript
  9. fixSidebar简介与修正log
  10. px、pt、em、rem 的区别
  11. java.util.ServiceLoader使用
  12. asp.net core 系列 15 中间件
  13. ps -ef |grep java
  14. MySQL 使用左连接替换not in
  15. hihocoder图像算子(高斯消元)
  16. 关于const修饰指针
  17. Python3+pyshark捕获数据包并保存为文件
  18. Qt 中一些常用类中文说明
  19. Codeforces 799D Field expansion - 搜索 - 贪心
  20. Leetcode 969. 煎饼排序

热门文章

  1. META-INF中的INF的意思
  2. A visual proof that neural nets can compute any function
  3. Java内部类(转发:)
  4. python学习-3.一些常用模块用法
  5. python基础6 ----python函数
  6. 更改node版本
  7. 如何写PHP规范注释
  8. 财经世界(5)国际货币基金组织,世界银行,国际清算银行(BIS)与美联储
  9. CSS3响应式侧边菜单
  10. Monkey for Mac 环境配置