加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

动态引用WebService,建立WebService虚拟机

发布时间:2020-12-17 02:58:57 所属栏目:安全 来源:网络整理
导读://建立WebService虚拟代理,使用xml登记WebService的引用地址。实现动态引用WebService. ? //使用技术 //1、动态编译 ? //2、反射技术 ? //实现代码 using System; using System.Reflection ; using System.Web .Services .Description ; using Microsoft.CS

//建立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("<?xml version") == true)

????????????? {

????????????? ???? 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,(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);

???????? }

???? }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读