gpt4 book ai didi

wsdl - WSDL 中的类型和元素有什么区别?

转载 作者:行者123 更新时间:2023-12-03 02:13:39 29 4
gpt4 key购买 nike

在 WSDL 文件中,函数可以返回类型或元素。到目前为止,我仅使用自定义类型作为结果。但是,我想知道什么时候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>

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

正如斯卡夫曼指出的那样,上述问题引出了另一个问题。有什么区别

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

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

最佳答案

事情远不止这些。

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

也有歧义。如果你说

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

然后您说过消息的内容必须针对类型“ns:type1”进行验证。但您没有提及包含该内容的元素。它将位于哪个命名空间中?

请参阅WS-I Basic Profile有关于此的一些规则。

<小时/>

评论中对“文档/文字”与“文档/文字/包装”进行了一些讨论。这是我的看法。

我刚刚创建了一个网络服务。整个事情是这样的:

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>

请注意“wrapped”一词是如何没有出现的。 IBM 在他们的文档中所说的“document/literal/wrapped”只是“document/literal”,它恰好使用单个消息部分,它恰好有一个从服务名称派生的名称,并且恰好引用到一个元素,并且它恰好包含操作的两个参数。

这里没有什么神奇的,这里没有什么不标准的。

在许多标准组织中,公司最终都会选边站。对于 SOAP,我们有“RPC 端”和“文档端”。 RPC 对于很多人来说更为熟悉——它通过函数调用进行一对一的映射。文档不太熟悉,并且要求您实际上用简单的 XML 来思考。也许 IBM 是在 RPC 方面,我不知道。

<小时/>

我现在已经完成了 IBM 文档,WSDL 风格。总结如下:

摘要

装订样式有四种(确实有五种,但是document/encoded没有意义)。虽然每种样式都有其自己的位置,但在大多数情况下,最好的样式是文档/文字包装。

<小时/>

我还想根据消息中是否存在操作名称,对文档中讨论调度难度级别的地方使用react。这不是问题。如果您阅读该文档,您会注意到它从未讨论 <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 header 中发送,可用于调度:

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>

关于wsdl - WSDL 中的类型和元素有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1172118/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com