在VC中呼叫 WebService 非託管

2022-02-17 01:58:49 字數 2843 閱讀 8183

一、使用visual studio.net呼叫webservice

很多次看到網友討論vc中呼叫webservice的問題,其實在visual studio.net(下稱vs.net)及其以後的版本中呼叫webservice已經變得相當簡單。你所要做的只是「找到 webservice的發布位址」,然後將其引用新增到vc專案中即可。接下來vs.net幫你生成的**類,會幫你搞定一大堆的麻煩事,包括:網路呼叫、資料傳遞等等;什麼soap啊、網路啊,你都可以不管。

二、託管還是非託管?

對於vs.net生成的c++**類,很多人都認為必須使用託管**,其實事實並非這樣。vs.net可以生成託管和非託管兩個版本的**類,至於要不要使用託管,那是你自己的選擇。

具體地說,對於使用託管的程式,vs.net會生成基於託管類庫的**類;你可以在生成的**中找到類的行:public system::web::services::protocols::soaphttpclientprotocol。對於不使用託管的程式,vs.net會生成基於atl的**;你可以在生成的**中找到類似的行:template >。

我想,如果不是確實需要的話,大部份人會選擇非託管的方式,因為這起碼可以讓我們的程式脫離.net framework執行。

三、動態設定webservice呼叫位址

這也是網上討論得比較多的乙個問題,因為websercie的位址不可能一成不變,特別是在開發除錯的時候。幸運的是,在兩種版本的**類中,都可以非常方便地在執行時設定webservice的位址。(具體做法參見例項)

四、程式示例(非託管)

由於已經有文章詳細講述了 

vc託管程式中呼叫 webservice 的過程

,因此以下示例只描述非託管vc程中呼叫webservice的方法。

1、新建乙個非託管的mfc應用程式,注意是非託管的,如下圖(圖1)

圖1、建立非託管程式

完成後,檢視vc專案屬性,可以確認不使用託管

圖2、檢視是否使用託管

2、新增webservice引用

在vc專案名稱上,單擊右鍵,選擇「新增web引用」。如下圖(圖3):

圖3、新增web引用

在彈出的「新增web引用」對話方塊中,填入websercie的引用位址, 然後點選「轉到按鈕」,可以看到webservice的提示頁面。

圖4、「新增web引用」對話方塊

點選頁面上的「service description」 鏈結可以看到具體的webmethod的宣告。我的這個webservice示例中,只定義了乙個web方法。該方法接受乙個字串作為使用者名稱,並返回乙個字串作為對使用者的問候語。如下圖所示:

圖5、檢視webmethod原型

在上圖中填入「web引用名」,然後點選「新增引用按鈕」。(在非託管版的**類中,這裡填的「web引用名」將沒有任保實質性的作用,所以隨便填入乙個名字即可。但是在託管版的**類中,「web引用名」將成為代量類的命名空間) 。接下來,vs.net將生成乙個webservice的**類,生成完後,會自動開啟webservice.h標頭檔案:

webservice.h並不是**類,這個標頭檔案其實是用於包含所有的**類的標頭檔案,你可以多新增幾個「web引用」試試。

3、瀏覽**類

我們不妨瀏覽一下生成的**類,做到有個基本的了解。切換到「類檢視」,可以看到乙個「debug」命名空間,全部展開,可以看到生成的**類的全部成員:

圖6、瀏覽生成的**

4、呼叫示例

首先包含標頭檔案,並開啟命名空間

#include "webservice.h"

using namespace debug; // 這個命名空間是自動生成的,與web服務的實現有關

以下是呼叫**

void cinvokedemodlg::onbnclickedbutton1()

else

delete debug;

couninitialize();

}

由於生成的**類是基於atl的,所以在呼叫前要初始化com呼叫。在上述的**中就使用了ccombstr而沒有直接使用bstr,因為ccombstr屬於智慧型別,可以自己管理記憶體分配,比較方便。 上述**中有一行被注釋的**呼叫了seturl來設定webservice的呼叫位址。在實際的專案中,可以將這個位址寫在配置檔案中。

5、執行結果

來,看一下吧~

五、結束語

通過以上示例可以看出,其實在vs.net中實現非託管的c++呼叫webservice是相當簡單的。當然,在實際的使用過程中,為了程式的徤壯,還需要更多的**邏輯,比如錯誤處理等等。

Android平台呼叫WebService詳解

部落格出處 手機號段歸屬地查詢 param phonesec 手機號段 public void getremoteinfo string phonesec catch exception e 獲取返回的資料 soapobject object soapobject envelope.bodyin 獲...

對於xfire動態呼叫webservice介面

xfire是辣麼過時,由於用到了,不能不研究一下。複雜型別返回值型別為 org.w3c.dom.document 型別物件 解析第乙個引數開始 document doc document os 0 element root doc.getdocumentelement listulist new a...

ASP構造SOAP呼叫WebService

一定要與webservice的命名空間相同,否則服務會拒絕 這樣就利用xmlhttp成功傳送了與soap示例所符的soap請求.檢測一下是否成功 以上 摘抄自網路,除以上方法外也可以使用 mssoap.soapclient30進行呼叫。這段 的主要意義在於可以了解到webservice的呼叫,主要是...