将 SOAP 用作 ATL 开发工具
ATL Server Web Services 为 C++ 开发人员提供了在本机代码中创建和使用 Web Services 的简便方式。ATL Server 是 C++ 开发人员在 Internet 上提供和使用 Web Services 的首选方法,其设计目的是为包含 SOAP 的 Web 应用提供快速、轻便和高度灵活的程序库。
ATL Server 之所以称为 ATL,是因为它体现了同时追求高性能和灵活性的 ATL 目标。例如,您可以很容易地抛开 ATL Server HTTP 模型,编写您自己的调度程序,同时仍然获得 ATL Server 封送/协议代码的好处。
ATL Server Web Services 使用与 COM 相似的语法说明接口,便于目前的 ATL 开发人员学习。这种与 COM 相似的语法允许开发人员轻而易举地将对象同时以 COM 对象和 Web Service 方式提供。
属性的引入大大简化了代码,使它对于非 ATL 开发人员也很容易。ATL Server 具有和其他所有 .NET Web Services 进行互操作的能力,这对那些在一个应用程序中使用多种技术的开发人员来说十分方便。
接口:新的 __interface 关键字使开发人员很容易创建 COM 对象或 Web Services 接口。
[ uuid("D7DAE6FD-AEBB-4579-BD8D-866F74139501"), object ] __interface IWeb_Service_ExampleService { [id(1)] HRESULT HelloWorld([in] BSTR bstrInput, [out, retval] BSTR *bstrOutput); }; | 这是一个运用 ATL Server 定义 Web Service 接口的例子。通过 C++ 属性的运用,嵌入式 IDL 属性和新的 __interface 关键字、ATL Server Web Service 接口看起来和新的属性化的 COM 接口非常相似。这里的 Web Service 接口样例 IWeb_Service_ExampleService 仅实现一个方法 HelloWorld。HelloWorld 用 BSTR 作为输入并返回 BSTR 作为输出。
请求处理程序:请求处理程序是一个 C++ 类,该类通过处理程序映射来提供,并且具有通过替代方法映射来提供的方法。处理程序映射只是文字标签与类名称的映射,而方法映射是类中文字标签与方法的映射。
[ request_handler(name="Default",sdl="GenWeb_Service_ExampleServiceSDL"), soap_handler( name="Web_Service_ExampleService", namespace="urn:Web_Service_ExampleService", protocol="soap" ) ] class CWeb_Service_ExampleService: public IWeb_Service_ExampleService { public:
[ soap_method ] HRESULT HelloWorld(BSTR bstrInput, BSTR *bstrOutput) { CComBSTR bstrOut(L"Hello "); bstrOut += bstrInput; bstrOut += L"!"; *bstrOutput = bstrOut.Detach();
return S_OK; } }; | ATL Server 请求处理程序模型与 Web 应用和 Web Services 非常相似。图 1 显示了处理请求的模型:
 图 1. ATL Server 请求处理模型 | HTTP Request 进入 IIS,将请求(基于 URL 及其扩展)映射到适当的 ISAPI DLL。然后,ISAPI DLL 把在请求中指定的处理程序(即在标签或查询参数中指定的处理程序)映射到适当的 Application DLL。Application DLL 再将这个处理程序映射到 C++ 对象。在这个模型(ATL Server 模型)中,Web 应用程序和 Web Service 的唯一差别在于最后一步。使用 Web Services,C++ 对象能够解码/编码 SOAP(当编译器解析 soap_handler 属性时,它会插入执行此操作的代码)。
您可以理解,这个类是从我们的接口继承过来的,并且我们使用 [soap_method] 属性指示将由 HelloWorld 方法来处理 SOAP 请求。实现这种方法和实现任何其他 C++ 方法是一样的。
这个 soap_handler 属性还确保自动生成有效说明服务的 WSDL。Web Service 的用户使用这个对服务的说明(格式为 XML/WSDL),确保他们能够以正确的格式发送/接收正确的数据。
通过 ATL Server 使用 Web Services
通过 ATL Server 使用 Web Services 相对来说是个比较简单的操作。开发人员只需使用 “Add Web Reference” 对话框,将它指向 .disco 文件,然后指向 WSDL,这和使用其他类型的 Web 引用一样。这个对话框在后台运行在 Web Service 的 WSDL 上的 sproxy.exe 实用程序(对于非本机的 .NET Web Services 有另外一个实用程序)。
该操作将创建 Web Service 代理文件,包含要求利用所请求的 Web Service 的全部 C++ 代码。使用 WSDL 中的信息,代理生成器能够判断 Web Service 要接收到的数据以及它要返回给客户端的数据。这就允许代理生成器创建可以和 Web Service“交谈”的头文件。
您只需创建自己的 Web Service 类(如在生成的头文件中查找到的一样)的实例,并且使用合适的方法即可,例如:
CWeb_Service_ExampleServiceService MyService; CComBSTR bstrOut; CComBSTR bstrIn(L"World"); MyService.HelloWorld ( bstrIn ,&bstrOut,); wprintf(bstrOut); | 现在,您就已经有一个基本的 ATL Server Web Service 和 ATL Server Web Service Consumer 了。
总结
本文的主要目的是对 .NET 框架和 Visual Studio.NET 中的 SOAP 功能作一个总体的介绍。其次,就如何创建使用 SOAP 的应用程序,给用户一些有益的指导。
|
|