动态调用Webservice

///

1<summary>
2
3///  根据指定的信息,调用远程  WebService  方法 
4
5///  </summary>

///

1<param name="url"/>

WebService 的 http 形式的地址

///

1<param name="namespace"/>

欲调用的 WebService 的命名空间

///

1<param name="classname"/>

欲调用的 WebService 的类名(不包括命名空间前缀)

///

1<param name="methodname"/>

欲调用的 WebService 的方法名

///

1<param name="args"/>

参数列表

///

1<returns> WebService  的执行结果  </returns>

///

 1<remarks>
 2
 3///  如果调用失败,将会抛出  Exception  。请调用的时候,适当截获异常。 
 4
 5///  异常信息可能会发生在两个地方: 
 6
 7///  1  、动态构造  WebService  的时候,  CompileAssembly  失败。 
 8
 9///  2  、  WebService  本身执行失败。 
10
11///  </remarks>

///

1<example>
2
3///  <code>
4
5///  object obj = InvokeWebservice("http://localhost/GSP_WorkflowWebservice/common.asmx","Genersoft.Platform.Service.Workflow","Common","GetToolType",new object[]{"1"}); 
6
7///  </code>
8
9///  </example>

private object InvokeWebservice( string url, string @namespace, string classname, string methodname, object [] args)

{

try

{

System.Net.WebClient wc = new System.Net.WebClient();

System.IO.Stream stream = wc.OpenRead(url+"?WSDL");

System.Web.Services.Description.ServiceDescription sd = System.Web.Services.Description.ServiceDescription.Read(stream);

System.Web.Services.Description.ServiceDescriptionImporter sdi = new System.Web.Services.Description.ServiceDescriptionImporter();

sdi.AddServiceDescription(sd,"","");

System.CodeDom.CodeNamespace cn = new System.CodeDom.CodeNamespace(@namespace);

System.CodeDom.CodeCompileUnit ccu = new System.CodeDom.CodeCompileUnit();

ccu.Namespaces.Add(cn);

sdi.Import(cn,ccu);

Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();

System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler();

System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.CompilerParameters();

cplist.GenerateExecutable = false ;

cplist.GenerateInMemory = true ;

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

cplist.ReferencedAssemblies.Add("System.XML.dll");

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

cplist.ReferencedAssemblies.Add("System.Data.dll");

System.CodeDom.Compiler.CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);

if ( true == cr.Errors.HasErrors)

{

System.Text.StringBuilder sb = new System.Text.StringBuilder();

foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)

{

sb.Append(ce.ToString());

sb.Append(System.Environment.NewLine);

}

throw new Exception(sb.ToString());

}

System.Reflection.Assembly assembly = cr.CompiledAssembly;

Type t = assembly.GetType(@namespace+"."+classname, true , true );

object obj = Activator.CreateInstance(t);

System.Reflection.MethodInfo mi = t.GetMethod(methodname);

return mi.Invoke(obj,args);

}

catch (Exception ex)

{

throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));

}

}

Published At
Categories with Web编程
Tagged with
comments powered by Disqus