以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 Web Services & Semantic Web Services 』  (http://bbs.xml.org.cn/list.asp?boardid=10)
----  如何区分SOAP Messaging和SOAP RPC  (http://bbs.xml.org.cn/dispbbs.asp?boardid=10&rootid=&id=12169)


--  作者:lyman
--  发布时间:11/19/2004 2:35:00 PM

--  如何区分SOAP Messaging和SOAP RPC

我是SOAP的初学者,我一直存在这么一个问题:SOAP好像有两种使用方式,即SOAP RPC和 SOAP Messaging,我如何区分它们?SOAP规范中是否对此有显著规定?

例如,现在服务端程序收到客户端的一个SOAP XML文档,我怎么知道它是否发起RPC调用,还是一个一般性的需要应用层解析的消息?如果是RPC调用,我应该能够知道客户端调用哪个或哪些方法,以及每个方法的所有参数把?我以为可以写一段通用的代码来获取方法列表以及每个方法的参数。


--  作者:zhouyg
--  发布时间:11/21/2004 4:45:00 AM

--  
SOAP Messaging 和 SOAP RPC  都是RPC (Remote proceduce call 远程程序呼唤),即用户端呼唤
服务器上的一个程序,程序在服务器上执行,执行完后有两种可能性
1) 服务器要把执行的结果返回给用户 (这种情况用 SOAP RPC)
2) 服务器不需要返回如何结果给用户 (这种情况用 SOAP Messaging)

其实可以认为SOAP Messaging 是 SOAP RPC 的一种特殊情况, SOAP Messaging 可以实现的都可以用SOAP RPC 来实现,不过SOAP RPC 用起来要复杂一些。
使用SOAP RPC 时,SOAP 包的格式是有规定的,在SOAP 包中要写清楚,呼唤哪个CLASS 的哪个
Method ,如果需要参量,参量也要按顺序写清楚。这样服务器才知道要去执行哪个程序,然后将结果也用一个SOAP包返回。
下面看个例子
用户呼唤:
<methoCall>
<methodName>SayHello</methodName>
<params>
<param>
<value>world</value>
</param>
</params>
</methodCall>

服务器回答:
<methodResponse>
<params>
<param>
<value>Hello world !!!</value>
</param>
</params>
</methodResponse>


--  作者:lyman
--  发布时间:11/22/2004 6:44:00 PM

--  

这种远程调用的意思我是知道的。我的困惑是文档中有什么规定的标签标明这是一个方法调用,这些是这个方法的参数。举一个具体例子:如下。
            
<soap:Envelope
 xmlsns:soap="http://schema.xmlsoap.org/soap/envelope/"
 soap:encodingStyle="http://schema.xmlsoap.org/soap/encoding/"
 xmlns:cwmp="urn:dslforum-org:cwmp-1-0">
 <soap:Header>
  <cwmp:ID soap:mustUnderstand="1">1234</cwmp:ID>
 </soap:Header>
 <soap:Body>
  <cwmp:GetParameterValuesResponse>
   <ParameterList soap:arrayType="cwmp:ParameterValueStruct[4]">
    <ParameterValueStruct>
     <name>ADSLCPE.DeviceInfo.Manufacture</name>
     <value xsi:type="xsd:string">Alpha Telecom Inc.</value>
          </ParameterValueStruct>
    <ParameterValueStruct>
     <name> ADSLCPE.DeviceInfo.ManufactureOUI</name>
     <value xsi:type="xsd:string">0006D3</value>
          </ParameterValueStruct>
    <ParameterValueStruct>
     <name> ADSLCPE.DeviceInfo.ModelName</name>
     <value xsi:type="xsd:string">Arion3100</value>
          </ParameterValueStruct>
    <ParameterValueStruct>
     <name> ADSLCPE.DeviceInfo.Description</name>
     <value xsi:type="xsd:string">ADSL Modem</value>
          </ParameterValueStruct>
   </ParameterList>
    </cwmp:GetParameterValuesResponse>
 </soap:Body>
</soap:Envelope>

请问: GetParameterValuesResponse是一个方法名吗?看起来是的。但是我的XML解析程序怎么知道这就是一个方法名?难道GetParameterValuesResponse是一个SOAP规范预定义好的标签吗?(显然不是!)同样的道理,ParameterList,ParameterValueStruct是参数,我们人为也许能够看出这些是参数,但是解析程序怎么知道这是参数?它根据什么来判断?这正是我不能理解的!


--  作者:usabcd
--  发布时间:11/23/2004 11:49:00 AM

--  
RPC是指远程方法调用,
Messaging一般认为是直接传递消息,这个消息一般指现成的xml文档。
2种方式有各自的应用场景。
RPC使用比较自然直观,在实际开发时,先完成服务端,服务端完成后会提供一个
叫做WSDL的文档给客户端开发人员。客户端开发人员根据WSDL文档确定
这个Web Service的各种特性,包括调用方式,方法名,参数等。
客户端开发人员常常借助SDK工具将WSDL描述转化为本地开发语言的代码原型。
在原型代码中可以清楚看到所使用的方法和参数。
值得注意的是,RPC方式中间的xml解析过程对两端的开发人员都是透明的,
他们并不需要了解具体的细节,这些都是由Web Service容器实现的。
他们只是象平常一样做普通的函数调用而已。

--  作者:lyman
--  发布时间:11/26/2004 3:31:00 PM

--  
非常感谢,这么说来我有些明白了。不过我还觉得似乎还有问题。在我现在参与的一个项目中,我们要写SOAP服务端,要打交道的客户端是一台ADSL设备(遵从的规范是TR-069),似乎没有WSDK, Web Services容器这些概念,只有SOAP的应用。等有时间再来阐述。
--  作者:anjie8484
--  发布时间:11/7/2005 3:45:00 PM

--  
RPC一般是同步的
消息一般是传输在工作流中吧?
--  作者:xpez
--  发布时间:11/24/2005 10:48:00 AM

--  
楼主应该是开发ACS的吧,那你应该看下TR069这个技术文档。你举的这个例子, 在TR069里有很详细的描述啊。在TR069的A.3.3.2这个section规定了GetParameterValues是CPE(也就是客户端的ADSL设备等)必须支持的rpc methods,这个方法只能被ACS发起调用,同时也规定了GetParameterValuesResponse就是CPE的回应。你收到的这个SOAP ENV实际就是CPE对ACS的GetParameterValues调用的回应。那你收到这个回应后就可以知道CPE当前的一些参数设置,至于ParameterList,ParametervalueStruct的语义和处理方法在TR069的文档里都有规定的。



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
3,046.875ms