Net::ERR_INCOMPLETE_CHUNKED_ENCODING问题跟踪

本文记录了一次解决Net::ERR_INCOMPLETE_CHUNKED_ENCODING错误的过程。问题源于Hibernate双向一对多映射导致的JSON响应无限循环嵌套,从而使得响应内容被截断。通过Fiddler查看原始响应,发现在接口返回时,由于对象间的循环引用,响应数据膨胀。最终解决方案是避免直接返回可能引发循环嵌套的对象,改为自定义JSON结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天做项目的时候突然出现了一个问题:
这里写图片描述
百思不得其解,从字面上理解的话应该是响应被截断了。
在网上查了不少遇到这个问题的帖子,看得云里雾里,和我遇到的情况都不一样,决定还是自己来定位一下。

回顾修改历史

查看了一下svn日志,发现最近所做的修改里面有一点比较可疑。就是使用了Hibernate的双向一对多映射。

@ManyToOne
    @JoinColumn(name = "trade_type_id")
    public TradeType getTradeType() {
        return tradeType;
    }

    public void setTradeType(TradeType tradeType) {
        this.tradeType = tradeType;
    }
@OneToMany(mappedBy = "tradeType")
    public Set<MainLmmIndex> getMainLmmIndexSet() {
        
### 可能的原因 `net::ERR_INCOMPLETE_CHUNKED_ENCODING` 错误通常表示客户端接收到的数据流未按预期完成传输。当使用 `fetchEventSource` 进行 Server-Sent Events (SSE) 请求时,这种错误可能是由于服务器未能正确结束响应或者中间件(如 Nginx)在处理分块编码时出现问题所致[^1]。 以下是可能导致该问题的具体原因: 1. **Nginx 缓冲区设置不当**:如果 Nginx 的代理缓冲区大小不足以容纳 SSE 数据流,则可能会截断数据流并引发此错误[^4]。 2. **服务器端代码逻辑问题**:如果服务端未能正确发送完整的 HTTP 响应头或意外终止了连接,也可能导致此类错误[^3]。 3. **网络不稳定**:在网络质量较差的情况下,部分数据包可能丢失,从而造成不完整的数据流[^5]。 4. **Gzip 压缩冲突**:启用 Gzip 压缩功能后,某些情况下会干扰分块编码的正常工作。 --- ### 解决方案 #### 方案一:调整 Nginx 配置 可以通过修改 Nginx 配置来适应 SSE 流式传输的需求。具体参数如下: ```nginx http { ... proxy_buffering off; proxy_cache off; location /your-sse-endpoint/ { proxy_set_header Connection ''; proxy_http_version 1.1; chunked_transfer_encoding on; # 调整缓冲区大小以支持大流量 SSE 数据 proxy_buffer_size 4096k; proxy_buffers 16 4096k; proxy_busy_buffers_size 8192k; proxy_temp_file_write_size 8192k; } } ``` 以上配置禁用了代理缓冲机制 (`proxy_buffering`) 和缓存 (`proxy_cache`),确保数据能够实时传递给客户端而不被截断。 #### 方案二:检查服务端实现 验证服务端是否按照标准实现了 SSE 协议。以下是一个典型的 Node.js 实现示例: ```javascript app.get('/events', function(req, res) { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); const sendEvent = () => { try { res.write(`data: ${JSON.stringify({ time: new Date().toISOString() })}\n\n`); } catch (e) { console.error(e); clearInterval(intervalId); // 清除定时器以防内存泄漏 } }; const intervalId = setInterval(sendEvent, 1000); req.on('close', () => { clearInterval(intervalId); }); }); ``` 注意以下几点: - 设置正确的 MIME 类型为 `text/event-stream`; - 添加必要的头部字段防止缓存; - 确保每次消息都以 `\n\n` 结束。 #### 方案三:排查网络与压缩设置 1. 如果启用了 Gzip 压缩,请考虑将其关闭或将特定路径排除在外: ```nginx gzip_types text/plain application/json; gzip_disable "msie6"; location /your-sse-endpoint/ { gzip off; } ``` 2. 检查是否有防火墙或其他设备拦截了长连接请求,并适当放宽限制条件。 #### 方案四:客户端重试机制 即使解决了大部分潜在问题,在极端条件下仍可能出现短暂掉线情况。因此建议加入自动重连逻辑: ```javascript const eventSource = new EventSource('/events'); eventSource.onerror = function(event) { console.log('Error occurred:', event); setTimeout(() => { console.log('Attempting reconnect...'); eventSource.close(); initEventSource(); // 自定义函数用于重新初始化连接 }, 5000); // 延迟 5 秒后再尝试恢复链接 }; ``` --- ### 总结 通过合理调整 Nginx 参数、完善服务端协议遵循度以及增强客户端鲁棒性可以有效缓解甚至彻底消除 `net::ERR_INCOMPLETE_CHUNKED_ENCODING` 错误的发生概率。实际操作中需结合具体情况逐一测试上述措施直至找到最佳组合方式。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值