C# 如何動態調用WebService

WSHelper.cs

using System;
using System.Net;
using System.IO;
using System.CodeDom;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Web.Services.Description;
using System.Web.Services.Protocols;

namespace SysFrameWeb.Models
{
    public static class WSHelper
    {
        #region InvokeWebService     
        /// < summary>     
        /// 動態調用web服務     
        /// < /summary>     
        /// < param name="url">WSDL服務地址< /param>     
        /// < param name="methodname">方法名< /param>     
        /// < param name="args">參數< /param>     
        /// < returns>< /returns>     
        public static object InvokeWebService(string url, string methodname, object[] args)
        {
            return WSHelper.InvokeWebService(url, null, methodname, args);
        }

        /// < summary>     
        /// 動態調用web服務     
        /// < /summary>     
        /// < param name="url">WSDL服務地址< /param>     
        /// < param name="classname">類名< /param>     
        /// < param name="methodname">方法名< /param>     
        /// < param name="args">參數< /param>     
        /// < returns>< /returns>     
        public static object InvokeWebService(string url, string classname, string methodname, object[] args)
        {
            string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
            if ((classname == null) || (classname == ""))
            {
                classname = WSHelper.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 icc = 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 = 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);

                /*    
                PropertyInfo propertyInfo = type.GetProperty(propertyname);    
                return propertyInfo.GetValue(obj, null);    
                */
            }
            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
    }
}

WebMethod方法

 [WebMethod]
        public string insHisPatient(string cardno, string name, string sex, string birth, string address, string tel, string nation, string qrCodeText)
        {
            string patid = his.InsertHisPatiention(cardno, name, sex, birth, address, tel, nation);
            HealthOpenAuth hoa = new HealthOpenAuth();
            hoa.Initialize();
            string msg = hoa.Lx_bindCardRelation(patid, qrCodeText);
            return msg == "1" ? patid : "-1";
        }

調用方式:

string url="webservice地址"
object[] args = new object[8];

args[0] = pi.idNumber;
args[1] = pi.name;
args[2] = pi.gender == "男" ? "1" : pi.gender == "女" ? "2" : "9";
args[3] = pi.barthday;
args[4] = pi.address;
args[5] = pi.phone1;
args[6] = pi.nation;
args[7] = pi.qrCodeText;

object result = WSHelper.InvokeWebService(url, "insHisPatient", args);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章