OSB 12c禁用分块流模式仍返回chunked编码,需保留Content-Length
解决OSB 12c禁用分块流模式后仍设置Transfer-Encoding: chunked的问题
我之前在处理OSB 12c项目时遇到过完全一样的问题,给你几个经过验证的解决方案,你可以逐一尝试:
1. 彻底检查业务服务的HTTP传输配置
有时候看起来禁用了分块模式,但可能有其他隐式配置在起作用:
- 打开目标业务服务的配置页面,进入HTTP Transport标签
- 确认
Use Chunked Streaming Mode确实被设置为No - 同时检查
Content-Length相关的配置项:部分版本里需要手动开启Send Content-Length Header(如果有该选项) - 保存配置后重启对应的OSB服务器节点,确保配置完全生效
2. 通过流水线手动控制响应头
如果配置层面不生效,可以在业务服务对应的流水线里强制修改响应头:
- 在流水线的Response Stage中添加一个
Assign动作 - 使用XQuery计算响应体的长度,示例代码:
fn:string-length($body) - 将计算结果赋值给
$outbound/ctx:transport/ctx:response/tp:headers/Content-Length - 再添加一个
Delete动作,移除$outbound/ctx:transport/ctx:response/tp:headers/Transfer-Encoding - 这样能确保响应头只包含
Content-Length,不会被分块编码覆盖
3. 配置响应头覆盖规则
如果后端服务本身返回了Transfer-Encoding: chunked头,OSB会默认转发,这时候需要在业务服务里配置头覆盖:
- 进入业务服务的HTTP Transport标签,找到Response Header Processing部分
- 设置
Overwrite Response Headers为Yes - 在
Response Headers列表中添加Transfer-Encoding并设置为空值,或者直接添加Content-Length并指定预期值(如果能提前确定的话) - 这样OSB会强制替换后端返回的响应头
4. 检查并应用Oracle官方补丁
这个问题在OSB 12c的特定版本里属于已知bug,Oracle已经发布了对应补丁:
- 对于12.1.3版本,可查找编号为20806544的补丁(具体以Oracle官方支持文档为准)
- 对于12.2.1.2版本,对应的补丁编号是25055537
- 应用补丁后重启OSB集群,通常能彻底解决配置不生效的问题
如果以上方法都不奏效,可以尝试启用OSB的HTTP传输日志,查看请求和响应头的完整流转过程,定位是哪个环节添加了Transfer-Encoding: chunked头。
内容的提问来源于stack exchange,提问作者sanjay kumar
相关产品推荐
相关产品推荐

