当前位置:编程学习 > C#/ASP.NET >>

SOAP Version 1.2中文手冊3

 

2. SOAP消息交换模型

从根本上来看,SOAP消息是从发送方到接受方的一种传输方法,但就象前面例子中阐述的那样,SOAP消息一般会和实现模式结合,例如请求/响应。

SOAP的实现可以为特殊网络系统的特有特征来优化。例如,在section 6中描述的HTTP binding将SOAP响应消息通过HTTP响应来传输,使用与相对应请求的同一HTTP连接。

2.1 SOAP结点

SOAP结点可以是初始SOAP发送者,可以是最终SOAP接收者,也可以是同时作为SOAP发送者和接收者的SOAP中介。SOAP并不提供一个路由机制,曾因此SOAP需要识别SOAP发送者产生的SOAP消息应当通过哪些零个或多个SOAP中介被发送到一个最终SOAP接收者。

接收到SOAP消息的SOAP结点必须能够实施处理、产生必要的SOAP错误和SOAP响应,如果合适的话还应当根据本规范的后续描述生成额外的SOAP消息。

2.2 SOAP角色与SOAP结点

当处理一个SOAP消息的时候,SOAP结点将被告知应当以一个或多个SOAP处理角色来处理,这些SOAP角色由SOAP actor名来标识,SOAP actor的名字是一个URI。每个SOAP结点都必须以一个指定的角色来处理,这个角色使用命名为"http://www.w3.org/2001/06/soap-envelope/actor/next"的SOAP actor来表示,同时可以按照需要应用零个或多个其他SOAP actor表示的额外角色。SOAP结点可以通过以匿名SOAP actor的角色来实施处理以使得自己成为最终SOAP接收者。当SOAP结点在处理一个SOAP消息的时候,其表现出的SOAP角色在整个处理过程中不得更改。这是因为本规范只涉及如何处理单个SOAP消息而无需考虑状态,因此是否允许在处理单个SOAP消息的时候转换角色是没有意义的。

SOAP actor名字是用来识别SOAP结点的,并没有与路由或者消息交换的语义相联系。举例来说,一个SOAP actor可以被命名为一个用来发送SOAP消息给适当SOAP结点的URI。相反,也有这样一些SOAP处理角色的名字,这些名字或者直接和消息路由相联系(例如,http://example.org/banking/anyAccountMgr),或者和路由没有联系(例如,当一个消息头被用来携带一个指示,该指示用来告知任何有关的软件该SOAP消息是长期不变的,是能够被安全的缓存和重用的,在这种SOAP消息头中,一个URI可以用于标识“所有缓存管理软件”),通过名字使用这些SOAP处理角色也是合适的。

2.3 定位SOAP Header条目

SOAP header条目包含可选的env:actor属性(参阅section 4.2.2)用来把他们定位到合适的SOAP结点。没有该属性的SOAP Header隐含地定位到一个匿名的SOAP actor,这意味着他们被处理为最终的SOAP接收者。我们把SOAP actor属性的值(隐含的或者直接指明的)作为相应SOAP条目(SOAP Header条目或者SOAP Body条目)的SOAP actor。

如果SOAP条目中SOAP actor(如果出现的话)匹配了一个SOAP结点的角色,或者是SOAP条目没有actor属性(包括SOAP Body条目)而该SOAP结点已经假设为匿名SOAP处理角色,这时我们就说SOAP条目被指向一个SOAP结点。

2.4 理解SOAP Header

我们认为随着时间的过去,会有大量的SOAP Header函数规范出现,而且每个SOAP结点都可以包含一个或多个处理这些扩展所必须的软件。如果SOAP结点的软件是完全兼容的而且实现了那些由条目中完整修饰的最外层元素名所传递的语义,我们说这个SOAP Header被一个SOAP结点理解。

当定位到一个SOAP结点的SOAP Header块的mustUnderstand属性为“1”,被指向的SOAP结点必须:或者依照由条目中完整修饰的最外层元素名传递的语义来处理SOAP块,或者更本不处理SOAP消息而失败(参见section 4.4).。

2.5 处理消息

本节陈述了SOAP消息处理规则。除非另外规定,处理必须在语义上等同于分别执行下述的步骤,同时还必须按照给定的顺序。注意到,无论如何在这个规范中都没有阻止使用如并行、回滚或者其他可以在处理中提高灵活性的技术,只要所有的SOAP消息、SOAP fault和应用程序级的结果和那些直接执行下列规则得到的结果是相同的。

  1. 如果一个或多个定位到SOAP结点的SOAP条目有env:mustUnderstand="1"并且没有被结点理解,则产生一个SOAP mustUnderstand错误。如果这样一个错误产生了,那么必须停止进一步的处理。

  2. 处理定位到SOAP结点的SOAP条目,如果需要,产生SOAP错误。当定义env:mustUnderstand="1"时,一个SOAP结点必须处理SOAP块。如果没有定义,那么SOAP结点可以处理或忽略该SOAP条目。如果一个SOAP条目被处理,无论如何,这个SOAP结点必须理解该SOAP条目而且必须以和那个SOAP条目说明完全一致的样式进行处理。而对于错误,无论是那种,也必须和SOAP条目的说明一致。有可能处理特殊SOAP条目会控制或者决定其他SOAP条目的处理顺序。例如,一个SOAP条目可能建立一个SOAP Header条目用来强制按词汇的顺序执行其他的SOAP Header条目。如果没有这样一个SOAP条目,处理的顺序是由SOAP结点来判断的。当处理一个SOAP条目的时候,SOAP结点可以引用SOAP envelope中的任何信息。例如如果需要,一个缓存函数可以缓存整个SOAP消息。

如果SOAP结点是一个SOAP中介,SOAP消息的式样和处理的结果(如果没有产生错误)可以要求进一步沿着SOAP消息路径送递SOAP消息。这种接力转递必须以同样顺序包括从SOAP消息源来的所有的SOAP Header条目和SOAP Body条目,除了那些指向SOAP中介的SOAP Header条目,这些条目必须被移去(无论他们是否被处理,这些SOAP条目都将被移去)。附加的SOAP Header条目可以易做图入在SOAP消息的任何一点,这样易做图入的SOAP Herder条目可能没法和刚刚被移走的一个或多个条目区分开来(实际上是会将他们保留,但强调需要沿着SOAP消息路径重新解释每个SOAP结点)

3. 与XML的关系

所有的SOAP消息都是使用XML格式来编码的(可参阅[7]以获得更多的XML的信息)。

SOAP应用程序在生成由SOAP定义的所有元素和属性的时候,应该包含恰当的SOAP命名空间。SOAP应用程序必须能处理其收到的消息中的SOAP命名空间。它必须丢弃那些包含不正确命名空间(参阅 section 4.4)的消息,并且可以处理那些不包含SOAP命名空间的SOAP消息,就好象他们包含了正确的命名空间一样。

SOAP定义了以下的命名空间 (可参阅[8]以获得更多的XML命名空间的信息):

  • SOAP信封的命名空间标识为 "http://www.w3.org/2001/06/soap-envelope"

  • SOAP遍序的命名空间标识为 "http://www.w3.org/2001/06/soap-encoding"

  • SOAP mustUnderstand fault的命名空间标识为 "http://www.w3.org/2001/06/soap-faults"

  • SOAP upgrade的命名空间标识为 "http://www.w3.org/2001/06/soap-upgrade"

而这些命名空间的模式文档可以通过解析这些命名空间标识符来获得。

SOAP消息必须不包含DTD,同时SOAP消息也必须不包含PI(Processing Instructions)。 [7]

SOAP使用局部的非限制的ID类型的id属性来指定编码元素(encoded element)的唯一标识,使用局部的非限制的uri-reference类型的href属性来指定编码元素的值的应用,以获得与XML规范[7]、XML Schema规范[11]和XML Linking Language规范[9]的一致。

除SOAP mustUnderstand属性(参阅 section 4.2.3)和SOAP actor属性(参阅 section 4.2.2)外,一般允许属性及属性值自由地选择是在XML实例中描述还是在XML Schema中描述,当然前提是他们具有相同的效果。也就是说,在DTD或模式(schema)中使用默认值或固定值定义在语义上等价于在实例中的定义。

4. SOAP信封

SOAP消息是由一个强制的SOAP Envelope、一个可选的SOAP Header和一个强制的SOAP Body组成的XML文档。作为SOAP消息的该XML文档将在本规范的其余部分被引用。而本节的元素和属性的命名空间标识是"http://www.w3.org/2001/06/soap-envelope"。SOAP消息应当包含如下部分:

  • 一个SOAP envelope。Envelope是表示该消息的XML文档的顶级元素。

  • 一个SOAP Header。Header则是为了支持在松散环境下在通讯方(可能是SOAP发送者、SOAP接受者或者是一个或多个SOAP的传输中介)之间尚未预先达成一致的情况下为SOAP消息增加特性的通用机制。SOAP定义了很少的一些属性来用于指明谁可以处理该特性以及它是可选的还是强制的。(参阅 section 4.2)

  • 一个SOAP Body。Body为该消息的最终接收者所想要得到的那些强制信息提供了一个容器(参阅 section 4.3)。此外,SOAP定义了Body的一个子元素Fault用于报告错误。

语法规则如下:

  1. SOAP

补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,