程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#動態調用webservice方法

C#動態調用webservice方法

編輯:C#入門知識

[csharp] 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.IO; 
using System.CodeDom.Compiler; 
using System.Reflection; 
using System.Web.Services.Description; 
using System.Xml.Serialization; 
using System.CodeDom; 
 
namespace CN100.Member.Utility 

    public class WebServiceHelper 
    { 
        private static WebServiceHelper webService = null; 
 
        public static WebServiceHelper Instance(string webServiceUrl, string NamSpace) 
        { 
            if (webService == null) 
            { 
                webService = new WebServiceHelper(webServiceUrl, NamSpace); 
            } 
            return webService; 
        } 
 
        private WebServiceHelper() 
        {  
         
        } 
 
        /// <summary> 
        /// webService地址 
        /// </summary> 
        public string ServerUrl 
        { 
            get; 
            set; 
        } 
 
        /// <summary> 
        /// 調用類命名空間 
        /// </summary> 
        public string NameSpace 
        { 
            get; 
            set; 
        } 
 
        private WebServiceHelper(string webServiceUrl, string namSpace) 
        { 
            ServerUrl = webServiceUrl; 
            NameSpace = namSpace; 
        } 
 
        /// <summary> 
        /// 生成動態引用DLL 
        /// </summary> 
        /// <returns></returns> 
        public bool GenerateWebService() 
        { 
            WebClient client = new WebClient(); 
            String url = ServerUrl + "?WSDL";//這個地址可以寫在Config文件裡面,這裡取出來就行了.在原地址後面加上: ?WSDL 
            Stream stream = client.OpenRead(url); 
            ServiceDescription description = ServiceDescription.Read(stream); 
            ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//創建客戶端代理代理類。 
            importer.ProtocolName = "Soap"; //指定訪問協議。 
            importer.Style = ServiceDescriptionImportStyle.Client; //生成客戶端代理。 
            importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; 
            importer.AddServiceDescription(description, null, null); //添加WSDL文檔。 
            CodeNamespace nmspace = new CodeNamespace(); //命名空間 
            nmspace.Name = NameSpace; 
            CodeCompileUnit unit = new CodeCompileUnit(); 
            unit.Namespaces.Add(nmspace); 
 
            ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit); 
            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); 
 
            CompilerParameters parameter = new CompilerParameters(); 
            parameter.GenerateExecutable = false; 
            parameter.OutputAssembly = NameSpace + ".dll";//輸出程序集的名稱 
            parameter.ReferencedAssemblies.Add("System.dll"); 
            parameter.ReferencedAssemblies.Add("System.XML.dll"); 
            parameter.ReferencedAssemblies.Add("System.Web.Services.dll"); 
            parameter.ReferencedAssemblies.Add("System.Data.dll"); 
 
            CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit); 
            if (result.Errors.HasErrors) 
            { 
                // 顯示編譯錯誤信息 
                return false; 
            } 
            return true; 
        } 
 
        private Assembly LoadAssembly(string nameSpace) 
        { 
            Assembly asm = null; 
            try 
            { 
                asm=Assembly.LoadFrom(nameSpace + ".dll");//加載前面生成的程序集 
            } 
            catch (FileNotFoundException ex) 
            { 
                if (GenerateWebService()) 
                { 
                    asm=Assembly.LoadFrom(nameSpace + ".dll");//加載前面生成的程序集 
                } 
            } 
            catch (Exception e) 
            { 
                throw e; 
            } 
            return asm; 
        } 
 
        /// <summary> 
        /// 執行無返回值方法 
        /// </summary> 
        /// <param name="methodName"></param> 
        /// <param name="nameSpace"></param> 
        /// <param name="args"></param> 
        public void ExcuteMethod(string methodName,string nameSpace,params object[] args) 
        { 
            Assembly asm = LoadAssembly(nameSpace); 
            Type t = asm.GetType(nameSpace); 
            object o = Activator.CreateInstance(t); 
            MethodInfo method = t.GetMethod(methodName); 
            method.Invoke(o, args); 
        } 
 
        public void ExcuteMethod(string methodName,params object[] args) 
        { 
            string nameSpace = NameSpace; 
            ExcuteMethod(methodName, nameSpace, args); 
        } 
 
        /// <summary> 
        /// 執行帶返回值方法 
        /// </summary> 
        /// <typeparam name="T"></typeparam> 
        /// <param name="methodName"></param> 
        /// <param name="nameSpace"></param> 
        /// <param name="args"></param> 
        /// <returns></returns> 
        public T ExcuteMethod<T>(string methodName, string nameSpace,params object[] args) 
        { 
            Assembly asm = LoadAssembly(nameSpace); 
            Type t = asm.GetType(nameSpace); 
            object o = Activator.CreateInstance(t); 
            MethodInfo method = t.GetMethod(methodName); 
            T result = (T)method.Invoke(o, args); 
            return result; 
        } 
 
        public T ExcuteMethod<T>(string methodName,params object[] args) 
        { 
            string nameSpace=NameSpace; 
            return ExcuteMethod<T>(methodName, nameSpace, args); 
        } 
 
    } 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved