亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用C#通過反射實現動態調用WebService告別Web引用

2019-11-14 13:40:40
字體:
來源:轉載
供稿:網友

我們都知道,調用WebService可以在工程中對WebService地址進行WEB引用,但是這確實很不方便。我想能夠利用配置文件靈活調用WebService。如何實現呢?

用C#通過反射實現動態調用WebService

上代碼,先試再說:

using System;using System.Collections.Generic;using System.Text;using System.Net;using System.IO;using System.Web.Services.Description;using System.CodeDom;using Microsoft.CSharp;using System.CodeDom.Compiler;namespace TestCommon{    public class Webservice    {        /// <summary>        /// 實例化WebServices        /// </summary>        /// <param name="url">WebServices地址</param>        /// <param name="methodname">調用的方法</param>        /// <param name="args">把webservices里需要的參數按順序放到這個object[]里</param>        public static object InvokeWebService(string url, string methodname, object[] args)        {            //這里的namespace是需引用的webservices的命名空間,我沒有改過,也可以使用。也可以加一個參數從外面傳進來。            string @namespace = "client";            try            {                //獲取WSDL                WebClient wc = new WebClient();                Stream stream = wc.OpenRead(url + "?WSDL");                ServiceDescription sd = ServiceDescription.Read(stream);                string classname = sd.Services[0].Name;                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 csc = new CSharpCodeProvider();                //ICodeCompiler icc = csc.CreateCompiler();                //設定編譯參數                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 (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);            }            catch            {                return null;            }        }    }}

注意:上述代碼需要引用如下四個名稱空間:
using System.Web.Services.Description;  //WS的描述
//以下幾個用于根據描述動態生成代碼并動態編譯獲取程序集
using System.CodeDom;  
using Microsoft.CSharp;
using System.CodeDom.Compiler;

如果你看到這段文字,說明您正使用rss閱讀或轉自《一棵樹-博客園》,原文地址:http://www.49028c.com/atree/p/WebService_dynamic.html

代碼相對簡單,為什么可以如此調用呢?動態編譯后用反射來讀取并執行。也許了解反射及如何反射對你會有幫助。

反射提供了封裝程序集、模塊和類型的對象(Type 類型)??梢允褂梅瓷鋭討B創建類型的實例,將類型綁定到現有對象,或從現有對象獲取類型并調用其方法或訪問其字段和屬性。詳細請查看:https://msdn.microsoft.com/zh-cn/library/ms173183(VS.80).aspx

為什么WebServices可以通過反射實現?

WebService在傳輸過程中是通過WSDL來進行描述的(使用SOAP協議)。因此,我們需要獲取WebService的WSDL描述,并通過該描述來動態生成程序集。然后通過反射來獲取新生成的程序集,并調用其方法!

以下是MSDN對其的描述:

XML Web services 的接口通常由 Web 服務描述語言 (WSDL) 文件來說明。例如,若要獲取有關使用 http://localhost/service.asmx 處公開的 asp.net 的 Web 服務的 WSDL 說明,只需導航到 http://localhost/service.asmx?WSDL。使用 ServiceDescriptionImporter 類可以方便地將 WSDL 說明中包含的信息導入到System.CodeDom.CodeCompileUnit 對象。通過調整 Style 參數的值,可以指示 ServiceDescriptionImporter 實例生成客戶端代理類(通過透明調用該類可提供 Web 服務的功能)或生成抽象類(該類封裝 Web 服務的功能而不實現該功能)。如果將 Style 屬性設置為 Client,則 ServiceDescriptionImporter 生成客戶端代理類,通過調用這些類來提供說明的 Web 服務的功能。如果將 Style 屬性設置為 Server,則 ServiceDescriptionImporter 實例生成抽象類,這些類表示所說明的 XML Web services 的功能而不進行實現。然后,可以通過編寫從這些抽象類繼承的類來對其進行實現,并實現相關的方法。

了解更多關于WebServices的知識:

C#調用WebService實例和開發

Web Service 的工作原理

MSDN:https://msdn.microsoft.com/zh-cn/library/system.web.services.webservice(VS.80).aspx


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性videos高清精品| 少妇激情综合网| 91成人天堂久久成人| 国产精品精品视频一区二区三区| 国产成人av网| 国产精品一区二区电影| 亚洲视频专区在线| 92国产精品视频| 蜜臀久久99精品久久久无需会员| 久久夜色精品亚洲噜噜国产mv| 欧美黑人又粗大| 亚洲精品美女在线观看播放| 精品调教chinesegay| 亚洲精品有码在线| 精品久久中文字幕| 精品日本高清在线播放| 亚洲免费视频一区二区| 91香蕉嫩草影院入口| 久久69精品久久久久久久电影好| 欧美在线观看日本一区| 亚洲乱码一区av黑人高潮| 久久久国产成人精品| 美日韩精品免费视频| 国产精品久久网| 日韩美女视频在线观看| 久久久久久这里只有精品| 亚洲成人免费在线视频| 久久久久国产精品www| 中国china体内裑精亚洲片| 国产精品免费久久久久久| 91亚洲人电影| 亚洲欧美日韩久久久久久| 日本高清不卡在线| 欧美视频在线视频| 久久久国产一区二区| 国产精品久久久久久av下载红粉| 久久人人97超碰精品888| 欧美二区乱c黑人| 91免费在线视频| 亚洲日本成人女熟在线观看| 欧美在线免费视频| 一区二区亚洲欧洲国产日韩| 日韩av理论片| 九九热视频这里只有精品| 亚洲精品动漫100p| 日韩视频中文字幕| 亚洲国产精品免费| 日韩电影大片中文字幕| 欧美专区国产专区| 亚洲美女性生活视频| 国产日产久久高清欧美一区| 日韩欧美999| 日韩欧美国产中文字幕| 欧美日韩亚洲系列| 91久久夜色精品国产网站| 欧美日韩国产999| 国产suv精品一区二区三区88区| 永久免费毛片在线播放不卡| 日韩欧美a级成人黄色| 欧美激情视频一区| 91亚洲人电影| 久久国产加勒比精品无码| 国产欧美精品日韩精品| 日韩美女视频在线观看| 超在线视频97| 欧美国产日韩一区二区在线观看| 97视频在线观看亚洲| 国产亚洲一区二区精品| 国产亚洲a∨片在线观看| 日本国产一区二区三区| 日韩禁在线播放| 97视频在线看| 美日韩在线视频| 日韩精品在线免费播放| 911国产网站尤物在线观看| 国产一区二区三区精品久久久| 欧美性色视频在线| 日韩欧美国产黄色| 欧美裸体男粗大视频在线观看| 亚洲一级一级97网| 中文字幕日韩欧美精品在线观看| 精品久久久久久久久久久| 亚洲欧美日韩中文在线| 日韩精品免费在线视频| 在线视频国产日韩| 久久精品亚洲一区| 国产成人精品999| 成人免费高清完整版在线观看| 亚洲自拍在线观看| 国产成人精品a视频一区www| 国产欧美一区二区三区久久| 成人激情视频网| 日韩精品一二三四区| 亚洲国产成人91精品| 91亚洲精品久久久久久久久久久久| 国产精品丝袜视频| 97精品欧美一区二区三区| 国产日本欧美在线观看| 一本大道香蕉久在线播放29| 川上优av一区二区线观看| 亚洲欧美一区二区三区在线| 日韩欧美在线免费观看| 久久综合伊人77777尤物| 国产亚洲欧美aaaa| 欧日韩在线观看| 国产精品热视频| 亚洲国产婷婷香蕉久久久久久| 国产美女精品视频免费观看| 欧美猛少妇色xxxxx| 日韩国产精品视频| 日本精品久久久久影院| 国产成人高潮免费观看精品| 一区二区在线视频播放| 2024亚洲男人天堂| 亚洲成人精品视频| 日韩成人中文电影| 国产亚洲欧美日韩美女| 国产精品一区二区三区成人| 少妇精69xxtheporn| 国产精品激情自拍| 国产成人精品综合久久久| 国产精品∨欧美精品v日韩精品| 青青精品视频播放| 欧美激情久久久久久| 国产91对白在线播放| 91po在线观看91精品国产性色| 中文字幕日韩在线视频| 欧美成人在线影院| 日韩在线不卡视频| 久久中文精品视频| 国产日韩欧美夫妻视频在线观看| 黑人巨大精品欧美一区二区一视频| 欧美一区亚洲一区| 国产精品99久久99久久久二8| 欧美精品精品精品精品免费| 久久综合免费视频影院| 亚洲激情免费观看| 亚洲国产高清高潮精品美女| 中文字幕日韩在线视频| 久久人人爽人人爽人人片av高请| 亚洲国模精品私拍| 久久视频在线直播| 国内精品久久久久久久| 疯狂欧美牲乱大交777| 成人疯狂猛交xxx| 国产+成+人+亚洲欧洲| 精品国产老师黑色丝袜高跟鞋| 久久亚洲欧美日韩精品专区| 欧美国产一区二区三区| 国产免费成人av| 啪一啪鲁一鲁2019在线视频| 亚洲色图五月天| 国自在线精品视频| 久久精品99国产精品酒店日本| 亚洲成人精品在线| 久久久成人精品视频| 久久亚洲精品小早川怜子66| 成人激情视频在线| 国内免费久久久久久久久久久| 91精品视频一区| 亚洲国产精品成人va在线观看| 欧美日韩在线另类| 欧美电影免费看| 国产精品成久久久久三级|