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

SOAP version 1.2 中文手冊5

6. 在HTTP中使用SOAP

本节描述了如何在使用或不使用HTTP Extension Framework的前提下将SOAP与HTTP的协同工作机制。将SOAP绑定在HTTP上可以利用HTTP丰富的特性集,提供使用SOAP形式方法和分布适应性的优点。将SOAP在HTTP上传输并不以为着SOAP可以完全超越HTTP的语义,更恰当的描述应当是SOAP的语义通过HTTP的映射而很自然地成为HTTP的语义。

SOAP很自然地利用HTTP的请求/响应消息模型,将SOAP请求的参数放在HTTP请求里,而将SOAP响应的参数放在HTTP响应里面。注意,无论如何,SOAP的中间介与HTTP中间介是不同的。也就是说,根据HTTP Connection头字段来寻址的HTTP中间介一般并不能来处理HTTP请求中的SOAP实体体。

当需要将SOAP消息体包含在HTTP消息中时,HTTP应用程序必须依照RFC2376[3]使用媒体类型“text/xml”。

6.1 SOAP HTTP请求

虽然SOAP可以和多种HTTP请求方法联合使用,但这里的绑定只定义了SOAP是如何在HTTP Post请求中传输的。(可参阅section 7了解如何在RPC中使用SOAP,以及section 6.3如何使用HTTP Extension Framework)

6.1.1 HTTP Header中的SOAPAction字段

SOAPAction HTTP请求头字段(header field)可以用于指示SOAP HTTP请求的目的。它的值是一个标识该目的的URI。SOAP对于格式上并没有严格的限制,同时对URI的描述以及是否要是可解析的都没有严格的限制。当发出SOAP HTTP请求时,HTTP客户必须使用该头字段。

soapaction  =  "SOAPAction" ":" [ <"> URI-reference <"> ]
URI-reference  =  <as defined in RFC 2396 [4]>

SOAPAction头字段的存在及其内容可以被服务器例如防火墙用于在HTTP中过滤SOAP请求消息。当该字段的值为空字符串( “”)时,则意味着SOAP消息的目的由HTTP Request-URI来提供。而如果没有值则表示对消息的目的没有指示。

例如:

Example 42
SOAPAction: "http://electrocommerce.org/abc#MyMessage"

SOAPAction: "myapp.sdl"

SOAPAction: ""

SOAPAction:
Examples of values for SOAPAction

6.2 SOAP HTTP响应

在HTTP之上的SOAP遵从用于在HTTP中表示通讯状态的HTTP状态代码的语义。例如,2xx状态代码表明这是客户端包含SOAP构件的请求被成功的接收、理解和接受等等。

当处理请求的时候发生SOAP错误的时候,SOAP HTTP服务器必须发出一个HTTP 500 “Internal Server Error”响应同时在包含于该响应的SOAP消息中应包含一个SOAP Fault元素(参阅 section 4.4)来指明SOAP处理的错误。

6.3 HTTP扩展框架

SOAP消息可以与HTTP Extension Framework[6]一起使用来标识SOAP HTTP请求的出现和意图。

是使用Extension Framework还是使用简单HTTP对于通讯各方而言是一个策略及能力的问题。客户端可以通过一个强制扩展声明以及一个“M-”HTTP方法名前缀来强制使用HTTP Extension Framwork。服务器端可以通过使用 510 “Not Extended” HTTP状态代码来强制使用HTTP Extension Framework。也就是说,通过一次额外的环游,每个通讯方都可以检测到其他通讯方和因此的动作。

用于使用Extension Framework标识SOAP的扩展标识是:

http://www.w3.org/2001/06/soap-envelope

6.4 SOAP HTTP示例

Example 43
POST /StockQuote HTTP/1.1

Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn

SOAPAction: "http://electrocommerce.org/abc#MyMessage"



<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" >

 . . .

</env:Envelope>
SOAP HTTP Request Using POST

 

Example 44
HTTP/1.1 200 OK

Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn



<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" >

 . . .

</env:Envelope>
SOAP HTTP Response to Example 43

 

Example 45
M-POST /StockQuote HTTP/1.1

Man: "http://www.w3.org/2001/06/soap-envelope"; ns=NNNN

Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn

NNNN-SOAPAction: "http://electrocommerce.org/abc#MyMessage"



<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" >

 . . .

</env:Envelope>
SOAP HTTP Request using the experimental HTTP Extension Framework

 

Example 46
HTTP/1.1 200 OK

Ext:

Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn



<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" >

 . . .

</env:Envelope>
SOAP HTTP Response to Example 45

7. 在RPC中使用SOAP

SOAP的一个设计目标就是要利用XML的可扩展性和可伸缩性来包装和交换RPC调用。本节定义了一个统一的远程过程调用和响应的表示。

其实我们也可以预想到在RPC环境下的表示很可能是与在其他表示中定义的编码风格结合。SOAP encodingStyle属性(参阅 section 4.3.2)可以被用于指明在本节表示中使用的方法调用/响应的编码风格。

在RPC中使用SOAP与SOAP协议绑定(参阅 section 6)基本是正交的。在使用HTTP作为SOAP协议绑定媒介的情况下,一个RPC调用可以很自然地映射到一个HTTP请求,而RPC响应则可以映射到HTTP响应。无论如何,使用SOAP方式的RPC并不限于HTTP协议绑定。

为实施一个方法调用,需要以下信息:

  • 目标SOAP结点的URI

  • 方法名

  • 可选的方法或过程的特征

  • 方法或过程的参数

  • 可选的头数据

 SOAP依赖协议绑定来提供传送URI的机制。例如,对HTTP而言,请求URI指明了与该调用相对应的资源。除要求该URI是合法的以外,SOAP对于该地址没有任何限制(参阅[4]以获得URI的更多信息)。

7.1 RPC和SOAP Body

RPC调用和响应都是在SOAP Body元素(参阅 section 4.3)中传送,使用如下表示方式:

  • 一个方法调用被建模成一个结构struct。

  • 该方法调用显示为一个简单结构struct,包含每个[in]或[in/out]参数的存取标识。该结构的名和类型可使用过程或方法的名来标识。

  • 每个[in]或[in/out]参数都被表示为一个存取标识,该存取标识的名和类型都对应于相应参数的名和类型。他们的次序也是按照原来RPC中的次序。

  • 一个方法响应被建模成一个结构struct。

  • 该方法响应显示为一个简单结构struct,包含每个[out]或[in/out]参数的存取标识。而第一个存取标识是返回值,而随后则是按照原来次序的返回参数。

  • 每个[out]或[in/out]参数都被表示为一个存取标识,该存取标识的名和类型都对应于相应参数的名和类型。返回值的存取标识名并没有多少语义。同样的,结构的名也并没有多少语义。当然,无论如何,在添加了“Response”字串的方法名后,要有一个约定来命名它。

  • 方法调用出错应使用SOAP Fault元素来编码(餐饮 section 4.4)。如果一个绑定协议对于错误表达还有额外规则,那么这些规则都应当被遵守。

就象先前表述的那样,方法和响应的结构可以使用在section 5中定义的规则来编码,也可以使用在encodingStyle属性中描述的其他编码(参阅 section 4.1.1)。

应用程序可以处理漏写参数的请求不过也可以返回一个错误。

因为在响应中若包含“result”则表明成功,若包含“fault”则表明失败,所以如果方法响应中同时包含了“result”和“fau

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