Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » SQL Anywhere 数据访问 API » SQL Anywhere Web 服务

 

创建 SOAP 和 DISH Web 服务

SOAP 和 DISH Web 服务是创建可由标准 SOAP 客户端(如使用 Microsoft .NET 或 JAX-WS 编写的客户端)访问的标准 SOAP Web 服务的方法。

SOAP 服务

SOAP 服务是在 SQL Anywhere 中构造能够接受和处理标准 SOAP 请求的 Web 服务所使用的机制。

要声明 SOAP 服务,请将服务类型指定为 SOAP。标准 SOAP 请求的主体是 SOAP 封装,表示具有特定格式的 XML 文档。SQL Anywhere 使用您提供的过程分析和处理这些请求。响应将自动设置为标准 SOAP 响应(也是 SOAP 封装)的格式并返回客户端。

用于创建 SOAP 服务的语句的语法如下所示:

CREATE SERVICE service-name
TYPE 'SOAP'
[ FORMAT { 'DNET' | 'CONCRETE' | 'XML' | NULL } ]
[ common-attributes ]
AS statement
DISH 服务

DISH 服务充当 SOAP 服务组的代理。此外,它们会自动为其客户端构造用于描述当前公开的 SOAP 服务的 WSDL(Web 服务描述语言)文档。

创建 DISH 服务时,GROUP 子句中给定的名称决定了 DISH 服务公开哪些 SOAP 服务。每个以 DISH 服务名作为其名称前缀的 SOAP 服务都将公开。例如,指定 GROUP xyz 将公开 SOAP 服务 xyz/aaaa、xyz/bbbb 或 xyz/cccc。但不公开名为 abc/aaaa 或 xyzaaaa 的 SOAP 服务。SOAP 服务可由多个 DISH 服务公开。如果没有指定组名,则 DISH 服务公开数据库中的所有 SOAP 服务。DISH 组名中允许使用与 SOAP 服务名相同的字符。

用于创建 DISH 服务的语句的语法如下所示:

CREATE SERVICE service-name
TYPE 'DISH'
[ GROUP { group-name | NULL } ]
[ FORMAT { 'DNET' | 'CONCRETE' | 'XML' | NULL } ]
[ common-attributes ]
SOAP 和 DISH 服务格式

可以使用 CREATE SERVICE 语句的 FORMAT 子句自定义 SOAP 服务数据载荷,以最好地适应各种类型的 SOAP 客户端,如 .NET 和 JAX-WS。FORMAT 子句会影响 DISH 服务返回的 WSDL 文档的内容以及 SOAP 响应中返回的数据载荷的格式。

缺省格式 DNET 是适于与 .NET SOAP 客户端应用程序一同使用的本机格式(此类应用程序要求使用 .NET 数据集格式)。

CONCRETE 格式适于与根据返回数据结构的格式自动生成接口的客户端(如 JAX-WS 和 .NET)一同使用。指定此格式时,SQL Anywhere 返回的 WSDL 文档将公开一个具体描述结果集的 SimpleDataset 元素。此元素是由一组行(每行包含一组列元素)组成的行集的包容层次。

XML 格式适于与 SOAP 客户端一同使用,此类客户端将 SOAP 响应作为一个大型字符串接受并使用 XML 分析程序查找和抽取所需元素和值。此格式通常是不同类型的 SOAP 客户端之间最便于移植的格式。

如果未指定 SOAP 服务的格式,则从该服务的 DISH 服务声明继承格式。如果 DISH 服务也没有声明格式,则格式缺省设置为与 .NET 客户端兼容的 DNET。可以通过定义多个 DISH 服务(每个都使用一个不同的 FORMAT 类型)将没有声明格式的 SOAP 服务与不同类型的 SOAP 客户端同用。

创建同类 DISH 服务

SOAP 服务无需指定格式类型(即,您可将格式类型设置为 NULL)。在这种情况下,则从充当 SOAP 服务代理的 DISH 服务继承格式。每个 SOAP 服务可有多个 DISH 服务充当代理,并且这些 DISH 服务无需是同一类型。这些事实表明,可以通过使用多个属于不同类型的 DISH 服务将单个 SOAP 服务与不同类型的 SOAP 客户端(如 .NET 和 JAX-WS)一同使用。此类 DISH 服务称为同类服务,因为它们公开相同 SOAP 服务的相同数据载荷,只不过采用不同的格式。

以下面两个都没有指定格式的 SOAP 服务为例:

CREATE SERVICE "abc/hello"
TYPE 'SOAP'
AS CALL hello(:student);
CREATE SERVICE "abc/goodbye"
TYPE 'SOAP'
AS CALL goodbye(:student);

因为这两个服务都不包含 FORMAT 子句,所以格式缺省为 NULL;它继承自充当代理的 DISH 服务。现在,假定有下面两个 DISH 服务:

CREATE SERVICE "abc_xml"
TYPE 'DISH'
GROUP "abc"
FORMAT 'XML';
CREATE SERVICE "abc_concrete"
TYPE 'DISH'
GROUP "abc"
FORMAT 'CONCRETE';

由于两个 DISH 服务都指定相同的组名 abc,因此它们充当相同 SOAP 服务(即名称具有前缀 "abc/" 的所有 SOAP 服务)的代理。

但如果两个 SOAP 服务中有任一个是通过 abc_xml DISH 服务访问的,则该 SOAP 服务将继承 XML 格式;如果是通过 abc_concrete SOAP 服务访问,则继承 CONCRETE 格式。

每当想要实现不同类型 SOAP 客户端对所创建的 SOAP Web 服务的访问时,通过同类 DISH 服务便可避免重复的服务。