動態呼叫webservice的三種方式
上述步驟需要引用如下四個命名空間:
using system.web.services.description; //ws的描述
//以下幾個用於根據描述動態生成**並動態編譯獲取程式集
using system.codedom;
using microsoft.csharp;
using system.codedom.compiler;
上述幾個命名空間中包括如下幾個重要的類:
using system.web.services.description下:
servicedescription //ws描述
servicedescriptionimporter //通過描述生成客戶端**類,特別注意其中的style
以下是msdn對其的描述:
xmlweb services 的介面通常由 web 服務描述語言 (wsdl) 檔案來說明。例如,若要獲取有關使用 http://localhost/service.asmx 處公開的 asp.net 的 web 服務的 wsdl 說明,只需導航到http://localhost/service.asmx?wsdl。使用 servicedescriptionimporter 類可以方便地將 wsdl 說明中包含的資訊匯入到system.codedom.codecompileunit 物件。通過調整 style 引數的值,可以指示 servicedescriptionimporter 例項生成客戶端**類(通過透明呼叫該類可提供 web 服務的功能)或生成抽象類(該類封裝 web 服務的功能而不實現該功能)。如果將 style 屬性設定為 client,則 servicedescriptionimporter 生成客戶端**類,通過呼叫這些類來提供說明的 web 服務的功能。如果將 style 屬性設定為 server,則servicedescriptionimporter 例項生成抽象類,這些類表示所說明的 xml web services 的功能而不進行實現。然後,可以通過編寫從這些抽象類繼承的類來對其進行實現,並實現相關的方法。
using system.codedom下:
codedomunit//它用於設定動態**的命名空間,類名等,可以通過servicedescriptionimporter.import()方法將ws的描述**寫入該類,以作動態編譯用
using system.codedom.compiler下:
codedomprovider //用於建立和檢索**生成器和**編譯器的例項,我們主要用到其實現子類csharecodeprovider
可以直接用csharecodeproviderprovider=new csharecodeprovider()來生成,或者用codedomprovider.createprovider("csharp")來生成
icodecompiler //用於編譯基於 system.codedom 的源**表示形式。
它通過codedomprovider的createcompiler()方法來
compilerresults //表示從編譯器返回的編譯結果。它由icodecompiler根據指定的編譯器設定從指定的 codecompileunit 所包含的system.codedom 樹中編譯程式集並返回。compiledassembly屬性指示編譯的程式集。
了解如上資訊後,就可動態呼叫ws了。
ok,看看具體的例子。
我們要呼叫的目標 webservice,其 url 是 http://localhost:60436/learn.web/webservice.asmx
helloworld.asmx
[webservice(namespace ="", description="我的web服務")]
[webservicebinding(conformsto = wsiprofiles.basicprofile1_1)]
public class webservice : system.web.services.webservice
[webmethod]
public string helloworld()
}1. 動態呼叫 webservice
客戶端動態呼叫**
2. 生成客戶端**程式集檔案
上面的**通過在記憶體中建立動態程式集的方 式完成了動態呼叫過程。如果我們希望將客戶端**類生成程式集檔案儲存到硬碟,則可以進行如下修改。生成程式集檔案後,我們可以通過 assembly.loadfrom() 載入並進行反射呼叫。對於需要多次呼叫的系統,要比每次生成動態程式集效率高出很多。
呼叫程式集檔案演示
assembly asm =assembly.loadfrom("test.dll");
type t = asm.gettype("webservice");
object o = activator.createinstance(t);
methodinfo method = t.getmethod("helloworld");
console.writeline(method.invoke(o, null));
3. 獲取客戶端**類源**
還有一種情形,就是我們需要獲得客戶端**類的 c# 源**。
如果你呼叫時觸發 "webexception: 請求因 http 狀態 415 失敗: unsupported media type。" 這樣的異常,那麼恭喜你和我一樣鬱悶 ,趕緊把伺服器端的 wse 關掉吧。在必須使用 wse 的情況下,需要對客戶端進行調整,至於**需要你自己去寫了。呵呵~~~~
動態呼叫WebService
public static object invokewebservice string url,string methodname,object args 其中,url是web服務的位址,methodname是要呼叫服務方法名,args是要呼叫web服務所需的引數,返回值就是web服務返回的結果了...
動態呼叫webservice
protected string testservice string strurl,string methodname assembly asm assembly.loadfrom mytest.dll 載入前面生成的程式集 type t asm.gettype testwebservice.se...
動態呼叫WebService
1.大多數情況下,我們都是在vs裡面通過新增web引用的方式,在客戶端自動生成客戶端 去呼叫webservice的,有時候,伺服器端的位址可能會經常變,這裡就需要動態的呼叫webservice,一種是服務沒有變化只是ip位址變化了,這樣我們只需要在獲取客戶端 的時候,將其url位址修改即可。2.建立...