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