65.9K
CodeProject 正在变化。 阅读更多。
Home

温度转换:使用 ATL Server 和 MFC 客户端的 XML Web 服务

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2007 年 3 月 6 日

3分钟阅读

viewsIcon

55842

downloadIcon

751

使用 ATL Server 的 XML Web 服务,并由 MFC 客户端调用。

引言

如果您是一位厌倦了DCOM和RPC的C++程序员,渴望找到一种新的方式,并且能够自由地管理您的代码。但是您又不想错过接触XML Web Service的机会,也许您可以选择.Net (C#) 来创建一个。但如果您想获得更高的性能,更多的会促使您选择ATL服务器Web服务。本文基于MSDN ( 演练:使用ATL服务器创建XML Web服务),它演示了使用C++和ATL服务器创建将华氏温度转换为摄氏温度的XML Web服务。我增强了该功能,使其可以在ATL服务器Web服务函数中转换华氏温度和摄氏温度,并使用MFC客户端来使用此Web服务而不是控制台应用程序。代码是未托管的C++,而不是托管的。

您将完成以下活动

在本次演练的过程中,您将完成以下活动

  • 使用名为TempConvert的ATL服务器Web服务项目模板创建一个XML Web服务。
  • 实现XML Web服务。
  • 部署XML Web服务。
  • 创建一个MFC应用程序来调用XML Web服务。

创建XML Web服务项目

首先,您应该创建一个空白的解决方案 TempConvert。 然后,您可以使用向导向此解决方案中添加一个新的XML Web服务项目,名为TempConvert。

实现XML Web服务

ATL服务器的理论是使用ISAPI扩展DLL来调用Web服务应用程序DLL中定义的函数处理程序,以响应您的XML Web服务请求。

1、在接口 ITempConvertService 中,使用TempConvert.h中的以下代码替换示例 helloWorld 方法

__interface ITempConvertService 

{ 

// declare a web service method and its in-parameters 

//and out-parameters 

//Convert Fahrenheit to Celsius 

[id(1)] HRESULT ConTempFah2Cel( 

[in] double dFahrenheit, 

[out, retval] double* pdCelsius); 

//Convert Celsius to Fahrenheit 

[id(2)] HRESULT ConTempCel2Fah( 

[in] double dCelsius, 

[out, retval] double* pdFahrenheit); 

};

2、CTempConvertService 类提供了XML Web服务的实现。 将代码添加到 TempConvert.h 文件中。

class CTempConvertService :

public ITempConvertService

{

public:

// This is a sample web service method that shows how to use the 

// soap_method attribute to expose a method as a web method

[ soap_method ]

HRESULT ConTempFah2Cel(

/* [in]*/ double dFahrenheit,

/* [out, retval] */ double* pdCelsius)

{

if(!pdCelsius)

return E_INVALIDARG; 

*pdCelsius=((dFahrenheit-32)*5)/9; 

return S_OK;

}

[ soap_method ]

HRESULT ConTempCel2Fah(

/* [in]*/ double dCelsius,

/* [out, retval] */ double* pdFahrenheit)

{

if(!pdFahrenheit)

return E_INVALIDARG;

*pdFahrenheit=dCelsius*9/5+32;

return S_OK;

}

}; // class CTempConvertService

部署XML Web服务

如果一切正常,请编译解决方案并将其部署到您的机器上,这里部署到本地站点 localhost, 您可以在IE中查看它:https:///TempConvert/TempConvert.dll?Handler=GenTempConvertWSDL

它仅以XML显示。您将在以下使用MFC客户端的调用XML Web服务。

创建一个MFC应用程序来调用XML Web服务

1、创建一个基于对话框的MFC应用程序 TempConvertClient

2、使用URL添加Web引用:https:///TempConvert/TempConvert.dll?Handler=GenTempConvertWSDL ,一个可用的备用URL是:http://ws.bomege.com/bin/TempConvert.dll?Handler=GenTempConvertWSDL (来源应用此)

并将其重命名为 TempConvert;

3、向对话框中添加新的控件

Screenshot - TempConvertDialog.gif

<formulas /></formulas />

4、打开文件 TempConvertClientDlg.h,在 CTempConvertClientDlg 类中添加变量和方法

class CTempConvertClientDlg : public CDialog 

{ 

// Construction 

public: 

CTempConvertClientDlg(CWnd* pParent = NULL); // standard constructor 

// Dialog Data 

enum { IDD = IDD_TEMPCONVERTCLIENT_DIALOG }; 

protected: 

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 

afx_msg void OnBnClickedC2F(); 

afx_msg void OnBnClickedF2C(); 

// Implementation 

protected: 

HICON m_hIcon; 

double m_dTempF; 

double m_dTempC; 

// Generated message map functions 

virtual BOOL OnInitDialog(); 

afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 

afx_msg void OnPaint(); 

afx_msg HCURSOR OnQueryDragIcon(); 

afx_msg void OnConvert(); 

DECLARE_MESSAGE_MAP() 

}; 

5、在文件 TempConvertClientDlg.cpp 中,添加实现方法和转换按钮的事件处理程序

void CTempConvertClientDlg::OnConvert() 

{ 

UpdateData(TRUE); 

CoInitialize(NULL); 

HRESULT hr = S_OK; 

//Get Radio state 

UINT m_iRadio=GetCheckedRadioButton(IDC_RADIOF2C,IDC_RADIOC2F); 

GetDlgItem(IDC_CONVERT)->EnableWindow(FALSE); 

CTempConvertService *pTempCon=new CTempConvertService; 

switch(m_iRadio){ 

case IDC_RADIOC2F: 

double dFah; 

hr=pTempCon->ConTempCel2Fah(m_dTempC,&dFah); 

if(SUCCEEDED(hr)){ 

m_dTempF=dFah; 

GetDlgItem(IDC_CONVERT)->EnableWindow(); 

UpdateData(FALSE); 

}else{ 

MessageBox(_T("Convert Service Failed!"),_T("Service Failed"),MB_OK | MB_ICONHAND); 

} 

case IDC_RADIOF2C: 

double dCel; 

hr=pTempCon->ConTempFah2Cel(m_dTempF,&dCel); 

if(SUCCEEDED(hr)){ 

m_dTempC=dCel; 

GetDlgItem(IDC_CONVERT)->EnableWindow(); 

UpdateData(FALSE); 

}else{ 

MessageBox(_T("Convert Service Failed!"),_T("Service Failed"),MB_OK | MB_ICONHAND); 

} 

} 

delete pTempCon; 

CoUninitialize(); 

} 

6、单击单选控件时,将向名为Convert的按钮发送消息BM_CLICK

void CTempConvertClientDlg::OnBnClickedC2F() 

{ 

//Send Message to call Button IDC_CONVERT 

GetDlgItem(IDC_CONVERT)->SendMessage(BM_CLICK,0,0); 

} 

void CTempConvertClientDlg::OnBnClickedF2C() 

{ 

//Send Message to call Button IDC_CONVERT 

GetDlgItem(IDC_CONVERT)->SendMessage(BM_CLICK,0,0); 

} 

疑难点

1、Web服务项目构建成功但无法运行? 您需要在IIS配置中向ISAPI DLL添加一个“dll”解析,它将处理应用程序dll。

2、源代码使用VS.NET C++ 2005,如果您使用早期的VS C++版本,只需创建一个新的空白解决方案项目,然后添加*.cpp、*.h等项目。

源文件:TempConvert.zip ( MD54905C832B30AE5FDFF25C4CDA64D6762)

TempConvert_Binary.zip ( MD5: FA5F7ECD19E73BC2D12F7CD93A38EC9A)

编译和运行环境:Windows Server 2003+IIS6,VS C++ 2005

最后,请给我评论以改进它。

© . All rights reserved.