Dynamically refer to WebService to create a WebService virtual machine

xiaoxiao2021-03-06  110

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);

}

}

}

转载请注明原文地址:https://www.9cbs.com/read-100290.html

New Post(0)