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





0/5 (0投票)
2007 年 3 月 6 日
3分钟阅读

55842

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、向对话框中添加新的控件
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 ( MD5
TempConvert_Binary.zip ( MD5: FA
编译和运行环境:Windows Server 2003+IIS6,VS C++ 2005
最后,请给我评论以改进它。