微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

soap协议简介--收藏

SOAP消息机制简介

SOAP(Simple Object Access Protocol,简单对象访问协议)作为一种信息交互协议在分布式应用中非常广泛,如WebService。在使用.Net开发WebService时候,只需要在对应的方法加上WebMethod特性然后就可以通过网络进行SOAP消息的发送。这样在平时使用Webservice时,可能不太关心SOAP消息的结构到底是怎样的。下面大致说说SOAP消息的结构,以及使用工具监听SOAP消息报文。
本节目录:

·      1XSD是什么

·      2、基于SOAP的数据交互系统是XSD

·      3SOAPSOAP消息结构

·      4支持SOAP的协议

·      5、通过SOAPHeader扩展SOAP

·      6SOAP自定义异常

·      7、监听SOAP消息

 

1XSD是什么                                                                         
XSD(XMLScheme DeFinitionXML大纲定义)文档用来描述XML的结构和内容。它本身也是一个XML文档,通过它我们可以知道xml文档中包含哪些节点,以及这些节点应该是什么类型的值等。常见的如WSDL文档。

 

2、基于SOAP的数据交互系统应该是XSD                                        
WebService数据交互格式是基于SOAP的,而实际上SOAP就是具有SOAP格式的XML数据。基于XML的跨平台特性,各个系统在调用WebService时,都需要能准确的理解WebService需要什么类型的参数,有哪些参数,返回值是什么等等。要很好的说明这些问题,XSD是一种很好的选择。所以说这类系统是XSD的。。

 

3消息结构                                                                    
  首先看看如下SOAP请求消息:

  它包含由SOAP信封(<soap:Envelope>) SOAP (<soap:Header>) SOAP消息体(<soap:Body>)组成。其中<soap:Envelope>SOAP消息中的根节点,是SOAP消息中必须的部分;<soap:Header>SOAP消息中可选部分,如果SOAP消息中含有它,那么它一定要是soap:Envelope>中的第一个元素节点;<soap:Body>SOAP中必须部分,如果SOAP消息中没有<soap:Header>,那么<soap:Body>必须是SOAP中第一个元素节点。
  此外:在WebService返回给消费者时,如果服务发生异常,则返回给服务消费者还有<soap:Fault>元素节点,它包含在<soap:Body>中。如下:

<soap:Body>
<soap:Fault>
<faultcode xmlns:q0="ns=cnblogs.com/tyb1222">q0:code</faultcode>
<faultstring>System.Web.Services.Protocols.soapException: 0x00</faultstring>
<faultactor/>
<detail />
</soap:Fault>
</soap:Body>

<faultcode><soap:Fault>中必须的元素节点,它让消费者能识别错误

<faultstring><soap:Fault>中必须的元素节点,用来描述错误文本信息
<faultactor/>
不是<soap:Fault>中必须的元素节点,用来描述是在哪个路由节点上出错。
<detail >
用来描述与<soap:Body>有关的应用程序集错误信息。如果Body不能被正确处理,那<detail >就是<soap:Fault>中必须元素

 

4支持的协议                                                                  
  通常,访问的WebService都是通过Web服务器。访问Web服务器最常见的应用协议当然是久负盛名的HTTP了。HTTP也就成了支持SOAP最常用的协议。实际上支持SOAP支持的任何传输协议实现应用程序之间的通讯,包括TCPSMTP等。

 

5、通过SOAPHeader扩展SOAP                                                     
  在.Net平台上开发WebService,如果不通过SOAPHeaderSOAP头进行扩展,SOAP消息中只有<soap:Envelope><soap:Body>这两个SOAP中必须的两个节点。很多时候SOAPHeader的使用也是SOAP种经常用到的部分,如通过SOAPHeader 对消费者做身份认证,或者给SOAP消息中使用Actor来进行SOAP消息路由等。
  通过SOAPHeader扩展SOAP,可以在派生类中重写SOAPHeader的实现。注意通过派生类实现对SOAPHeader重写时,需要给派生类定义一个无参数构造函数,否则发布访问WebService时会报因为没有无参数构造函数而无法序列化的问题。
简要介绍一下扩展SOAPHeader

public class EaxmHeader : SoapHeader
{
     public string UserName { get; set; }
     public string Password { get; set; }
 
    public EaxmHeader()
    {
    }
 
    public EaxmHeader(string userName,string password)
    {
        UserName = userName;
        Password = password;
    }
}

  然后在WebService具体函数接口上通过SOAPAttributeMemberName设置为将EaxmHeader对象添加。如下:

[WebMethod]
[SoapHeader("header",Direction = SoapHeaderDirection.InOut)]
public int divide(int x,int y)

 

6自定义异常                                                                   
  网络通信中发射异常是难免的。有时为了保障服务的安全性而尽量少暴露服务信息并且需要让消费者知晓在调用过程中发生异常的原因,一般可通过抛出自定义SOAPException异常,在<soap:Fault> 自定义<faultcode>错误码和<faultstring>提示文本信息。如在catch throw new SOAPException(...)

 

7、监听消息                                                                     
SOAP消息监听工具有MSSoapT(MicrosoftSOAP ToolKit),tcpTrace等工具。下面就说说使用它们来监听SOAP消息。
发布完WebService以后,可以通过WSDL通过WebService URI地址或者是WebServiceWSDL文档来生成服务代理类(参见前一节)
代理类生产完成以后,在代理类的构造函数中设置端口号。如:

public class ExamService : SoapHttpClientProtocol
{
    private SendOrPostCallback divideOperationCompleted;
 
    /// <remarks/>
    public ExamService()
    {
        Url = "http://193.168.11.94:8866/ExamService/WebService1.asmx";
    }
....
}

  上面http://193.168.11.94:8866 就是在使用工具监听SOAP消息时本地的端口号。注意:如果是在VS调试环境下,使用Asp.NetDevelopment Server也会使用一个端口号,实际监听的端口号是代理类中设置的端口,和它一般是不同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐