歡迎您光臨本站 註冊首頁

c# 三種方法調用WebService接口

←手機掃碼閱讀     火星人 @ 2020-07-07 , reply:0

1、引用*.wsdl文件

WebService服務端會提供wsdl文件,客戶端通過該文件生成.cs文件以及生成.dll.

注意:若服務端只提供的了URL,在URL後面加上"?wsdl"在瀏覽器上訪問,複製頁面內容,粘貼到文本文件,將文件後綴改為為"wsdl",即可得到wsdl文件。

通過URL或wsdl文件都可生成.cs文件。

生成.cs文件的方法有兩種,如下:

方法一:通過VS命令行工具生成

如上圖所示,輸入命令“wsdl /language:c# /n:CHEER.PresentationLayer /out:生成類的物理路徑(需先創建cs文件) WebService接口URL或wsdl文件物理路徑”即可。

方法二:VS中添加外部工具(方便以後使用)

VS工具菜單->外部工具->如下圖

輸入上圖紅框中的各個參數,其中,命令是:C:Program Files (x86)Microsoft SDKsWindowsv10.0AinNETFX 4.6.1 Toolswsdl.exe,即wsdl.exe的物理路徑。

初始目錄:$(ItemDir)表示當前項目根目錄下。

命名空間使用時直接改成自定義的名稱即可。

下圖是該外部工具的使用,先自定義命名空間名稱,再在out:後面加上空格,再加上WebService的URL或wsdl文件物理路徑

2、已知WebService接口的URL,直接調用

在VS中,添加服務引用--高級--添加web引用 直接輸入webservice URL

然後,直接實例化該命名空間下的類的對象,調用該接口下的各個方法即可。

3、動態調用WebService

先創建幫助類

  /// <summary>    /// 動態調用WebService的幫助類    /// </summary>    public class WebServiceHelper    {      #region InvokeWebService      /// < summary>      /// 動態調用web服務      ///< /summary>       /// < param name="url">WSDL服務地址< /param>      /// < param name="methodname">方法名< /param>      /// < param name="args">參數< /param>      /// < returns>< /returns>      public object InvokeWebService(string url, string methodname, object[] args)      {        return this.InvokeWebService(url, null, methodname, args);      }        /// < summary>      /// 動態調用web服務      /// < /summary>      /// < param name="url">WSDL服務地址< /param>      /// < param name="classname">類名< /param>      /// < param name="methodname">方法名< /param>       /// < param name="args">參數< /param>       /// < returns>< /returns>       public object InvokeWebService(string url, string classname, string methodname, object[] args)      {        string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";        if ((classname == null) || (classname == ""))        {          classname = WebServiceHelper.GetWsClassName(url);        }        try        {          //獲取WSDL           WebClient wc = new WebClient();          if (!url.ToUpper().Contains("WSDL"))          {            url = string.Format("{0}?{1}", url, "WSDL");          }          Stream stream = wc.OpenRead(url);          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 icc = 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 = icc.CompileAssemblyFromDom(cplist, ccu);          if (true == cr.Errors.HasErrors)          {            StringBuilder sb = new StringBuilder();            foreach (CompilerError ce in cr.Errors)            {              sb.Append(ce.ToString());              sb.Append(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(&#x27;/&#x27;);        string[] pps = parts[parts.Length - 1].Split(&#x27;.&#x27;);        if (pps[0].Contains("?"))        {          return pps[0].Split(&#x27;?&#x27;)[0];        }        return pps[0];      }      #endregion    }  WebServiceHelper    WebServiceHelper

 

然後調用,如下

  WebServiceHelper webService = new WebServiceHelper();        object obj= webService.InvokeWebService("http://127.0.0.1:8001/WebService1.asmx", "Add", new object[] {22,33 });        DataTable dt = obj as DataTable;

 

注意:該方法比價麻煩,每次調用InvokeWebService都是在內存中創建動態程序集,效率極低


[火星人 ] c# 三種方法調用WebService接口已經有1564次圍觀

http://coctec.com/docs/c/language/show-post-241563.html