WebService 其實就是一個基于網(wǎng)絡(luò)的應(yīng)用程序,它向外部程序提供一定的調(diào)用接口。外部(遠程)的程序,可以經(jīng)由Web對其進行調(diào)用。
二、 WebService 的特性:
1.由于 WebService 經(jīng)由web服務(wù)器發(fā)布,所以比DCOM而言,可以順利穿過防火墻。這也是 WebService 的優(yōu)點之一,可以說, WebService ,為分布 式應(yīng)用的開發(fā),提供了一個很好的平臺。
2.對 WebService 的調(diào)用,是通過SOAP協(xié)議進行的。簡單對象訪問協(xié)議(SOAP)提供了標(biāo)準(zhǔn)的遠程過程調(diào)用(RPC)方法來調(diào)用Web service。 而SOAP也是基于XML和XSD的,XML是SOAP的數(shù)據(jù)編碼方式,因此,對 WebService 的調(diào)用也可以是跨平臺的。、
三、怎樣調(diào)用 WebService ?
Visual Studio.NET 內(nèi)建提供了對 WebService 的調(diào)用。在VC.NET中,調(diào)用 WebService 只需要簡單的幾個步驟即可。只要找到 WebService 的發(fā)布 地址,將地址引入到VC工程中。這時,編譯器會預(yù)先編譯一次,自動生成和 WebService 相關(guān)的頭文件(也可以叫Web代理文件) WebService .h。 在你的程序中,包含 WebService .h然后生成相關(guān)的對象,就可以對遠程的 WebService 進行調(diào)用了。
為演示怎樣調(diào)用 WebService ,我們用網(wǎng)上一個已經(jīng)發(fā)布的 WebService ,名字叫TranslateService,其功能是對多種語言進行互相翻譯。 這個 WebService 的地址如下: http://www.WebServicex.net/TranslateService.asmx
四、程序示例
1.基于控制臺的托管程序示例
下面,我們先介紹VC.net中,基于控制臺的托管程序,調(diào)用 WebService 的例子:
啟動Visual Studio.NET 2003,新建一個Visual C++項目,類型選擇為基于.NET的托管控制臺應(yīng)用。然后,引入 WebService 到工程,在解決方案 的項目名稱上,單擊右鍵,選擇“添加Web引用”。如下圖(圖1):
圖1 添加 WebService 引用到工程中
填入 WebService 的地址,然后點擊”轉(zhuǎn)到”按鈕。 WebService 的相關(guān)細節(jié),會被顯示在下面。Web引用名,可以采用默認的名字,也可以自己設(shè)置 一個,在這里,我們起名叫TService。然后點擊“添加引用”(圖2),編譯器自動生成TService.h以及 WebService .h。在 WebService .h里面已經(jīng)包含了 TService.h。在工程的代碼中,我們直接包含頭文件 WebService .h即可。
圖2 添加 WebService
TService.h是由編譯器自動生成的,打開文件,我們可以看到,在命名空間TService中,編譯器為我們自動封裝了一個叫TranslateService的托管 類,以及一個名字叫Language的枚舉類型。
Language類型在這個 WebService 中,用來描述翻譯語言的類型,比如:
EnglishTOChinese(英語到中文)
ChineseTOEnglish(中文到英語)
EnglishTOGerman (英語到德語)
EnglishTOFrench (英語到法語)
等等……
在測試程序中,我們選擇英語到中文的形式。 程序結(jié)果如下:(圖3) 2.基于MFC的程序示例 在MFC程序中,一樣可以調(diào)用 WebService ,我們可以建立一個簡單的基于對話框的MFC程序,工程名字為TranslateMFC。由于需要使用托管類型,所以 在編譯器設(shè)置里面,需要打開/clr開關(guān)。(圖4)選擇項目—TranslateMFC屬性,打開項目的屬性頁,在常規(guī),下面的使用托管擴展選項,將其選擇為“是”。 這樣,我們的項目就支持托管了C++擴展了。 圖4 在工程屬性打開clr開關(guān) 和上一個例子的方法一樣,引用 WebService 到工程,創(chuàng)建 WebService 對象,然后調(diào)用 WebService 。不過在MFC中,我們?nèi)绻苯佑胣ew來創(chuàng)建 WebService 對象的時候,編譯器會報錯(如下圖)這是為什么呢? 圖5 編譯產(chǎn)生的C3828錯誤 為了跟蹤內(nèi)存的使用情況,在 MFC 調(diào)試版本中使用時 MFC 重定義 new 運算符。由于此重定義的緣故,會在 MFC 應(yīng)用程序中創(chuàng)建托管類的實例,從而導(dǎo)致錯誤。在將現(xiàn)有 MFC 代碼移植到公共語言運行庫時通常會發(fā)生這種情況。對于發(fā)布版本不會發(fā)生該錯誤,這是因為 MFC 不重定義 new 運算符。在以下示例中,放置在 .cpp 文件中的托管代碼創(chuàng)建 String 類的一個實例。這將導(dǎo)致在 MFC 應(yīng)用程序調(diào)試版本中進行編譯時發(fā)生C3828編譯器錯誤。若要避免該錯誤,可在創(chuàng)建托管類型實例前,使用#undef 和 push_macro指令暫時取消定義 new 運算符。在最后一行托管代碼的后面,使用pop_macro 還原先前的 new 運算符定義。示例代碼如下:(圖6) 由于此 WebService 支持30多中語言類型的轉(zhuǎn)換,在這里,為示例簡單,我只保留了幾門語言的轉(zhuǎn)換功能。其他的語言,只需要判斷的時候,加入不同 Language枚舉類型即可。 下面是程序運行的結(jié)果演示: 圖7 MFC程序運行界面 圖7 英文翻譯為中文 圖8 英文翻譯為日文 圖9 英文翻譯為法文 五、結(jié)束語 通過以上的例子,我們看到了 WebService 為構(gòu)建分布式應(yīng)用,提供了強大的功能支持。 更多的有關(guān) WebService 的問題,請訪問http://www.microsoft.com/china/MSDN/library/ WebService s獲取更多的信息
#include "stdafx.h"#include " WebService .h"http://包含 WebService .h頭文件到程序中#using
using namespace TService;
//使用TService的命名空間int _tmain(){ String *str=new String(S"Hello,world!");
String *strResult;
TranslateService *pService=new TranslateService;
//建立遠程 WebService 對象 Language Lan=Language::EnglishTOChinese;
//設(shè)置翻譯類型 strResult=pService->Translate(Lan,str);
//調(diào)用 WebService Console::WriteLine(str);
Console::WriteLine(strResult);
//輸出結(jié)果 return 0;}