前言
因為最近的項目中需要運用到在MFC程序中調用WebService里面集成好了的函數,所以特意花了一天的時間來研究WebService的構建以及如何在MFC的程序中添加Web引用,進而來實現在C++ MFC中調用那些WebService中寫好的函數,中間也是遇到了一些不懂和不解的地方,好在通過度娘上的一些資料和自己的研究逐一的解決了,寫這篇文章的主要目的是,第一:讓自己記得更清楚,也方便以后不記得了可以及時回想起來。第二:讓其他的一些和我碰到一樣問題的朋友能更好的解決此問題。內容僅供參考,如有不對之處希望大家提出來一起交流。
第一部分:WebService的創建
首先,打開VS2005,“File->New->Project|Visual C#|ASP.NET Web Service Application”,新建一個名稱為“MyWebService”的應用程序。

接下來,你可以在新建的工程文件中修改代碼,你可以將[WebService(Namespace = "http://tempuri.org/")]中的tempuri.org改為你的IP地址或域名地址目錄,你也可以在類里面添加新的代碼,如下所示。
using System; using System.Data; using System.Web; using System.Collections; using System.Web.Services; using System.Web.Services.Protocols; using System.ComponentModel; namespace MyWebService { /// <summary> /// Summary description for Service1 /// </summary> [WebService(Namespace = "http://192.168.22.36/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] public class Service1 : System.Web.Services.WebService { [WebMethod(Description = "Default Function")] public string HelloWorld() { return "Hello World"; } // 新添加的方法 [WebMethod(Description = "My Sample Function")] public int Sum(int a, int b) { return a+b; } } }
接下來,你可以debug運行一下你現在的程序,可以看到現在的效果是這樣的。
點擊"Sum"超鏈接,跳轉到下一個頁面。
在編輯框中輸入a = 10,b = 100,點擊調用,就可以看到XML格式返回的WebService結果。
到這里,就說明我們的Web Service的環境沒有問題。接下來,我們要做的就是把我們建立好的Web Service發布到iis服務器上去。
第二部分:WebService的發布
首先,你可以在你自己的桌面新建一個文件夾(SampleWebService),這里有一個地方需要注意,我們需要右鍵點擊文件夾屬性,選擇安全tab頁,在安全頁下面點擊“編輯”,然后在彈出的頁面里面添加EveryOne的組或用戶名(EveryOne的SYSTEM的權限全部勾選允許)。

設定完后的圖片如下:

然后,進入到你第一步過程中新建好的WebService程序,選擇Release編譯環境,在“Solution Explorer”下面選擇你的WebService程序“MyWebService”,點擊右鍵選擇“Publish“,彈出“Publish Web”對話框,在彈出的對話框中設置”Target Location“為你剛才新建的文件夾”SampleWebService“的路徑,點擊”Publish“按鈕,如下圖所示。

接下來,我們來到”Internet信息服務(IIS)管理器“,點擊網站右鍵選擇“添加網站”,在彈出的”添加網站“對話框中設置“網站名稱”為SampleWebSite,物理路徑為我們上面新建的文件夾的路徑(也就是C:\Users\Administrator\Desktop\SampleWebService),“端口號”為避免重復,我們可以把它修改為8081,點擊”確定“按鈕,如下圖所示。

接下來,我們雙擊”Sample Website主頁”下面的“目錄瀏覽”,點擊啟用。

接下來,我們來到“應用程序池”,選中我們新建號的應用程序池“SampleWebSite”,點擊右鍵選中“高級設置”,在彈出的高級設置對話框中將“啟用32位應用程序”設置為True。

到這里,我們的WebService就發布完成了。你可以點擊iis管理器右手邊的“瀏覽網站”下面的“瀏覽*:8081(http)”來看一下你的WebService是否發布成功,發布成功的話會顯示如下頁面。

第三部分:調用WebService
首先,我們新建一個Win32應用程序“Sample”。然后進入應用程序,在“Solution Explorer”下面選擇你的Win32應用程序“Sample”,點擊右鍵選擇“Add Web Reference“,彈出“Add Web Reference”對話框,在彈出的對話框中設置”URL“為我們在第二部分中發布的鏈接“http://localhost:8081/Service1.asmx”,設置“Web reference name”為SampleRefer,點擊”Add Reference“按鈕,如下圖所示。

執行完這步以后,我們可以看到應用程序中多出來了幾個文件。

接下來,我們在Sample.cpp中添加如下代碼。
#include "stdafx.h" #include <stdio.h> #include "WebService.h" using namespace Service1; int _tmain(int argc, _TCHAR* argv[]) { // 初始化com組件運行環境 ::CoInitialize(NULL); // 如果第八行沒有命名空間Service1 // 這里可以寫成Service1::CService1 ws CService1 ws; int nNum1 = 10; int nNum2 = 100; int nSum = 0; HRESULT hr = ws.Sum(nNum1, nNum2, &nSum); printf("The Sum of the two num is:%d\n",nSum); getchar(); return 0; }

總結
至此,我們的C++程序中調用WebService的整個實現過程都介紹完畢,對於MFC的應用程序,和Win32的應用程序的實現代碼沒有什么區別,這里我們就不多做介紹。對於我來說,過程中主要遇到的問題主要還是在WebService發布到iis上時的一些環境的配置不是很准確,例如發布的時候我們必須Release編譯環境,必須設置Everyone的權限等。還有就是寫代碼的時候不是像我們調用類里面的函數一樣去調用WebService中的函數,我們要做一個com組件的初始化,為了方便要定義命名空間,調用的函數有一個HRESULT類型的返回值等等。最后還是希望大家可以相互學習吧,有什么不對的地方一起討論。