什么是SOAP with Attachments SWA详解
技术百科
煙雲
发布时间:2026-01-19
浏览: 次 SOAP with Attachments(SWA)是通过MIME multipart/related封装实现SOAP消息与二进制附件并列传输的标准机制,避免Base64编码导致的体积膨胀和解析开销;其第一部分为SOAP信封,其余为带Content-ID的原始二进制附件,SOAP体内用cid引用;相比MTOM和DIME,SWA兼容性强但WSDL描述弱、缺乏附件元数据定义,且现代框架更倾向MTOM。
SOAP with Attachments(SWA)是一种在SOAP消息中携带二进制附件的标准机制,它不改变SOAP本身,而是借助MIME多部分(multipart/related)封装,把SOAP信封和附件作为独立部分并列传输,避免将二进制数据Base64编码嵌入XML正文。
SWA的核心设计逻辑
SOAP本质是纯文本协议(基于XML),无法直接承载图片、PDF、音频等二进制内容。传统做法是用Base64编码把文件转成ASCII字符串塞进,但这会带来约33%的数据体积膨胀,且解析开销大、内存占用高。SWA绕开了这个瓶颈:它把整个HTTP请求/响应构造成一个MIME多部分消息,其中:
- 第一部分是标准的SOAP信封(Content-Type:
text/xml或application/soap+xml) - 其余部分为原始二进制附件(如
image/jpeg、application/pdf),各自拥有独立的Content-ID(如) - SOAP体内的元素可通过
href="cid:abc123@example.org"引用对应附件,实现“逻辑关联”而非“物理内嵌”
SWA与MTOM、DIME的关键区别
三者都解决SOAP传二进制的问题,但机制和适用性不同:
- SWA:基于已有MIME规范,无需新协议,兼容性强;但WSDL描述附件能力弱,对Document/literal绑定支持不佳,且未定义附件元数据(如文件名、类型)如何在SOAP层表达
- MTOM(Message Transmission Optimization Mechanism):W3C标准,明确结合XOP(XML-binary Optimized Packaging),能自动识别XML中Base64-encoded节点并外置为附件,语义更清晰,现代Web服务框架(如Axis2、.NET WCF)默认优先支持
- DIME:微软早期提出的轻量二进制封装格式,已基本淘汰,仅遗留于旧Office客户端互操作场景
实际开发中的典型用法
以Java Axis2为例,客户端上传一个JPG文件的SWA请求流程如下:
- 构造SOAP Body时,只放轻量字段(如文件名),附件ID用
urn:uuid:xxx占位 - 调用API(如
OperationClient.addAttachment())添加原始字节流,并指定Content-ID - 框架自动组装MIME边界(boundary)、设置
Content-Type: multipart/related及相应头字段 - 服务端通过
MessageContext.getAttachmentMap().getDataHandler("cid:xxx")获取附件流,直接写入磁盘或解码处理
注意事项与局限性
SWA虽简单直接,但落地时需注意:
- 不是所有XML网关或防火墙默认允许附件;需显式开启
Request Attachments: allow配置 - 附件无统一命名机制,文件名通常靠额外SOAP字段传递,易出错
- 大型附件可能触发中间件(如代理、负载均衡器)的大小限制或超时,需同步调整HTTP层参数
- 调试困难:普通抓包工具(如Wireshark)可看到MIME结构,但需手动解析各部分,不如纯XML直观
# 是一种
# 已有
# 为例
# 微软
# app
# 客户端
# 自动识别
# 工具
# 防火墙
# http
# java
# 编码
# 字节
# 区别
# 内存占用
# xml
# 字符串
# .net
# 体内
# 封装
# ASCII
# office
# pdf
# 中间件
# 负载均衡
# href
# 均衡器
# 外置
# wireshark
# 第一部
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- VSC怎样用终端运行PHP_命令行执行脚本的步骤【
- Mac如何将HEIC图片格式转为JPG_Mac批量
- Python文件操作优化_大文件与流处理解析【教程
- LINUX如何删除用户和用户组_Linux use
- Drupal 中 HTML 链接被双重转义导致渲染
- 如何使用Golang管理跨项目依赖_Golang多
- Win11怎么关闭OneDrive同步_Win11
- GML (Geography Markup Lan
- Windows怎样关闭桌面弹窗广告_Windows
- Win11搜索栏无法输入_解决Win11开始菜单搜
- 如何使用Golang实现容器安全扫描_Golang
- Mac如何与安卓手机传文件_Mac和Android
- 如何在 Go 项目开发中正确处理本地包导入与远程模
- php订单日志怎么按状态筛选_php筛选不同状态订
- c++中如何进行二进制文件读写_c++ read与
- 如何在Windows中创建新的用户账户?(标准与管
- php增删改查需要哪些扩展_开启mysqli或pd
- Win11文件夹预览图不显示怎么办_Win11缩略
- mac本地php环境如何开启curl_curl扩展
- php高频调试功能有哪些_php常用调试函数与工具
- Python对象生命周期管理_创建销毁解析【教程】
- Win10 BitLocker加密教程 Win10
- Windows怎样拦截QQ浏览器广告_Window
- Win11怎么开启远程桌面_Win11系统远程桌面
- Windows10系统更新错误0x80070002
- Win11怎么关闭透明效果_Windows11辅助
- Win11怎么关闭VBS安全性_Windows11
- php怎么操作Redis_Redis扩展连接与基本
- Win11摄像头无法使用怎么办_Win11相机隐私
- php中self::能调用子类重写的方法吗_静态绑
- 如何在Golang中编写异步函数测试_Golang
- Win11怎么更改任务栏位置_修改注册表将Win1
- 如何正确访问 Laravel 模型或对象的属性而非
- Python类装饰器使用_元编程解析【教程】
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- Win11截图快捷键是什么_Win11自带截图工具
- C++ static_cast和dynamic_c
- Avalonia如何实现跨窗口通信 Avaloni
- 如何使用Golang实现文件追加操作_向已有文件追
- Win10如何备份注册表_Win10注册表备份步骤
- Windows10系统怎么查看系统版本_Win10
- Win11怎么关闭内容自适应亮度_Windows1
- Win11怎么设置任务栏透明_Windows11使
- 如何减少Golang内存碎片化_Golang内存分
- Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系
- Win11输入法切换快捷键怎么改_Windows
- php命令行怎么运行_通过CLI模式执行PHP脚本
- 为什么本地php环境运行php脚本卡顿_php执行
- Win11怎样安装微信开发者工具_Win11安装开
- Windows任务计划服务异常原因_任务调度失败的


QQ客服