C# 动态编译及调用WebService的方法

  C# 动态编译及调用WebService的方法

C# 动态编译及调用WebService的方法


我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务。这样方式使用简单,若有一天Web服务方法名或参数改变了,我们需要重新让VS.NET生成代理,并重新编译,在某些情况下,这可能是不能忍受的,我们需要动态调用 WebService的能力。比如我们可以把Web服务的URL保存在配置文件中,这样,当服务URL改变时,只需要修改配置文件就可以了。


WebServiceHelper类:


C# Code:


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

/// <summary>
///  WebServiceHelper 的摘要说明
/// </summary>
public class WebServiceHelper
{
   private WebServiceHelper()
   {
   }
   
   //动态调用web服务
   public static object InvokeWebService(string url, string methodname, object[] args)
   {
      return WebServiceHelper.InvokeWebService(url, null, methodname, args);
   }
   
   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 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, true, true);
         object obj = Activator.CreateInstance(t);
         System.Reflection.MethodInfo mi = t.GetMethod(methodname);
         return mi.Invoke(obj, args);
      }
      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];
   }
}

//来源:C/S框架网(www.csframework.com) QQ:1980854898



程序调用过程:


C# Code:


using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

public partial class Test3 : System.Web.UI.Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
      string[] args = new string[1];
      args[0] = "202.102.224.68";
      
      object obj = WebServiceHelper.InvokeWebService(
"http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx",
"getCountryCityByIp", args);

      Response.Write(((string[])(obj))[1]);
   }
}

//来源:C/S框架网(www.csframework.com) QQ:1980854898


原文:http://blog.csdn.net/fhbcn/archive/2008/11/18/3326306.aspx




C/S框架网|原创精神.创造价值.打造精品

扫一扫加微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务

版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
发表评论

评论内容
昵称:
关联文章

C# 动态编译调用WebService方法
C#调用C++编译DLL详解
C#.NET通过CodeDom.Compiler动态编译计算表达式
C#代码混淆编译
C#代码混淆编译(转)
C# WebService异步处理/异步调用详解
Delphi程序调用C#.Net编译DLL并打开窗体(详解)
C#.Net 类同名方法重载调用顺序
C# Winform动态设置控件反射技术应用
动态对象ExpandoObject实现动态函数调用
通过.NET反射动态调用SetValue方法给属性PropertyInfo赋值
架构C#WebService程序
C#.NET扩展动态对象支持动态属性和方法以及Json格式与对象互转
C/S开发框架Toolbar按钮动态生成与调用关系
C#调用Delphi编译DLL函数库返回大文本数据
C# 子窗体中调用父窗体中方法(或多窗体之间方法调用)
C#.Net 调用Delphi 编译ActiveX COM组件(原)
C# 动态组合SQL脚本LIKE语句查询参数防SQL注入攻击
C#数组,多维数组,动态数组
C/S开发框架标准版-后台数据更新dalBase类(UML图方法介绍)