设计支持 WS-I 标准的 Web服务(五)

日期: 2007-12-13 作者:Parlione 来源:TechTarget中国

  数组表示

  Lotus Domino V7.0.2 生成的用于 Web 服务的 WSDL 所包含的数组不满足 WS-I 依从性。这将对以下的编码产生影响:

  Domino V7 Document Literal
  Domino V7 Document Wrapped
  Domino V7 Document RPC Literal

  WS-I 测试失败源于以下错误:

  "An Array declaration uses – restricts or extends – the soapenc:Array type,
or the wsdl:arrayType attribute is used in the type declaration."
 
  对于三种不同的编码,WSDL 中使用清单 16 所示的代码来表示数组。

  清单 16. 生成的 WSDL
<complexType name="ArrayOf_xsd_string">
 <complexContent>
  <restriction base="soapenc:Array">
   <attribute ref="soapenc:arrayType" wsdl_arrayType="xsd:string[]"/>
  </restriction>
 </complexContent>
</complexType>
   
  解决此问题的办法是手工编辑 WSDL 并将它们导入 Lotus Domino Designer 中(有关将 WSDL 导入 Lotus Domino Designer 的更多信息,请参阅 “导入 WSDL” 一节)。 要使它满足 WS-I 依从性,可删除 <complexContent> 标记并将其替换为 <sequence> 标记,如清单 17 所示。

  清单 17. 满足依从性的 WSDL
<complexType name="ArrayOf_xsd_string">
 <sequence>
  <element maxOccurs="unbounded" minOccurs="0" name="item" type="xsd:string"/>
 </sequence>
</complexType>
   
  Namespace 属性

  出于 WS-I 依从性考虑,namespace 属性不能包含在任何 soapbind:body、soapbind:header、soapbind:headerfault、soapbind:fault 元素中。此问题会影响以下的 WSDL 编码:

  Domino V7.0.2 Document Literal
  Domino V7.0.2 Document Wrapped

  运行 WS-I 测试工具后将得到以下错误消息:

  "A document-literal binding in a DESCRIPTION MUST NOT have
  the namespace attribute specified on contained soapbind:body,soapbind:header, soapbind:headerfault
and soapbind:fault elements."
  
  清单 18 展示了生成的 WSDL 的一部分,它对于 Document Wrapped 和 Document Literal 都不满足 WS-I 依从性,二者包含了 namespace 属性。

  清单 18. 生成的 WSDL

<wsdl:binding name="DiscussionProfileManagerSoapBinding"
  type="impl:DiscussionProfileManagerPort">
  <wsdlsoap:binding style="document"
   transport="http://schemas.xmlsoap.org/soap/http" />
  <wsdl:operation name="GETVERSION">
   <wsdlsoap:operation soapAction="" />
   <wsdl:input name="GETVERSIONRequest">
    <wsdlsoap:body namespace="urn:DefaultNamespace"
     use="literal" />
   </wsdl:input>
   <wsdl:output name="GETVERSIONResponse">
    <wsdlsoap:body namespace="urn:DefaultNamespace"
     use="literal" />
   </wsdl:output>
  </wsdl:operation>
   
  要解决这个问题,可以手工编辑 WSDL 并从 <wsdlsoap:body> 标记删除 namespace 属性,如清单 19 中的 WSDL 示例所示。然后将 WSDL 导入到 Lotus Domino Designer 中。

  清单 19. 满足依从性的 WSDL
<wsdl:binding name="DiscussionProfileManagerSoapBinding"
  type="impl:DiscussionProfileManagerPort">
  <wsdlsoap:binding style="document"
   transport="http://schemas.xmlsoap.org/soap/http" />
  <wsdl:operation name="GETVERSION">
   <wsdlsoap:operation soapAction="" />
   <wsdl:input name="GETVERSIONRequest">
    <wsdlsoap:body use="literal" />
   </wsdl:input>
   <wsdl:output name="GETVERSIONResponse">
    <wsdlsoap:body use="literal" />
   </wsdl:output>  
</wsdl:operation>
   
  WSDL 元素属性

  当 <wsdl:message> 标记中的 <wsdl:part> 标记使用题头或错误元素的类型属性来定义时就会出现这个错误。此错误将影响以下编码:

  Domino V7.0.2 RPC Literal
  Domino V8 RPC Literal

  针对此错误给出的消息是:

"A wsdl:binding in a DESCRIPTION MUST refer, in each of itssoapbind:header,
soapbind:headerfault and soapbind:fault elements, only to wsdl:part element(s) that have been defined
using the element attribute."
  因为 fault 和 header 不包含参数,所以对于每个 WSDL 1.1,soapbind:fault、soapbind:header 和 soapbind:headerfault 假定 style 属性的值为 document。所有 style 属性值为 document 并且被绑定到 soapbind:body 上的 wsdl:part 元素都使用 element 属性来定义。对 soapbind:fault、soapbind:header 和 soapbind:headerfault 元素也有同样的要求。

  注意:RPC Literal Web 服务的 header 元素和 fault 元素都应按 Document Literal 中相同的样式来定义,按照断言需求 R2205 编码。

  清单 20 中给出了一个不满足 WS-I 依从性的 WSDL。请注意 <wsdl:part> 标记中 type 属性的使用。

  清单 20. 生成的 WSDL
<complexType name="DISCUSSIONERROR">
 <sequence>
  …
  …
 </sequence>
</complexType>


<wsdl:message name="DISCUSSIONERROR">
   <wsdl:part name="DISCUSSIONERROR" type="impl:DISCUSSIONERROR" />
</wsdl:message>
   
  要更改这个 WSDL,使它满足 WS-I 依从性,可以手工地将 <element> 标记添加到 <complexType> 标记两侧并将 <wsdl:part> 标记中的 type 属性更改为 element 属性。清单 21 给出了一个满足依从性 WSDL 的示例。编辑 WSDL 后,将编辑后的 WSDL 导入到 Lotus Domino Designer 中。

  清单 21. 满足依从性的 WSDL
                <element name="DISCUSSIONERROR">
 <complexType>
  <sequence>
   …
   …
  </sequence>
 </complexType>
</element>


<wsdl:message name="DISCUSSIONERROR">
   <wsdl:part name="DISCUSSIONERROR" element="impl:DISCUSSIONERROR" />
</wsdl:message>
   
  Message 元素拥有多个 part 元素

  如果对于以下编码,在 <wsdl:message> 标记中有多个 <wsdl:part> 元素就会出现这个错误:

  Domino V7.0.2 Document Literal
  Domino V8 Document Literal

  这些编码使 WS-I 测试失败后得到以下错误信息:

  "A document-literal binding which does not specify the parts attribute, has more than one wsdl:part in the associated wsdl:message element."
  
  清单 22 给出了生成的 WSDL 中出问题的部分。
  
  清单 22. 生成的 WSDL
 <wsdl:message name="LISTAUTHORSBYEXAMPLEANDSORTCRITERIARequest">
  <wsdl:part element="impl:EXAMPLE" name="EXAMPLE" />
  <wsdl:part element="impl:SORT" name="SORT" />
</wsdl:message>
   
  当定义 document/literal 服务时,在输入消息和输出消息中都最多只能有一个 body 部分。因此,Web 服务传递给方法的参数不能多于一个。如果要使用带有多个参数的方法,则必须使 Document Wrapped 编码满足依从性。

  绑定拥有不惟一的操作

  出现此错误是因为 message 元素包含了不惟一的部分。这个错误会影响以下编码:

  Domino V7.0.2 Document Literal
  Domino V8 Document Literal

  运行 WS-I 测试后将出现以下错误消息:

  "A binding has operations that are not unique."

  清单 23 给出了不满足依从性的 WSDL 的一段。注意 message 元素中的一些 part 元素不惟一,比如 ID 元素就不惟一。
 
  清单 23. 生成的 WSDL
 


<wsdl:types>
  <schema targetNamespace="urn:DefaultNamespace"
   >

  图 9. Web Service 属性框
 
  关闭 Web Service 属性框。
  保存 Web 服务。
  WS-I 静态依从性测试可以轻松地集成到基于 Ant 的构建环境中,并通过构建自动化工具(如 CruiseControl)自动执行。我们建议您在构建解决方案时连续地检查公开的 Web 服务是否兼容。

  对于 Domino Discussion 数据库 Web 服务,Lotus Domino V7.0.2 没有生成满足 WS-I 规范的 WSDL 文档,但是可以手工编辑 WSDL 文档来实现 WS-I 依从性然后将其导入 Lotus Domino Designer 中。对于 Lotus Domino V8,惟一不会使生成满足 WS-I 规范的 WSDL 文档失败的编码是 Document Wrapped 编码。所有其他的编码都必须通过手工编辑来满足 WS-I 规范。

  大致说来,Lotus Domino V7.0.2 只有在使用 RPC Literal 编码并且没有使用数组和错误时才能生成满足依从性的 WSDL。Lotus Domino V8 生成满足依从性的 WSDL 的条件包括:若使用 RPC literal 编码则要求没有使用错误;若使用 Document Literal 编码则要求所有的方法都只有一个参数并且所有方法的参数都具有惟一的名称;使用 Document Wrapped 编码。

  结束语

  在本文中,我们介绍了如何为 Lotus Domino V8 设计 Web 服务。我们以 Discussion 数据库为例,描述了 Web 服务架构,如何分解它们的功能,如何在 Web 服务和客户机之间传输数据,而且我们还定义了可能出现的错误。我们简要地介绍了如何实现 Web 服务,如何实现与 Lotus Domino V7.0.2 兼容,可能遇到的一些问题及其解决方法。我们提出了如何配置 Lotus Domino 以便通过 HTTPS 实现安全连接,以及用户如何使用与 Notes 客户机相同的用户权限进行身份验证以便访问 Web 服务。然后我们描述了如何使用 Lotus Domino Designer 在 Domino 数据库中部署 Web 服务。

  我们执行了 WS-I 互操作性测试并重点介绍了使用 Discussion 数据库的 Web 服务应使用 Document Wrapped 编码来公开。这是当 Lotus Domino 生成 WSDL 时通过 Lotus Domino V8 依从性测试的惟一编码。我们利用 Lotus Domino V7 发布的 Web 服务不能通过互操作性测试,不管生成的 WSDL 的编码是什么。满足 WS-I 规范的 WSDL 文档可以通过手工编辑 WSDL,然后将其导入 Lotus Domino Designer 中来进行创建。

 

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

作者

Parlione
Parlione

相关推荐

  • SAP收购CallidusCloud 与Salesforce竞争

    一直被称为后台办公巨头的SAP现在似乎也想在前台办公大展拳脚。 最新的迹象是SAP收购CallidusClou […]

  • 事件驱动框架和SOA在空军的应用

    空军正在利用SOA来改善数据共享,并实时跟踪战机,美国空军机动司令部的Michael Marek解释了企业可从中学习的经验。

  • 揭秘New Relic APM技术细节

    New Relic应性能管理(APM)套件主要用于Web软件开发。它允许用户在面向服务的架构(SOA)上跟踪关键事务性能,并且支持代码级别的可见性来评估特定代码段和SQL语句对性能的影响

  • 仅凭SOA和云无法解决业务数据管理风险问题

    SOA和云可以是某些恼人问题高效的解决方案;这一点我们已经知道了。但是也要记住它们并不是所有事情的直接答案,特别是当你的问题是业务数据管理风险,而不是技术问题时。