Dynamic reference WebService
Overview
Establish a WebService virtual agent that uses XML registration of the reference address of WebService. Implement dynamic reference WebService.
Use technology
1, dynamic compilation
2, reflection technology
Implement code
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
{
PRIVATESEMBLY_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 ();
Street.getReStream = Result.getResponseSstream ();
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 = ServicesDescription.read (TR); Tr.Close (); // WSDL Service Description Importer CODENAMESPACE CNS = New CodeNameSpace ("WebServiceProxy.WebserviceAccessor"); ServiceDescriptionImporter SDI = New ServicesDescriptionImp Porter (); SDi.AddServicedScription (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.includebuginformation = 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); } } }