C# 調用WebService的3種方式 :直接調用、根據wsdl生成webservice的.cs文件及生成dll調用、動態調用

 關於soapheader調用,能夠參考html

C#調用Java的WebService添加SOAPHeader驗證

 

 

1.直接調用web

已知webservice路徑,則能夠直接 添加服務引用--高級--添加web引用 直接輸入webservice URL。這個比較常見也很簡單數組

即有完整的webservice文件目錄以下圖所示,ide

也能夠在本地IIS根據webservice文件目錄新發佈一個webservice,而後程序動態調用,修改Url函數

public new string Url { set; get; }

 

 

2.根據wsdl文件生成webservice 的.cs文件 及 生成dll C#調用  post

有時沒有這麼多文件,只有wsdl文件ui

wsdl文件能夠有別人提供或者根據webservice地址獲取:url

http://localhost:8888/WS.asmx?wsdlspa

 

 

 

Visual Studio 2013->Visual Studio Tools->VS2013 開發人員命令提示.net

 

 

命令行輸入

wsdl E:\WS.wsdl /out:WS.cs

 
E:\WS.wsdl  是wsdl文件存儲路徑,也能夠是http://localhost:8888/WS.asmx?wsdl
 
不報錯的話,看路徑下 Program Files\Microsoft Visual Studio 12.0\WS.cs已經自動生成
 
.cs文件看函數聲明,結構體等都很是方便
 
而後命令行執行
csc /t:library WS.cs
 
一樣的路徑下,生成了WS.dll,拷貝出去放到項目文件夾下,C# winform程序也能夠添加引用了。
 
生成的文件默認在這裏:
 
 
 
默認生成的SOAP版本爲1.1,能夠

G:\Program Files\Microsoft Visual Studio 12.0>wsdl E:\e.wsdl /protocol:SOAP12 /out:e.cs

來指定1.2

 
 

3.C# 動態調用WebService  

在C#程序中,若要調用WebService,通常是採用"添加Web引用"的方式來實現的。但若是此WebService的URL是在程序運行過程當中才能得到的,那怎麼辦呢?那就必須是"動態"調用這個WebService了。

 
舉個使用它的例子:
 object[] args = new object[1];  
 args.SetValue("cyy_JS", 0);             
DataTable dt = WebServiceHelper.InvokeWebService("http://192.168.0.10/DBMS_CYY/DBMS_Service.asmx", "GetUserTreeListData", args) as DataTable;

 

 
恩~有點麻煩,這意味着每次我都要把想調用的函數的參數組織成一個object[]才行,且每次調用InvokeWebService都是在內存中建立動態程序集,效率極低。則次種方法絕對沒有直接用「實例名.方法名(參數列表)」來的舒服。
 
我把它放到一個叫WebServiceHelper.cs的類裏面了。
 
using System.IO;
using System.Web.Services.Description;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.CodeDom;
 
/// <summary>   
        /// 動態調用WebService   
        /// </summary>   
        /// <param name="url">WebService地址</param>   
        /// <param name="classname">類名</param>   
        /// <param name="methodname">方法名(模塊名)</param>   
        /// <param name="args">參數列表</param>   
        /// <returns>object</returns>   
        public static object InvokeWebService(string url, string classname, string methodname, object[] args)  
        {  
            string @namespace = "ServiceBase.WebService.DynamicWebLoad";  
            if (classname == null || 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);  
            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 = icc.CompileAssemblyFromDom(cplist, ccu);  
            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 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];  
        }  

  

參考 http://blog.csdn.net/chuxiamuxiang/article/details/5731988

相關文章
相關標籤/搜索