在WSDL文件中,函数可以返回Type或Element.到目前为止,我只使用自定义类型作为结果.但是,我想知道什么时候Element应该比Type更合适?他们之间有什么区别?
两者之间有什么区别吗?
<wsdl:message name="MyFunction">
<wsdl:part name="parameters" element="tns:Person"></wsdl:part>
</wsdl:message>
Run Code Online (Sandbox Code Playgroud)
和
<wsdl:message name="MyFunction">
<wsdl:part name="parameters" type="tns:Person"></wsdl:part>
</wsdl:message>
Run Code Online (Sandbox Code Playgroud)
从客户角度(使用Web服务的应用程序)?
正如斯卡弗曼指出的那样,上述问题引出了另一个问题.有什么区别
<xs:element name="Person" ... >
...
</xs:element>
Run Code Online (Sandbox Code Playgroud)
和
<xs:complexType name="Person">
...
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
?
Joh*_*ers 16
除此之外还有更多.
标准中存在一些可能导致互操作性问题的模糊性.您必须使用类型或元素,具体取决于您使用的是基于文档的服务还是基于RPC的服务.
也有歧义.如果你说
<wsdl:message name="message1" type="ns:type1"/>
Run Code Online (Sandbox Code Playgroud)
然后你说过消息的内容必须根据类型"ns:type1"进行验证.但是你对包含内容的元素一无所知.它的名称空间是什么?
有关此问题的一些规则,请参阅WS-I Basic Profile.
关于"document/literal"与"document/literal/wrapped"的评论中有一些讨论.这是我的看法.
我刚刚创建了一个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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不会发布整个 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>
Run Code Online (Sandbox Code Playgroud)
请注意"包裹"一词是如何显示的.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"/>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
ska*_*man 10
您使用哪一个取决于它所引用的架构.如果tns:Person在模式中定义为:
<xs:element name="Person" ... >
...
</xs:element>
Run Code Online (Sandbox Code Playgroud)
然后你用
<wsdl:part name="parameters" element="tns:Person">
Run Code Online (Sandbox Code Playgroud)
另一方面,如果将模式定义为
<xs:complexType name="Person">
...
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
然后你用
<wsdl:part name="parameters" type="tns:Person">
Run Code Online (Sandbox Code Playgroud)
所以问题实际上是Schema元素和Schema类型之间的区别.
| 归档时间: |
|
| 查看次数: |
38103 次 |
| 最近记录: |