1. 程式人生 > >轉載:動態呼叫WebService(C#)

轉載:動態呼叫WebService(C#)

         #region InvokeWebService // 動態呼叫web服務 public static object InvokeWebService( string url, string methodname, object [] args)         {             return WebServiceHelper.InvokeWebService(url , null ,methodname ,args) ;         }         public static object
InvokeWebService( string url,   string classname, string methodname, object [] args)         {             string @namespace = " EnterpriseServerBase.WebService.DynamicWebCalling " ;             if ((classname == null ) || (classname == "" ))             {                 classname
= WebServiceHelper.GetWsClassName(url) ;             }             try              {                 // 獲取WSDL                  WebClient wc                    = new WebClient();                 Stream stream                   = wc.OpenRead(url + " ?WSDL " );                 ServiceDescription sd          
= ServiceDescription.Read(stream);                 ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();                 sdi.AddServiceDescription(sd, "" , "" );                 CodeNamespace cn                 = new CodeNamespace(@namespace);                                 // 生成客戶端代理類程式碼                  CodeCompileUnit ccu              = new CodeCompileUnit();                 ccu.Namespaces.Add(cn);                 sdi.Import(cn ,ccu);                  CSharpCodeProvider csc           = new CSharpCodeProvider();                 ICodeCompiler icc                = csc.CreateCompiler();                                 // 設定編譯引數                  CompilerParameters cplist        = new 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 " );                 // 編譯代理類                  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));             }         }         private static string GetWsClassName( string wsUrl)         {             string [] parts = wsUrl.Split( ' / ' ) ;             string [] pps    = parts[parts.Length - 1 ].Split( ' . ' ) ;             return pps[ 0 ] ;         }         #endregion