終於搞定無參“動態呼叫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的程式碼:
}
具體呼叫時:
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