[ 登录 ][ 注册 ] 天极传媒: 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
您现在的位置: IT专家网 > Web服务子站 > WebService领域

动态引用 建立WebService虚拟机

作者: ,  出处:rdxx, 责任编辑: 包春林, 
2008-04-01 11:11
  建立WebService虚拟代理,使用xml登记WebService的引用地址。实现动态引用WebService.

  概述

  建立WebService虚拟代理,使用xml登记WebService的引用地址。实现动态引用WebService.

  使用技术

  1、 动态编译

  2、 反射技术

  实现代码

  

using System;

  using System.Reflection ;

  using System.Web .Services .Description ;

  using Microsoft.CSharp;

  using System.CodeDom ;

  using System.CodeDom.Compiler ;

  using System.IO ;

  using System.Text ;

  using System.Xml ;

  using System.Net ;

  using WebServiceProxy;

  namespace WebServiceProxy

  {

  public class WebServiceProxy

  {

  private Assembly _ass = null;

  private string _protocolName = "Soap";

  private string _srcWSProxy = string.Empty;

  public Assembly Assembly { get{ return _ass; } }

  public string ProtocolName

  { get{ return _protocolName; } set {_protocolName = value; } }

  public string SrcWSProxy { get{ return _srcWSProxy; } }

  public WebServiceProxy ()

  {

  }

  public WebServiceProxy (string wsdlSourceName)

  {

  AssemblyFromWsdl(GetWsdl(wsdlSourceName));

  }

  public string WsdlFromUrl(string url)

  {

  WebRequest req = WebRequest.Create(url);

  WebResponse result = req.GetResponse();

  Stream ReceiveStream = result.GetResponseStream();

  Encoding encode = System.Text.Encoding.GetEncoding("utf-8");

  StreamReader sr = new StreamReader( ReceiveStream, encode );

  string strWsdl = sr.ReadToEnd();

  return strWsdl;

  }

  public string GetWsdl(string source)

  {

  if(source.StartsWith("

  {

  return source;

  }

  else

  if(source.StartsWith("http://") == true)

  {

  return WsdlFromUrl(source);

  }

  return WsdlFromFile(source);

  }

  public string WsdlFromFile(string fileFullPathName)

  {

  FileInfo fi = new FileInfo(fileFullPathName);

  if(fi.Extension == "wsdl")

  {

  FileStream fs = new FileStream(fileFullPathName, FileMode.Open,

  FileAccess.Read);

  StreamReader sr = new StreamReader(fs);

  char[] buffer = new char[(int)fs.Length];

  sr.ReadBlock(buffer, 0, (int)fs.Length);

  return new string(buffer);

  }

  throw new Exception("This is no a wsdl file");

  }

  public Assembly AssemblyFromWsdl(string strWsdl)

  {

  // Xml text reader

  StringReader wsdlStringReader = new StringReader(strWsdl);

  XmlTextReader tr = new XmlTextReader(wsdlStringReader);

  ServiceDescription sd = ServiceDescription.Read(tr);

  tr.Close();

  // WSDL service description importer

  CodeNamespace cns = new CodeNamespace("WebServiceProxy.WebServiceAccessor");

  ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();

  sdi.AddServiceDescription(sd, null, null);

  sdi.ProtocolName = _protocolName;

  sdi.Import(cns, null);

  // source code generation

  CSharpCodeProvider cscp = new CSharpCodeProvider();

  ICodeGenerator icg = cscp.CreateGenerator();

  StringBuilder srcStringBuilder = new StringBuilder();

  StringWriter sw = new StringWriter(srcStringBuilder);

  icg.GenerateCodeFromNamespace(cns, sw, null);

  _srcWSProxy = srcStringBuilder.ToString();

  sw.Close();

  // assembly compilation.

  CompilerParameters cp = new CompilerParameters();

  cp.ReferencedAssemblies.Add("System.dll");

  cp.ReferencedAssemblies.Add("System.Xml.dll");

  cp.ReferencedAssemblies.Add("System.Web.Services.dll");

  cp.GenerateExecutable = false;

  cp.GenerateInMemory = true;

  cp.IncludeDebugInformation = false;

  ICodeCompiler icc = cscp.CreateCompiler();

  CompilerResults cr = icc.CompileAssemblyFromSource(cp, _srcWSProxy);

  if(cr.Errors.Count > 0)

  throw new Exception(string.Format("Build failed: {0} errors",

  cr.Errors.Count));

  return _ass = cr.CompiledAssembly;

  }

  public object CreateInstance(string objTypeName)

  {

  Type t = _ass.GetType("WebServiceProxy.WebServiceAccessor" + "." + objTypeName);

  return Activator.CreateInstance(t);

  }

  public object Invoke(object obj, string methodName, params object[] args)

  {

  MethodInfo mi = obj.GetType().GetMethod(methodName);

  return mi.Invoke(obj, args);

  }

  }

  }

      

  • 本文关键词:

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。

邮件订阅