我在何时使用SOAPBinding.ParameterStyle.BARE和SOAPBinding.ParameterStyle.WRAPPED时感到困惑,而哪种绑定(bind)样式更受欢迎,它们之间的区别是什么。
最佳答案
ParameterStyle.Bare和ParameterStyle.Wrapped仅影响您对请求和响应消息的wsdl定义。
让我们举个例子,我们有一个带有“test”方法的web服务,它有两个输入“string1”和“string2”,并且返回一个字符串作为“rstring”。
ParameterStyle.BARE
参数名称将在wsdl中作为零件名称显示。
请求消息:
<message name="test">
<part name="string1" element="tns:string1"/>
<part name="string2" element="tns:string2"/>
</message>
回应讯息:
<message name="testResponse">
<part name="rstring" element="tns:rstring"/>
</message>
在xsd中,test和testResponse的定义如下,您的wsdl元素直接引用被测元素,并且来自xsd的测试响应。
<xs:complexType name="test">
<xs:sequence>
<xs:element name="string1" type="xs:string" minOccurs="0"/>
<xs:element name="string2" type="xs:string" minOccurs="0"/>
</xs:sequence>
<xs:complexType name="testResponse">
<xs:sequence>
<xs:element name="rstring" type="xs:string" minOccurs="0"/>
</xs:sequence>
ParameterStyle.WRAPPED
这样,您的请求和响应消息将以“参数”的形式包装在单个输入中,并以“结果”的形式包装在输出中。并且他们会针对xsd中的所有元素引用该特定元素。
请求消息:
<message name="test">
<part name="parameters" element="tns:test"/>
</message>
回应讯息:
<message name="testResponse">
<part name="result" element="tns:testResponse"/>
</message>
在您的xsd test和testResponse中,将定义与上述相同,
<xs:complexType name="test">
<xs:sequence>
<xs:element name="string1" type="xs:string" minOccurs="0"/>
<xs:element name="string2" type="xs:string" minOccurs="0"/>
</xs:sequence>
<xs:complexType name="testResponse">
<xs:sequence>
<xs:element name="rstring" type="xs:string" minOccurs="0"/>
</xs:sequence>
在上面的示例中,您可以发现差异。这是它们在wsdl中暗示的唯一区别。
注意:上面的示例说明了文档类型肥皂绑定(bind),在RPC中,不涉及xsd,因此RPC.Bare仅适用。