发布网友 发布时间:2022-05-01 19:45
共1个回答
热心网友 时间:2022-06-22 03:44
对于使用 ASP.NET 创建的 XML Web services 和它们的使用 SOAP 与 XML Web services 方法进行通讯的客户端来说,一个复杂的机制可以用来控制发送到服务器和从服务器接收的 SOAP 消息的格式。SOAP 规定发送到 XML Web services 和从 XML Web services 发送回的 SOAP 消息的内容必须为 XML 格式。但是,它并没有严格地规定 XML 的格式设置。为了提供一个使用接收不同的格式设置的 XML Web services 的机制,ASP.NET 提供了一个基于属性的机制来控制 SOAP 消息中 XML 的格式。另外,还提供了指定特定元素和通过网络发送的 SOAP 属性名的基于属性的机制,用来在更精细的细节级别上控制 SOAP。 使用 ASP.NET 创建的 XML Web services 和它们的客户端之间的通讯在很大程度上是由两个行业标准规范的:SOAP 和 Web 服务描述语言 (WSDL)。SOAP 为出现在 Body 元素下的数据定义格式设置方案,并为如何在 Body 元素中对参数进行格式设置定义格式设置方案。WSDL 用于描述 XML Web services 所需的 SOAP 消息,WSDL 允许 XML Web services 声明它们接受带有编码参数的 RPC 消息,但它还定义了两个其他术语:Literal 和 Document。Literal(与 Encoded 类似)是指参数的格式设置方式。Document(与 RPC 类似)是指全部 Body 元素的格式设置方式。 下表概述了使用 ASP.NET 创建的 XML Web services 支持的格式设置样式以及完成每个特定组合的属性。带有 Service 后缀的属性可以应用于实现 XML Web services 的类以设置该类中 XML Web services 方法的默认格式设置样式。带有 Method 后缀的属性只能应用于 XML Web services 方法或调用 XML Web services 方法的代理类中的方法。每个组合的详细信息在下表中都有所介绍。 SOAP Document SOAP RPC SOAP SOAP 7 Literal — XSD SoapDocume ntMethod SoapDocume ntService Use=Litera Encoded - SOAP 5 SoapDocume ntMethod SoapDocume ntService Use=Encode d SoapRpcMethod SoapRpcService 设计 XML Web services 时首先要作出的决定之一就是您要如何对 SOAP 请求中的 XML 进行编码。明确地说,您是要 XML 文档严格遵循 XSD 架构还是要遵循 SOAP 规范第 5 节和第 7 节中概述的格式设置规则?SOAP 规范第 5 节和第 7 节中的格式设置规则考虑到了变体。这样,使用 SOAP 编码规则的 SOAP 请求的接收方必须处理所有可能的变体。通过定义 XML Web services 方法的 XSD 架构,可以具体地定义 SOAP 请求中需要发送的确切内容。使用 ASP.NET 创建的 XML Web services 默认为使用基于架构传递的文档。 因为 XML Web services 方法的参数可以组成 SOAP 请求或响应中传递的大部分数据,所以参数映射到 XML 元素的方式决定了 XML 文档的外观。Web 服务描述语言 (WSDL) 定义了两种参数格式设置样式:Encoded 和 Literal。Encoded 是指使用 SOAP 规范第 5 节中概述的 SOAP 编码对参数进行格式设置。Literal 是指使用 l 这是默认值。 每个参数预定义的 XSD 架构将参数映射到 XML 元素。使用 XML Web services 客户端,您可以选择如何将参数映射到 XML 元素以匹配 XML Web services 需要的形式。使用 ASP.NET 创建的 XML Web services 支持 Literal 和 Encoded 两种参数格式设置样式。该支持根据 XML Web services 方法格式设置选择有所变化。 请注意,虽然 ASP.NET 提供了一个广泛的结构用来控制 XML 格式设置的方式,但是并不保证参数序列化的顺序。 我们可以写一个WebService 例子来说明这一点: testSoapParam.asmx: using System; using System.Web.Services; using System.Web.Services.Protocols; using System.Web.Services.Description; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; using System.Data; public class testEncoded : WebService { [ SoapDocumentMethod(Use=SoapBindingUse.Encoded ,ParameterStyle=SoapParameterStyle.Bare) ] //参数风格为:Encoded 并且是Bare [WebMethod()] public struct1 testStructBareEncode(struct1 a){ return a; } [ SoapDocumentMethod(Use=SoapBindingUse.Encoded ) ]// 参数风格为:Encoded [WebMethod()] public struct1 testStructEncoded(struct1 a){ return a; } [ SoapDocumentMethod(Use=SoapBindingUse.Literal ) ]//参数风格为:Literal [WebMethod()] public struct1 testStructLiteral(struct1 a){ return a; } [ SoapDocumentMethod(ParameterStyle=SoapParamet erStyle.Bare) ]// 参数风格为:Bare [WebMethod()] public struct1 testStructBare(struct1 ddd){ return ddd; } } public class struct1{ public int i=1; public string j="ok"; public struct2 s2; private struct2 temp; public struct2 s4{ get{ return temp; } set{ temp=value; } } } public class struct2{ public String sField; } 当我们运行客户端代理请求SOAP 协议时,我们可以发现不同的参数风格有很大的区别,如使用Literal(默认)和Default 时,SOAP 协议客户端传输给服务端的XML 内容为: //参数名字 intstringstringstring 而使用Encoded 时, SOAP 协议客户端传输给服务端的XML 内容为: //a 为参数名,id 号指出该对象是复杂类型,并为链路 intstringstringstring 我们可以发现Encoded 时,SOAP 协议把对象和数组作为复杂类型同其他区分开来,并明确的指明每一个类型的名字。 如果是设置为Bare, SOAP 协议客户端传输给服务端的 XML 内容为: //dd 为参数名 intstringstringstring 我们将它与上面(如果不设置Bare,默认为wrapped)进行比较可以发现它少了一层。 而如果我们将Encoded 和Bare 一起来控制参数时,传输內容变成: //第一个参数 intstringstringstring 我们可以发现不仅少一层,而且id 号也变了。 我们不仅可以改变SOAP 协议参数传输的框架,也可以改变具体每一个元素的值,如:[XmlElement()]可以指定元素的名字和名字空间(namespace),如果指定了([ return: XmlElement("ReturnValueElement",IsNullable=fals e)] 和 [XmlElement("MyAddressElement")),则传输的內容变成: //指定的元素名字。 intstringstringstring 总之,我们可以根据XML 的序列化来控制SOAP 消息生成XML 內容的形式。