C#動態調用WebService方法

1. WebService中的方法

    /// <summary>web

    /// WebServiceDemo 的摘要說明數組

    /// </summary>異步

    [WebService(Namespace = "http://tempuri.org/")]ide

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]ui

    [System.ComponentModel.ToolboxItem(false)]url

    // 若要容許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消註釋如下行。spa

    // [System.Web.Script.Services.ScriptService]代理

    public class WebServiceDemo : System.Web.Services.WebServiceorm

    {ip

 

        [WebMethod]

        public string HelloWorld(string name)

        {

            return "Hello World,"+name;

        }

    }

2. C#動態調用

1) 動態調用WebService的方法

using System;

using System.Collections.Generic;

using System.Text;

using System.Web.Services.Description;

using System.CodeDom;

using Microsoft.CSharp;

using System.CodeDom.Compiler;

using System.Net;

using System.IO;

using System.Security.Cryptography.X509Certificates;

using System.Net.Security;

 

namespace Tools

{

    public delegate object InvokeWebServiceHandler(string serviceUrl, string classname, string methodname, object[] objects);

    public class WebServiceHelper

    {

        /// <summary>

        /// 動態調用WebService

        /// </summary>

        /// <param name="url">WebService地址</param>

        /// <param name="classname">WebService類名</param>

        /// <param name="methodname">調用的類名</param>

        /// <param name="args">參數數組</param>

        public object InvokeWebService(string url, string classname, string methodname, object[] args)

        {

            try

            {

                string @namespace = "fangqm.Netbank.WebService.webservice";

                if (classname == null || classname == "")

                {

                    classname = GetClassName(url);

                }

                SetCertificatePolicy();

                //獲取服務描述語言(WSDL)

                WebClient wc = new WebClient();

                Stream stream = wc.OpenRead(url + "?WSDL");//【1】

                ServiceDescription sd = ServiceDescription.Read(stream);//【2】

                ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();//【3】

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

                CodeNamespace cn = new CodeNamespace(@namespace);//【4】

                //生成客戶端代理類代碼

                CodeCompileUnit ccu = new CodeCompileUnit();//【5】

                ccu.Namespaces.Add(cn);

                sdi.Import(cn, ccu);

                CSharpCodeProvider csc = new CSharpCodeProvider();//【6】

                ICodeCompiler icc = csc.CreateCompiler();//【7】

                //設定編譯器的參數

                CompilerParameters cplist = new CompilerParameters();//【8】

                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);//【9】

                if (true == cr.Errors.HasErrors)

                {

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

                    foreach (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 bj = Activator.CreateInstance(t);//【10】

                System.Reflection.MethodInfo mi = t.GetMethod(methodname);//【11】

                return mi.Invoke(bj, args);

            }

            catch (Exception ex)

            {

                return null;

            }

 

        }

 

        private string GetClassName(string url)

        {

            //假如URL爲"http://localhost:51837/Service1.asmx"

            //最終的返回值爲 Service1

            string[] parts = url.Split('/');

            string[] pps = parts[parts.Length - 1].Split('.');

            return pps[0];

        }

 

        /// <summary>

        /// Sets the cert policy.

        /// </summary>

        public static void SetCertificatePolicy()

        {

            ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;

        }

 

        /// <summary>

        /// Remotes the certificate validate.

        /// </summary>

        private static bool RemoteCertificateValidate(

           object sender, X509Certificate cert,

            X509Chain chain, SslPolicyErrors error)

        {

            // trust any certificate!!!

            System.Console.WriteLine("Warning, trust any certificate");

            return true;

        }

 

        /// <summary>

        ///CallBack method of dynamic Invoke WebService

        /// </summary>

        /// <param name="ar">status of Async operate</param>

        public void CallBackForWebservice(IAsyncResult iar)

        {

            InvokeWebServiceHandler dn = (InvokeWebServiceHandler)iar.AsyncState;

            if (iar.IsCompleted == true)

            {

                try

                {

                    dn.EndInvoke(iar);

                }

                catch (Exception e)

                {

                }

            }

        }

    }

}

2) 同步調用

string strWebServiceUrl="http://localhost:10974/WebServiceDemo.asmx";

object[] objects = new object[] {「500」};

return InvokeWebService(serviceUrl, "", "HelloWorld", objects);

3) 異步調用

WebServiceHelper wbHelper = new WebServiceHelper();

InvokeWebServiceHandler webServiceHandler = new InvokeWebServiceHandler(wbHelper.InvokeWebService);//建立委託實例

string strWebServiceUrl="http://localhost:10974/WebServiceDemo.asmx";

object[] objects = new object[] { "king"};// 準備參數

webServiceHandler.BeginInvoke(strWebServiceUrl, "", "HelloWorld", objects,new AsyncCallback(CallBackMethod), webServiceHandler);//異步委託調用

 

// 請求WebService完成後,回調的方法

privatevoid CallBackMethod(IAsyncResult ar)

{

  if (ar.IsCompleted == true)

  {

    string strData = dele.EndInvoke(ar).ToString();//獲取方法返回值

  }

}

相關文章
相關標籤/搜索