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

  • 1、XSD是什么
  • 2、基于SOAP的数据交互系统是XSD的
  • 3、SOAPSOAP消息结构
  • 4、支持SOAP的协议
  • 5、通过SOAPHeader扩展SOAP
  • 6、SOAP自定义异常
  • 7、监听SOAP消息

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

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

3、SOAP消息结构  
  首先看看如下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>中。如下:

1
2
3
4
5
6
7
8
<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、支持SOAP的协议 
  通常,访问的WebService都是通过Web服务器。访问Web服务器最常见的应用协议当然是久负盛名的HTTP了。HTTP也就成了支持SOAP最常用的协议。实际上支持SOAP支持的任何传输协议实现应用程序之间的通讯,包括TCP、SMTP等。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class EaxmHeader : SoapHeader
{
     public string UserName { getset; }
     public string Password { getset; }
 
    public EaxmHeader()
    {
    }
 
    public EaxmHeader(string userName,string password)
    {
        UserName = userName;
        Password = password;
    }
}

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

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

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

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

public class ExamService : SoapHttpClientProtocol
{
    private SendOrPostCallback divideOperationCompleted;
 
    /// <remarks/>
    public ExamService()
    {
    }
....
}

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

7.1、使用MSSoapT监听SOAP 消息 
设置监听端口、主机等信息,如下图:

这样,调试程序时,MSSoapT监听到SOAP 消息如下图:

上半部分为请求SOAP消息,下部分为返回SOAP消息。如下图:

7.2、使用tcpTrace监听SOAP 消息。

这样监听到的消息如下图:

本文来自于网络

soap消息机制 讲解的更多相关文章

  1. Handler消息机制的一些原理(直接用code讲解)——Android开发

    package com.example.handlertest; import android.os.Bundle; import android.os.Handler; import android ...

  2. Android消息机制

    每一个Android应用在启动的时候都会创建一个线程,这个线程被称为主线程或者UI线程,Android应用的所有操作默认都会运行在这个线程中. 但是当我们想要进行数据请求,图片下载,或者其他耗时操作时 ...

  3. Android消息机制源码分析

    本篇主要介绍Android中的消息机制,即Looper.Handler是如何协同工作的: Looper:主要用来管理当前线程的消息队列,每个线程只能有一个Looper Handler:用来将消息(Me ...

  4. <Win32_1>深入浅出windows消息机制[转自crocodile_]

    上学期学习了Java ,感觉Java写一个窗口真心简单,很易上手,也就难怪很多开发人员选择Java作为自己的开发编程语言.但是由于自身对windows的热爱,让我觉得c.c++语言才是我亲睐的编程语言 ...

  5. Web Service学习之八:Soap消息详解

    一.区别概念 WSDL是网络服务描述语言,是XML文档:它包含一系列描述某个web service的定义或者说是规则.尤其是定义了传输Sope消息的结构 Soap:简单对象访问协议,是交换数据的一种协 ...

  6. 消息机制2 - Windows程序设计(SDK)005

    消息机制2 让编程改变世界 Change the world by program 内容节选: 关于消息机制,还有三点需要补充: 消息队列是FIFO的形式 WM_PAINT,WM_TIMER 和 WM ...

  7. 消息机制 - Windows程序设计(SDK)004

    消息机制 让编程改变世界 Change the world by program 内容节选: 我们来回顾一下,窗口是怎么从代码中诞生出来的? 1. 首先我们是通过给 WNDCLASS 窗口类结构各个成 ...

  8. WPF的消息机制

    前言 谈起“消息机制”这个词,我们都会想到Windows的消息机制,系统将键盘鼠标的行为包装成一个Windows Message,然后系统主动将这些Windows Message派发给特定的窗口,实际 ...

  9. runtime——消息机制

    本文授权转载,作者:Sindri的小巢(简书) 从异常说起 我们都知道,在iOS中存在这么一个通用类类型id,它可以用来表示任何对象的类型 —— 这意味着我们使用id类型的对象调用任何一个方法,编译器 ...

随机推荐

  1. 对象this、currentTarget和target

    在事件处理程序内部,对象this始终等于currentTarget的值,而target则只包含事件的实际目标.如果直接将事件处理程序指定给了目标元素,则this.currentTarget和targe ...

  2. WCF之数据契约

    从抽象层面看,WCF能够托管CLR类型(接口和类)并将它们公开为服务,也能够以本地CLR接口和类的方式使用服务.然而,CLR类型却属于.NET的特定技术.由于面向服务的一个核心原则就是在跨越服务边界时 ...

  3. android SDK启动的错误

    1. AVD Manager.exe : failed to execute tools android.bat 请把AVD Manager.exe复制到跟 SDK Manager.exe的相同目录下 ...

  4. 弹性布局-flex

    浅谈display:flex   display:flex 意思是弹性布局 首先flex的出现是为了解决哪些问题呢? 一.页面行排列布局 像此图左右两个div一排显示 可以用浮动的布局方式 html部 ...

  5. <Linux下FTP服务的搭建>

    默认安装好ftp软件包匿名用户是可以下载的.匿名以后可以上传:anon_upload_enable=YES# getsebool -a | grep ftpallow_ftpd_anon_write ...

  6. 村田噪声抑制基础教程-第一章 需要EMI静噪滤波器的原因

    1-1. 简介 EMI静噪滤波器 (EMIFIL®) 是为电子设备提供电磁噪声抑制的电子元件,配合屏蔽罩和其他保护装置一起使用.这种滤波器仅从通过连线传导的电流中提取并移除引起电磁噪声的元件.第1章说 ...

  7. Linux下iftop网卡流量监控使用

    在类linux系统中可以使用top查看系统资源.进程.内存占用等信息.查看网络状态可以使用netstat.nmap等工具.若要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop. 一.i ...

  8. Silverlight浮动窗体 floatablewindow 非模态对话框

    1.http://www.cnblogs.com/yinxiangpei/articles/2613913.html 说明:Silverlight的ChildWindow组件给我们的开发带来了便利,比 ...

  9. NaN 和 Infinity

    using Fasterflect; using System; using System.Collections.Generic; using System.Linq; using System.R ...

  10. 关于不同进制数之间转换的数学推导【Written By KillerLegend】

    关于不同进制数之间转换的数学推导 涉及范围:正整数范围内二进制(Binary),八进制(Octonary),十进制(Decimal),十六进制(hexadecimal)之间的转换 数的进制有多种,比如 ...