我在何时使用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仅适用。

10-02 21:26