文章 姚 鑫 · 七月 27, 2021 5m read

类关键字PropertyClass,ServerOnly,Sharded,SoapBindingStyle

元素通常包含一个子元素。元素的每个子元素对应于一个消息部分。
  • rpc —默认情况下,此类中的web method使用rpc(远程过程调用)样式的绑定。

使用这种绑定风格,SOAP消息被格式化为具有多个部分的消息。

SOAP消息中,元素包含一个子元素,其名称取自相应的操作名称。这个元素是一个生成的包装元素,它为方法的参数列表中的每个参数包含一个子元素。

如果SoapBindingStyle是文档,如果ARGUMENTSTYLE是消息,那么消息样式与RPC非常相似;

重要提示:对于手动创建的web service,该关键字的默认值通常是合适的。当使用SOAP向导从WSDL生成web客户端或服务时,InterSystems IRIS会将此关键字设置为适合该WSDL;如果修改该值,web客户端或服务可能不再工作。

详解

此关键字允许指定此类中定义的任何web method使用的默认绑定样式。它影响SOAP主体的格式(但不影响任何SOAP头)。

通过使用SoapBindingStyle方法关键字或SoapBindingStyle查询关键字,可以重写单个方法的绑定样式。

对子类的影响

此关键字不是继承的。

默认

默认值为文档。

与WSDL的关系

SoapBindingStyle类关键字指定了WSDL的部分中元素的样式属性的值。例如,如果SoapBindingStyle是文档,则WSDL可能如下所示:

...
<binding ...>
    <soap:binding ... style="document"/>
    <operation ...>
        <soap:operation ... style="document"/>
...

如这里所示,在WSDL的部分中,SoapBindingStyle类关键字还指定了元素的样式属性的默认值;该属性由SoapBindingStyle方法关键字进一步控制。

相比之下,如果SoapBindingStylerpc,则WSDL可以改为如下所示:

...
<binding ...>
    <soap:binding ... style="rpc"/>
    <operation ...>
        <soap:operation ... style="rpc"/>
...

绑定样式也会影响元素,如下所示:

  • 如果绑定样式是文档,默认情况下,消息只有一个部分。例如:
<message name="AddSoapIn">
    <part name="parameters" .../>
</message>

如果ARGUMENTSTYLE参数是message,那么一条消息可以有多个部分。例如:

<message name="AddSoapIn">
   <part name="a" .../>
   <part name="b" .../>
</message>
  • 如果绑定样式是rpc,消息可以有多个部分。例如:
<message name="AddSoapIn">
    <part name="a" .../>
    <part name="b" .../>
</message>

对SOAP消息的影响

SOAP消息的主要影响是控制SOAP主体是否可以包含多个子元素。

对于使用RPC样式绑定和编码样式消息的web method,下面显示了请求消息正文的示例:

<SOAP-ENV:Body SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>
   <types:Add>
      <a href="#id1" /><b href="#id2" />
   </types:Add>
   <types:ComplexNumber id="id1" xsi:type="types:ComplexNumber">
      <Real xsi:type="s:double">10</Real>
      <Imaginary xsi:type="s:double">5</Imaginary>
   </types:ComplexNumber>
   <types:ComplexNumber id="id2" xsi:type="types:ComplexNumber">
      <Real xsi:type="s:double">17</Real>
      <Imaginary xsi:type="s:double">2</Imaginary>
   </types:ComplexNumber>
</SOAP-ENV:Body>

相比之下,下面显示了使用文字绑定和编码样式消息的web method的请求消息正文的示例:

<SOAP-ENV:Body>
   <tns:Add>
      <tns:a xsi:type="tns:ComplexNumber">
         <Real xsi:type="s:double">10</Real>
         <Imaginary xsi:type="s:double">5</Imaginary>
      </tns:a>
      <tns:b xsi:type="tns:ComplexNumber">
         <Real xsi:type="s:double">17</Real>
         <Imaginary xsi:type="s:double">2</Imaginary>
      </tns:b>
      </tns:Add>
</SOAP-ENV:Body>

在这种情况下,SOAP主体只有一个子元素。

%XML.DataSet 一起使用

对于 %XML.DataSet, 类型的对象,并非所有 SoapBindingStyleSoapBodyUse 关键字的排列都是允许的,,如下表总结:

type supported? supported?
SoapBodyUse=literal(默认) SoapBodyUse=encoded
SoapBindingStyle=document(default) supported not supported
SoapBindingStyle=rpc supported supported