[轉]C# 動態調用 WebService

來源:互聯網
上載者:User

標籤:src   方法   void   sage   sem   asmx   cat   provider   false   

通常我們在程式中需要調用WebService時,都是通過“添加Web引用”,讓VS.NET環境來為我們產生服務代理,然後調用對應的Web服務。這樣是使工作簡單了,但是卻和提供Web服務的URL、方法名、參數綁定在一起了,這是VS.NET自動為我們產生Web服務代理的限制。如果哪一天發布Web服務的URL改變了,則我們需要重新讓VS.NET組建代理程式,並重新編譯。在某些情況下,這可能是不能忍受的,我們需要動態調用WebService的能力。比如我們可以把Web服務的URL儲存在設定檔中,這樣,當服務URL改變時,只需要修改設定檔就可以了。      說了這麼多,實際上我們要實現這樣的功能:

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

其中,url是Web服務的地址,methodname是要調用服務方法名,args是要調用Web服務所需的參數,傳回值就是web服務返回的結果了。      要實現這樣的功能,你需要這幾個方面的技能:反射、CodeDom、編程使用C#編譯器、WebService。在瞭解這些知識後,就可以容易的實現web服務的動態調用了:

using Microsoft.CSharp;using System;using System.CodeDom;using System.CodeDom.Compiler;using System.Web.Services.Description;using System.Xml;namespace PHY.BOP.Mvc4App.App_Start{    public class WebServiceHelper    {        #region InvokeWebService        //動態調用web服務        public static object InvokeWebService(string url, string methodname, object[] args)        {            return WebServiceHelper.InvokeWebService(url, null, methodname, args);        }        public static object InvokeWebService(string url, string classname, string methodname, object[] args)        {            string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";            if ((classname == null) || (classname == ""))            {                classname = WebServiceHelper.GetWsClassName(url);            }            try            {                //使用 Stream 對象,建立和格式化 WSDL 文檔                //WebClient wc = new WebClient();                //Stream stream = wc.OpenRead(url + "?WSDL");                //ServiceDescription sd = ServiceDescription.Read(stream);                //使用 XmlTextReader 對象,建立和格式化 WSDL 文檔                XmlTextReader reader = new XmlTextReader(url + "?wsdl");                                ServiceDescription sd = ServiceDescription.Read(reader);                                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");                //編譯代理類
                CSharpCodeProvider csc = new CSharpCodeProvider();
                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 (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 //通過webservice擷取國家對應的城市的名稱 private static void Main(string[] args) { string url = "http://www.webservicex.net/globalweather.asmx"; args = new string[1]; args[0] = "China"; object result = WebServiceHelper.InvokeWebService(url, "GetCitiesByCountry", args); System.Console.Write(result.ToString()); } }}

 

參考資源:

http://www.cnblogs.com/ruochen/archive/2007/12/11/990427.html

http://linglong117.blog.163.com/blog/static/277145472009127514463/

 

PS: 代碼中

[轉]C# 動態調用 WebService

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.