SOAP消息机制简介
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 { get ; set ; }
public string Password { get ; set ; }
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()
{
Url = "http://193.168.11.94:8866/ExamService/WebService1.asmx" ;
}
....
}
|
上面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消息机制简介相关推荐
- SendMessage和PostMessage及Windows消息机制简介
SendMessage: The SendMessage function sends the specified message to a window or windows. It calls t ...
- iOS开发系列--通知与消息机制
http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣 ...
- EJB与JAVA BEAN_J2EE的异步消息机制
EJB与JAVA BEAN_J2EE的异步消息机制 EJB与JAVA BEAN的区别 Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个 ...
- android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码
提起Android消息机制,想必都不陌生.其中包含三个部分:Handler,MessageQueue以及Looper,三者共同协作,完成消息机制的运行.本篇文章将由浅入深解析Android消息机制的运 ...
- 如何在WCF中用TcpTrace工具查看发送和接收的SOAP消息
WCF对消息加密(只对消息加密,不考虑Authorize)其实很简单,只要在server和client端的binding加入security mode为Message(还有Transport, Tra ...
- 技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化...
简介: 在本篇技巧文章中,作者兼开发人员 Nicholas Chase 向您演示如何使用用于 XML 消息传递的 Java API(Java API for XML Messaging (JAXM)) ...
- 深入BCB理解VCL的消息机制
深入BCB理解VCL的消息机制 引子:本文所谈及的技术内容都来自于Internet的公开信息.由笔者在闲暇之际整理 后,贴出来以飴网友,姑且妄称原创.每次在国外网站上找到精彩文章的时候,心中都 会暗自 ...
- soap签名_签名SOAP消息–生成封装的XML签名
soap签名 数字签名是使数字内容可信的一种广泛使用的机制. 通过为某些内容生成数字签名,我们可以让另一方能够验证该内容. 通过此验证,它可以保证在我们签名后不会更改. 通过这个示例,我将分享如何为S ...
- 签名SOAP消息–生成封装的XML签名
数字签名是使数字内容真实可信的一种广泛使用的机制. 通过为某些内容生成数字签名,我们可以让另一方能够验证该内容. 通过此验证,它可以保证在我们签名后不会更改. 通过这个示例,我将分享如何为SOAP信封 ...
最新文章
- arcgis中的python字符串比较
- 二叉树经典题之将二叉树分层打印
- Android 系统(92)---诊断原生代码崩溃问题
- 互联网年终福利大盘点,告诉你过年的正确姿势!
- MySQL Innodb数据库性能实践——VARCHAR vs CHAR
- 替罪羊树的原理及实例
- 软考——系统架构设计师工作日志
- 服务器修复oxc0000098,修复oxc0000098的方法
- MD5加密——代码实现
- html5画图程序,基于HTML5的Windows画图程序
- Leetcode力扣 VS Code插件——面向新手
- java将uuid转换成大写,python生成大写32位uuid代码
- 车辆占用应急车道识别抓拍系统 opencv
- 用毕安格将投影坐标的3dmax模型转换为3dtiles
- Java保留字_static
- App 用户新体验——Agora Native SDK 3.4.0
- Tkinter 1. 基本介绍
- BUUCTF之“judgement_mna_2016”
- 智慧企业的基础——知识中台
- 在C++控制台程序中播放欢乐颂
热门文章
- c++智能指针的设计思想
- c++标准程序库异常
- linux 命令行 ctrl z,Linux操作系统下运行命令时CTRL+Z的作用
- 「Python」超简单!Python返回矩阵最大元素/最小值坐标,三行搞定!(更新:一行搞定!)
- Java获取系统文件类型图标并显示在JSP上
- Scikit-learn 数据预处理之归一化MinMaxScaler
- code vs 集成tfs_关于编译器和集成开发环境,一文给你讲明白!
- 事业单位考试计算机科学与技术试题的答案,事业单位考试计算机基础知识试题答案...
- UVC (USB Video Class) 使用笔记 (转)
- pytorch系列 ---5以 linear_regression为例讲解神经网络实现基本步骤以及解读nn.Linear函数