動態調用WebService(傳對象返回接受對象)


基礎屬性
//
客戶端代理服務命名空間,可以設置成需要的值。 string ns = string.Format("WindowsForms"); private Assembly assembly; // 服務端程序Assembly public Assembly Assembly { get { return assembly; } set { assembly = value; } } private object agent; //獲取服務端程序集 public object Agent { get { return agent; } set { agent = value; } } private Type agentType; //獲取程序集類型 public Type AgentType { get { return agentType; } set { agentType = value; } }

 下面是構造函數,自己命名

public  構造函數(string url)
        {
            //獲取WSDL  
            WebClient wc = new WebClient();
            Stream stream = wc.OpenRead(url + "?WSDL");
            ServiceDescription sd = ServiceDescription.Read(stream);//服務的描述信息都可以通過ServiceDescription獲取  
            string classname = sd.Services[0].Name;
            ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
            sdi.AddServiceDescription(sd, "", "");
            CodeNamespace cn = new CodeNamespace(ns);
            //生成客戶端代理類代碼  
            CodeCompileUnit ccu = new CodeCompileUnit();
            ccu.Namespaces.Add(cn);
            sdi.Import(cn, ccu);
            CSharpCodeProvider csc = new CSharpCodeProvider();
            //設定編譯參數  
            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 = csc.CompileAssemblyFromDom(cplist, ccu);
            if (cr.Errors.HasErrors == true)
            {
                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());
            }
            Assembly = cr.CompiledAssembly;
            AgentType = Assembly.GetType(ns + "." + classname, true, true);
            Agent = Activator.CreateInstance(agentType);
        }

兩個函數用於,轉對象和對象賦值

/// <summary>
        /// 獲取存在的對象並賦值
        /// </summary>
        /// <param name="methodName"></param>
        /// <returns></returns>
        public object SerializeObj<T>(string propertieName, T t)
        {
            Type ObjType = Assembly.GetType(ns + "." + propertieName, true, true);
            object obj = Activator.CreateInstance(ObjType);
            if (obj == null) throw new Exception("no " + propertieName);
            var Types = t.GetType();//獲得類型 
            Type tt = obj.GetType();
            foreach (PropertyInfo sp in Types.GetProperties())//獲得類型的屬性字段  
            {
                FieldInfo fi = tt.GetField(sp.Name);
                if (fi != null)
                {
                    fi.SetValue(obj, sp.GetValue(t, null));
                }
            }
            return obj;
        }
        /// <summary>
        /// 獲取的Service程序集對象並賦值
        /// </summary>
        public  void DeserializeObj<T>(T t, object obj)
        {
            var Types = t.GetType();//獲得類型  
            Type tt = obj.GetType();
            foreach (PropertyInfo sp in Types.GetProperties())//獲得類型的屬性字段  
            {
                FieldInfo fi = tt.GetField(sp.Name);
                if (fi != null)
                {
                    sp.SetValue(t, fi.GetValue(obj), null);
                }
            }
        }

最后Demo調用

//返回對象並把數據賦值到指定對象
WebServicesWsdl WebService = new WebServicesWsdl("WebService.asmx");
Field = "201920182017";
Fields = new object[] { Field };
_return = WebService.GetMethod("函數名稱", Fields);
Model model = new Model();
WebService.DeserializeObj<Model >(model, _return);
//將對象當參數傳過去
WebServicesWsdl WebInterface = new WebServicesWsdl("WebInterface.asmx");
var Field = WebInterface.SerializeObj<Model>("對象名稱", model);
object[] Fields = new object[]{ Field };
object _return = WebInterface.GetMethod("函數名稱", Fields);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM