動態調用webservice及WCF服務

動態調用web服務,該方法只針對Web service, WCF的服務不行,若是是WCF的就經過工具直接生產代理類,把代理類配置到調用的項目中,經過配置客戶端的終結點動態的取實現:web

經過Svcutil.exe 工具生成代理類調用app

            1.找到以下地址「C:\Windows\System32\cmd.exe」  命令行工具,右鍵以管理員身份運行(視系統是否爲win7 而定) ide

            2.輸入以下命令:"C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\SvcUtil.exe" /out:C:\WCFClint\ClientCode.cs /config:C:\WCFClint\app.config     http://localhost:81/WCFServiceTest/CNPatentSearchService.svc工具

              說明:ui

              參數1:  「C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\SvcUtil.exe」   ,是指 SvcUtil.exe 工具的地址url

              參數2:  「C:\WCFClint\ClientCode.cs 」   ,是指生成的代理類輸出存放到的地址spa

              參數3:  「C:\WCFClint\app.config 」   ,是指存放到調用WCF服務程序目錄下的配置文件的輸出存放地址命令行

              參數4:  「http://localhost:81/WCFServiceTest/CNPatentSearchService.svc」   ,是指部署到IIS 的WCF服務的地址代理

             

/// <summary>
    /// 動態調用webservice
    /// </summary>
    public static class WebServiceHelper
    {
        public static object InvokeWebService(string url, string methodname, params object[] args)
        {
            return InvokeWebService(url, null, methodname, args);
        }

        public static object InvokeWebService(string url, string classname, string methodname, params object[] args)
        {
            string @namespace = "ServiceBase.WebService.DynamicWebLoad";
            if (string.IsNullOrEmpty(classname))
            {
                classname = WebServiceHelper.GetClassName(url);
            }

            //獲取服務描述語言(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);

            //CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
            CodeDomProvider provider = 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 = provider.CompileAssemblyFromDom(cplist, ccu);
            if (true == cr.Errors.HasErrors)
            {
                System.Text.StringBuilder sb = new StringBuilder();
                foreach (CompilerError ce in cr.Errors)
                {
                    sb.Append(ce.ToString() + System.Environment.NewLine);
                }
                throw new Exception(sb.ToString());
            }

            // 生成代理實例並調用方法
            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);
        }

        private static string GetClassName(string url)
        {
            string[] parts = url.Split('/');
            string[] pps = parts[parts.Length - 1].Split('.');
            return pps[0];
        }
    }ip

相關文章
相關標籤/搜索