1. 程式人生 > >終於搞定無參“動態呼叫WebService方法”,其實很簡單,大家還是要有信心,還是要有琢磨的精神。

終於搞定無參“動態呼叫WebService方法”,其實很簡單,大家還是要有信心,還是要有琢磨的精神。

終於搞定“動態呼叫WebService方法”:

我在學習 動態呼叫WebService方法時看到很多網友在呼叫函式(其實往往是“無參”函式)時得到一個錯誤:

未將物件引用設定到物件的例項。

這個錯誤很常見,貌似不好處理,沒明白的人不知所云,所以這裡提醒我們自己:凡是都要有信心。

導致大家以為動態呼叫沒有成功,對整個動態呼叫方法都失去的信心,其實不然。

我研究了 MethodInfo的這個方法Invoke,發現通過拼湊方法可以變相成功。

為了方便學習的人,把所涉及到的內容都提上來。第一次寫部落格,我也是參考了N多網友的成功經驗,一併謝謝了。

請大家注意下面這句:

//我就是添加了下面的語句,就算是完全解決了呼叫WebService中函式帶參和不帶參的方法,雖然我對一些理論不是很清楚,但是用拼湊的方法除錯,到是成功了。

WebServiceHelper.cs

using System.Net; using System.CodeDom; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using DevExpress.XtraGrid; using DevExpress.XtraGrid.Views.Base; using System.Data.Common; using CrystalDecisions.Shared; using CrystalDecisions.CrystalReports.Engine; using System.IO; using System.Drawing.Printing; using System.Drawing.Imaging; using Microsoft.Reporting.WinForms; using System.Configuration; using System.Web.Services; using System.Web.Services.Description; using Microsoft.CSharp; using System.Reflection; using System.CodeDom.Compiler; namespace Print_ACCS {    public static class WebServiceHelper     {         //動態呼叫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             {                 //獲取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 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);//我就是添加了下面的語句,就算是完全解決了呼叫WebService中函式帶參和不帶參的方法,雖然我對一些理論不是很清楚,但是用拼湊的方法除錯總是解決了,還是早點把這個程式弄完吧。                 if (args[0] != "")                     return mi.Invoke(obj, args);                 else                 //Invoke(obj, BindingFlags.Default, new MyBinder(), new Object[] { (int)32, (int)32 }, CultureInfo.CurrentCulture);//這個是msdn上的,比較複雜有時間再琢磨。                     return mi.Invoke(obj, BindingFlags.Default, null, null, null);             }             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];         }     } }

在主程式中增加:

public static string WebSer_url = ConfigurationSettings.AppSettings["WebService_url"];

在配置檔案app.config中:增加WebService_url

< ?xml version="1.0"?> < configuration>     <configSections>     </configSections>   <appSettings>     <add key="WebService_url" value="http://192.168.3.117/ws/Service.asmx" />   </appSettings> < /configuration>

WebService的程式碼:

using System; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Data; using System.Configuration; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.OracleClient; using System.Text; namespace handsome {     [WebService(Namespace = "http://www.xxxx.com/")]     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]     //若要允許使用 ASP.NET AJAX 從指令碼中呼叫此 Web 服務,請取消對下行的註釋。     // [System.Web.Script.Services.ScriptService]     public class Service : System.Web.Services.WebService     {         public Service()         {             //如果使用設計的元件,請取消註釋以下行             //InitializeComponent();              }         private void InitializeComponent()         {         }         [WebMethod]         public string HelloWorld1()         {             myheader.isValid(out msg);             return "Hello World1";         }         [SoapHeader("myheader")]         [WebMethod]         public string HelloWorld2()         {             return "Hello World2";         }                [WebMethod(Description = "返回銷售發票的條碼")]         public string getbarcode_byINV_NO(string str_no)         {             return DbUtil_XSFP.getbarcode_byINV_NO(str_no);            }            }

}

具體呼叫時:

string st="";//為預設空變數,或者具體數值

File.WriteAllText(reportPath + file_barcode, (string)WebServiceHelper.InvokeWebService(logfrm.WebSer_url, "getbarcode_byINV_NO", new string[] { st }), Encoding.Default);

或者:

dev_gridcontr.DataSource = (DataTable)WebServiceHelper.InvokeWebService(logfrm.WebSer_url, "Get_XSFP_TIME", new string[] { "" }); 

object result = WebServiceHelper.InvokeWebService(url, "getbarcode_byINV_NO", new string[] { "CZXSFP-1202000088" });

相關推薦

終於動態呼叫WebService方法其實簡單大家還是要信心還是要琢磨精神

終於搞定“動態呼叫WebService方法”: 我在學習 動態呼叫WebService方法時看到很多網友在呼叫函式(其實往往是“無參”函式)時得到一個錯誤: 未將物件引用設定到物件的例項。 這個錯誤很常見,貌似不好處理,沒明白的人不知所云,所以這裡提醒我們自己:凡是

asp.net 動態呼叫webservice方法

假設我們現在已經有一個做好的webservice方法: [WebMethod(Description = "獲取分包商進場計劃資訊明細(根據時間範圍)")] public string getSubcontractorPlanList(s

C#動態呼叫WebService方法之WS代理

通常我們在程式中需要呼叫WebService時,都是通過“新增Web引用”,讓VS.NET環境來為我們生成服務代理,然後呼叫對應的Web服務。這樣是使工作簡單了,但是卻和提供Web服務的URL、方法名、引數繫結在一起了,這是VS.NET自動為我們生成Web服務代理的限制。

swift和oc的相互呼叫其實簡單(基於swift4.0)

swift呼叫oc: 需要在統一的bridge標頭檔案(xxx-Bridging-Header.h)裡面import,然後即可使用。 oc呼叫swift: 需要在暴露出來的方法和屬性上加@objc否則不可用;且檔案的類需要繼承自NSObject或NSObjec

利用python+seleniumUI自動化登錄獲取cookie後再去測試接口今天終於

zsh use avatar get 獲取 mod .text 獲取cookie mob #coding=utf-8from selenium import webdriverfrom selenium.common.exceptions import NoSuchElem

高考數學快速解題三招不等式恆成立問題

                   已知不等式恆成立,求引數的取值範圍問題是中學數學的重要內容之一,是函式、方程、不等式交匯處一個較為活躍的知識

cxf動態呼叫webservice慢的解決方案

CXF初次呼叫webservce很慢,是因為建立的過程比較耗時 初步方案可以結合快取(redis等)加快呼叫過程 //定義快取,加快建立效率 public static Map<String,Endpoint> factoryMap=new HashMap<Strin

轉載:動態呼叫WebService(C#)

         #region InvokeWebService // 動態呼叫web服務 public static object InvokeWebService( string url, string methodname, object

今天終於了Qt+gsoap2.8的編譯了.

相關文章 第一步,下載gsoap2.8                    地址:https://sourceforge.net/projects/gsoap2/files/                    學習資料:https://ww

終於Linux的NAT即時生效問題

                引:超長的前言Linux的NAT不能及時生效,因為它是基於ip_conntrack的,如果在NAT的iptables規則新增之前,此流的資料包已經綁定了一個ip_conntrack,那麼該NAT規則就不會生效,直到此ip_conntrack過期,如果一直有資料在魯莽地嘗試傳輸,

開發自己的IDE(十)終於了智慧提示了哇哈哈

    今天我終於實現了偉大的智慧提示了,真是渾身上下都在發光啊。這次智慧提示的程式碼可以在Vczh Library+ 3.0的頁面上看到。我使用了上一篇文章所提到的技術,在使用者輸入文字的時候,通過迅速獲得“當前編輯語句”的語法樹,再加上舊的“當前編輯語句”的作用域物件,來判斷使用者究竟處於整份

動態呼叫WebService服務的方法

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

Net 下采用GET/POST/SOAP方式動態呼叫WebService C#實現

 一直以來,我們都為動態呼叫WebService方法而煩惱。在.Net環境下,最常用的方法就是採用代理類來呼叫WebService,可以通過改變代理類的Url屬性來實現動態呼叫,但當xmlns改變時就會出錯,似乎要重新繫結Webservice並重新編譯後才能再次執行。我

usb wifi移植終於

1.選的wifi晶片是rtl8188cus 2.選的開發包是0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip 3.編譯8192cu.ko 4.編譯iwconfig工具 5.編譯wpa工具 6.移植到板上 1>

動態呼叫webservice地址(類)

public static class WebServiceHelper { /// <summary> /// 動態呼叫WebService /// </summary>

C#不新增引用動態呼叫webservice

好像很多人做WebService的時候都是直接新增引用的方式,然後呼叫服務端的方法。這樣就個問題,就是每次我服務端添加了方法或者修改了方法後都要更新Web引用,這樣比較麻煩。下面給一個不用新增引用的方式呼叫服務端的方法

終於了kali linux的網絡卡驅動問題

上一篇說我下了個1.0版本,結果放在VMware裡顯示grub無法安裝導致系統無法被引導,可能是因為低版本有專門為虛擬機器開發的VMware kali,而kali的官網上寫的是到kali2.0已結把虛擬機器版本結合到了

C#動態呼叫webservice方法

轉載自http://blog.sina.com.cn/s/blog_5d25ac4e0100yiel.html 一般情況下winform呼叫webservice時步驟 1新增服務引用---高階----新增web引用------填寫url--新增web引用即可完成對w

C# 之 動態呼叫WebService

通過前一篇部落格《WCF 之 AJax前臺呼叫WCF服務》我們可以不用配置終結點,而且可以動態的呼叫WCF服務。但是我們不僅僅要會動態的呼叫WCF服務,同時也需要研究一下怎麼樣動態的呼叫Web Service,今天就給大家介紹一下。 首先,我們先建立兩個Web Serv

Linux下tomcat設定jsp連線mysql 的問題忙了幾天終於

OS: Ubuntu6.06Tomcat: Tomcat 5.0.30Mysql: MySQL5.0.22mysql-connector: mysql-connector-java-3.1.14本來安裝完JDBC驅動mysql-connector-java後應該可以正常連線m