WSDL中的Type和Element有什么区别?

在WSDL文件中,函数可以返回一个Type或者一个Element。 到目前为止,我只使用自定义types。 但是,我想知道什么时候Element比Type更合适? 他们有什么区别?

有什么区别吗?

<wsdl:message name="MyFunction"> <wsdl:part name="parameters" element="tns:Person"></wsdl:part> </wsdl:message> 

 <wsdl:message name="MyFunction"> <wsdl:part name="parameters" type="tns:Person"></wsdl:part> </wsdl:message> 

从客户的angular度(使用Web服务的应用程序)?

正如skaffman指出的那样,上述问题导致另一个问题。 有什么区别

 <xs:element name="Person" ... > ... </xs:element> 

 <xs:complexType name="Person"> ... </xs:complexType> 

除此之外还有更多。

标准中存在一些可能导致互操作性问题的含糊不清的问题。 您必须使用types或元素,具体取决于您使用的是基于文档的服务还是基于RPC的服务。

也有含糊之处。 如果你说

 <wsdl:message name="message1" type="ns:type1"/> 

然后你说过消息的内容必须根据types“ns:type1”进行validation。 但是你没有提到包含内容的元素。 它将在什么名称空间?

有关这方面的一些规则,请参阅WS-I基本概要文件 。


关于“文档/文字”与“文档/文字/包装”的评论有一些讨论。 这是我的要求

我刚刚创build了一个Web服务。 这是整个事情:

 using System.Web.Services; namespace WebService1 { [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class SimpleMathService : WebService { [WebMethod] public int Add(int a, int b) { return a + b; } [WebMethod] public int Multiply(int a, int b) { return a*b; } } } 

我不会发布整个 WSDL,但这里是“好的部分”:

 <?xml version="1.0" encoding="utf-8"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://tempuri.org/" xmlns:tns="http://tempuri.org/" > <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/"> <s:element name="Add"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="a" type="s:int"/> <s:element minOccurs="1" maxOccurs="1" name="b" type="s:int"/> </s:sequence> </s:complexType> </s:element> <s:element name="AddResponse"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="AddResult" type="s:int"/> </s:sequence> </s:complexType> </s:element> <s:element name="int" type="s:int"/> </s:schema> </wsdl:types> <wsdl:message name="AddSoapIn"> <wsdl:part name="parameters" element="tns:Add"/> </wsdl:message> <wsdl:message name="AddSoapOut"> <wsdl:part name="parameters" element="tns:AddResponse"/> </wsdl:message> <wsdl:portType name="SimpleMathServiceSoap"> <wsdl:operation name="Add"> <wsdl:input message="tns:AddSoapIn"/> <wsdl:output message="tns:AddSoapOut"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="SimpleMathServiceSoap" type="tns:SimpleMathServiceSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="Add"> <soap:operation soapAction="http://tempuri.org/Add" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="SimpleMathService"> <wsdl:port name="SimpleMathServiceSoap" binding="tns:SimpleMathServiceSoap"> <soap:address location="http://localhost:5305/SimpleMathService.asmx"/> </wsdl:port> </wsdl:service> </wsdl:definitions> 

请注意“包裹”这个词怎么没有出现。 在他们的文档中,IBM调用“document / literal / wrapped”的是简单的“document / literal”,恰好使用单个消息部分,恰好有一个名字来源于服务的名称,到一个元素,而恰好包含这两个参数的操作。

这里没有什么不可思议的,这里没有什么不合标准的。

在许多标准组织公司中,双方都表示支持。 在SOAP的情况下,我们有了“RPC端”和“文档端”。 RPC对许多人来说比较熟悉 – 它通过一个函数调用来映射一对一。 文档不太熟悉,并且要求您实际上用简单的XML来思考。 也许IBM在RPC方面,我不知道。


我现在已经完成了IBM文档,哪种风格的WSDL。 总结是:

概要

有四种绑定风格(真的有五种,但文档/编码是没有意义的)。 虽然每种风格都有其位置,但在大多数情况下,最好的风格是文档/文字包装。


我也想根据消息中是否存在操作名称,对文档中讨论调度难度的地方作出反应。 这是一个非问题。 如果你阅读文档,你会注意到它从来没有讨论过任何东西在<binding>部分。 解决“无操作名称”的问题就在那里。

 <wsdl:binding name="SimpleMathServiceSoap" type="tns:SimpleMathServiceSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="Add"> <soap:operation soapAction="http://tempuri.org/Add" style="document"/> 

soapAction在请求的HTTP头中发送,可用于调度:

 POST /SimpleMathService.asmx HTTP/1.1 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/Add" <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <Add xmlns="http://tempuri.org/"> <a>int</a> <b>int</b> </Add> </soap:Body> </soap:Envelope> 

你使用哪一个取决于它所指的模式。 如果tns:Person在模式中定义为:

 <xs:element name="Person" ... > ... </xs:element> 

然后你使用

 <wsdl:part name="parameters" element="tns:Person"> 

另一方面,如果模式被定义为

 <xs:complexType name="Person"> ... </xs:complexType> 

那么你使用

 <wsdl:part name="parameters" type="tns:Person"> 

所以这个问题实际上是Schema元素和Schematypes之间的区别。

我不能评论问题的WSDL部分,但我会回答XML Schema部分。

<xs:complexType>定义了一个描述元素内容的types,而不用描述元素本身(即它的名字)。 <xs:element>描述一个元素 (特别是它的名字),但不是它的types。 但是, <xs:element>总是引用它描述的元素内容的types。 这可以是对模式中其他位置的现有types(包括但不限于<xs:complexType> – 也可以是<xs:simpleType> )定义的引用,也可以是内联<xs:complexType>定义:

 <xs:element name="foo"> <xs:complexType> ... </xs:complexType> </xs:element> 

由于上述构造如此普遍,所以实际上可以完全省略<xs:complexType> ,并且这将被隐含。

至于是否应该总是分别定义types,然后在元素声明中引用它们,或者是否应该更喜欢在元素声明中内联定义元素types,这是一个风格问题。

 <xs:element name="person" type="persontype"/> <xs:complexType name="persontype"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType> 

type属性的<complexType>引用name属性的<complexType>


 <wsdl:message name="MyFunction"> <wsdl:part name="parameters" element="tns:person"></wsdl:part> </wsdl:message> 

 <wsdl:message name="MyFunction"> <wsdl:part name="parameters" type="tns:person"></wsdl:part> </wsdl:message> 
  • <part>参数与<types>容器元素中定义的具体types相关联。 而<part>可以通过type属性引用<complexType>或者通过元素属性引用<element> ,如上所示。
  • 它可以是<complexType><portType>或任何type属性引用的。