邵盛松 2012-5-22

一 SOAP消息结构

SOAP消息包括以下元素

必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息,XML文件的顶层元素,代表该文件为SOAP消息

可选的 Header 元素,包含头部信息

必需的 Body 元素,包含所有的调用和响应信息

可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

可选的Attachment,主要用于传递附件,扩展的SOAP消息

Envelope是SOAP消息中的根节点,是SOAP消息中必需的部分;Header是SOAP消息中可选部分,如果SOAP消息中含有它,那么它一定要是soap:Envelope>中的第一个元素节点;Body是SOAP中必需部分,如果SOAP消息中没Header,那么Body必须是SOAP中第一个元素节点。

在默认生成的代码中关于Header 元素定义

/* SOAP Header: */

struct SOAP_ENV__Header

{

#ifdef WITH_NOEMPTYSTRUCT

private:

char dummy; /* dummy member to enable compilation */

#endif

};

下图为SOAP消息的结构


Fault结构

<faultcode>供识别故障的代码

<faultstring>这里的错误是为人设定的,让人读懂,而不是为程序处理设定的。

<faultactor>有关是谁引发故障的信息

<detail>Body元素中的内容不能被成功地处理的时候,它就出现了。

代码中fault结构体如下

struct SOAP_ENV__Fault

{

public:

char *faultcode; /* optional element of type xsd:QName */

char *faultstring; /* optional element of type xsd:string */

char *faultactor; /* optional element of type xsd:string */

struct SOAP_ENV__Detail *detail; /* optional element of type SOAP-ENV:Detail */

struct SOAP_ENV__Code *SOAP_ENV__Code; /* optional element of type SOAP-ENV:Code */

struct SOAP_ENV__Reason *SOAP_ENV__Reason; /* optional element of type SOAP-ENV:Reason */

char *SOAP_ENV__Node; /* optional element of type xsd:string */

char *SOAP_ENV__Role; /* optional element of type xsd:string */

struct SOAP_ENV__Detail *SOAP_ENV__Detail; /* optional element of type SOAP-ENV:Detail */

};

Fault是Body的一个子元素主要用于用于报告错误。

SOAP命名空间

SOAP_NMAC struct Namespace namespaces[] =

{

{"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL},

{"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL},

{"xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL},

{"xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL},

{"ns", "urn:calc", NULL, NULL},

{NULL, NULL, NULL, NULL}

};

这里的URL并不是指向文件,而只是一个名字。如果一个SOAP应用程序接收了一个消息,而该消息的SOAP Envelope元素使用和上述不同的名称空间,则该应用程序就将其视为版本错误并忽略该消息。

二 gSOAP Keep-Alive和超时管理

gSOAP是绑定Http协议来对xml数据进行传输,一个SOAP请求实际上就是一个HTTP POST请求。

消息从发送方到接受方方是单向传送,即以请求/应答的方式实现的。这也就是为什么生成的xml文件都是req,res成对出现的

gSOAP运行环境实例是一个struct soap类型的变量,struct SOAP_STD_API soap

。

gSOAP支持HTTP Keep-Alive,生成代码中默认没有使用Keep-Alive

calcService_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);

如果参数更改SOAP_IO_KEEPALIVE将使用Keep-Alive,默认最大连接100

以下代码在soap结构体中

short tcp_keep_alive; /* enable SO_KEEPALIVE */

unsigned int tcp_keep_idle;  /* set TCP_KEEPIDLE */

unsigned int tcp_keep_intvl;  /* set TCP_KEEPINTVL */

unsigned int tcp_keep_cnt;  /* set TCP_KEEPCNT */

unsigned int max_keep_alive;  /* maximum keep-alive session (default=100) */

TCP_KEEPIDLE  空闲多久开始发送keepalive包

TCP_KEEPCNT 总共发送多少个

TCP_KEEPINTVL 每两个keepalive包的发送时间间隔

这种非阻塞管理需要设置超时时间

接收超时时间

发送超时时间

连接超时时间

接受请求超时时间

代码如下,这也是soap结构体的一部分

int recv_timeout;/* when > 0, gives socket recv timeout in seconds, < 0 in usec */

int send_timeout;/* when > 0, gives socket send timeout in seconds, < 0 in usec */

int connect_timeout;/* when > 0, gives socket connect() timeout in seconds, < 0 in usec */

int accept_timeout;/* when > 0, gives socket accept() timeout in seconds, < 0 in usec */

正值以秒为单位。负值以微秒为单位。

三 提高速度技巧

1 通过更改在stdsoap2.h文件中SOAP_BUFLEN宏,增加缓存大小

2 如果客户端需要多次连接相同的服务器,那么客户端使用HTTP keep-alive。服务端也要支持HTTP keep-alive,这样能够最大的增强服务端和客户端的性能。

3 使用HTTP分块传输

4 不要使用gzip压缩

摘自 flyfish1986的专栏

SOAP消息结构的更多相关文章

  1. soap消息机制 讲解

    SOAP(Simple Object Access Protocol,简单对象访问协议)作为一种信息交互协议在分布式应用中非常广泛,如WebService.在使用.Net开发WebService时候, ...

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

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

  3. 2.技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化

    转自:https://www.cnblogs.com/chenying99/archive/2013/05/23/3094128.html 技巧: 用 JAXM 发送和接收 SOAP 消息—Java ...

  4. (七)发送、接收SOAP消息(以HttpClient方式)(2)

    一.为什么要用soap 原本我们使用web服务都是根据wsdl生成客户端(生成一堆java文件)然后再调用,本章节讲解如何用soap消息来替代这种方式. 二.SOAP消息格式 SOAP(简单对象访问协 ...

  5. (六)发送、接收SOAP消息(1)

    一.为什么要用soap 原本我们使用web服务都是根据wsdl生成客户端(生成一堆java文件)然后再调用,本章节讲解如何用soap消息来替代这种方式. 二.SOAP消息格式 SOAP(简单对象访问协 ...

  6. SOAP消息的结构

    概述 介绍SOAP报文的结构,以及获取的方式. 正文 1.其实发送的是SOAP消息 在前面讲述过使用Eclipse的工具Web Services Explorer发送请求.在Actions中填写请求参 ...

  7. 写入soap消息以及与soap消息通信

    1.些了解一下soap消息的结构以及通信方式如下图:

  8. ZeroMQ接口函数之 :zmq_msg_init - 初始化一个空的ZMQ消息结构

    ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_msg_init zmq_msg_init(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_ ...

  9. HTTP消息结构

    HTTP 消息结构 HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议. 一个HTTP"客户端"是一个应用程序(Web浏览 ...

随机推荐

  1. 洛谷 P1239 计数器

    P1239 计数器 题目描述 一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9.其中—个页码不含多余的0,如N=1234时第5页不是0005,只是5. 输入输出格式 ...

  2. 深入解析开源项目之Universal-Image-Loader(二)硬盘---缓存篇

    文件命名: FileNameGenerator,HashCodeFileNameGenerator,Md5FileNameGenerator package com.nostra13.universa ...

  3. thinkphp5多文件上传如何实现

    thinkphp5多文件上传如何实现 一.总结 一句话总结:官方文档,测试一下,一定要测试,打印中间变量,就知道每句话是什么意思,一定要测试一下.又简单有快. 测试一下,你就能确定中间变量和你的是不是 ...

  4. 2011年度十大杰出IT博客获奖感言

        2011年度十大杰出IT博客获奖感言 在各位评委.网友的支持下,我的博客从前50名中脱颖而出跻身10强,得到这个消息之后心中充满了喜悦.在这里要感谢51CTO为大家提供这样一个良好的展示平台. ...

  5. 洛谷 P2867 [USACO06NOV]大广场Big Square

    P2867 [USACO06NOV]大广场Big Square 题目描述 Farmer John's cows have entered into a competition with Farmer ...

  6. SpringMVC &amp; Struts2

    这两个框架可谓Java中的经典,Java开发必懂的框架,这两天在面试中又问道两者的异同.这里简单做了整理供大家參考交流. 概念:

  7. 逐步配置企业版Symantec Norton防病毒服务器

    逐步配置企业版Symantec Norton防病毒服务器 配置企业版Symantec Norton NT操作系统,已经安装IIS 安装Symantec Norton 10 安装系统中心 650) th ...

  8. Qt之模型/视图(自己定义button)

    简述 衍伸前面的章节,我们对QTableView实现了数据显示.自己定义排序.显示复选框.进度条等功能的实现.本节主要针对自己定义button进行解说.这节过后,也希望大家对自己定义有更深入的了解.在 ...

  9. ShopEx 中规格属性添加时,自己主动计算其相应的销售价格,同一时候注意模板中的变量间的计算

    在ShopEx中,添加产品的规格时,如颜色.尺寸.是否送货等配置信息,默认情况下,这些内容是须要手动计算的,若仅仅有几个属性值还easy计算,假设每个属性值比較多,通过手动计算将是一个灰常巨大的工作量 ...

  10. 含有过滤功能的android流式布局

    FilterFlowLayout 含有过滤功能的流式布局, 參考FlowLayout 能够去除宽度不在范围(比例或真实值)内的子view 能够设置最大行数 能够加入组件间水平间距 能够加入行间距 系统 ...