動態呼叫webservice的三種方式

2021-06-06 12:25:31 字數 2720 閱讀 8986

動態呼叫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.建立...