首页 > 开发 > 综合 > 正文

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

2024-07-21 02:21:18
字体:
来源:转载
供稿:网友
建立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, 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);

}

}



}

  • 本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表