You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含Shift-JIS日文的Batch请求返回400错误及连接中断问题求解决方案

解决Batch请求400 Bad Request及ClientAbortException问题

从你提供的代码、请求内容和服务器日志来看,这个问题是编码不匹配和响应头部修改干扰解析共同导致的——400错误源于请求格式/编码不符合服务器要求,而ClientAbortException则是客户端在处理响应时提前断开了连接。下面是针对性的解决方案:

1. 修复请求编码一致性问题

你提到已将日文字符转为Shift-JIS编码,但客户端构造请求时却用了Encoding.UTF8,这会导致Shift-JIS编码的字符被错误地按UTF-8解析,服务器无法正确识别JSON内容,直接返回400错误。

具体修复:

  • 构造请求内容时使用Shift-JIS编码,替代UTF-8:
    // 替换原有的Encoding.UTF8
    httpContent = requestcontent.GetHttpContent(Encoding.GetEncoding("Shift-JIS"), "text/plain");
    
  • 在Batch内部的POST请求头中明确指定编码,告诉服务器用Shift-JIS解析JSON:
    将请求里的Content-Type: application/json修改为:
    Content-Type: application/json; charset=Shift-JIS
    

2. 移除响应处理中对Content-Type的不必要修改

你的getMultiPart方法中给响应的Content-Type添加了msgtype=response参数,但ReadAsHttpResponseMessageAsync()会严格遵循HTTP规范解析响应内容,修改头部参数会干扰解析逻辑,甚至触发客户端提前断开连接(对应服务器日志里的ClientAbortException)。

具体修复:

  • 删除添加msgtype参数的代码,直接读取原始响应:
    // 移除这段修改头部的代码
    // if (!currentContent.Headers.ContentType.Parameters.Any(parameter => parameter.Name.Equals("msgtype", StringComparison.OrdinalIgnoreCase) && parameter.Value.Equals("response", StringComparison.OrdinalIgnoreCase)))
    // {
    //     currentContent.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("msgtype", "response"));
    // }
    multipartRespMsgs.Add(await currentContent.ReadAsHttpResponseMessageAsync());
    
  • 如果业务需要标记响应类型,可以在读取响应后单独记录,不要修改原始响应的头部信息。

3. 验证Batch请求的格式完整性

确保你的Batch请求符合HTTP规范:

  • 内部POST请求的头部和正文之间必须有一个空行(你当前的请求中已经有,但要确认实际发送时没有被代码截断)
  • 边界符(batch_request、changeset_1)的格式要严格匹配,末尾的--不能遗漏

4. 额外调试建议

  • 开启客户端HTTP日志,查看实际发送的请求内容,确认编码和格式是否与预期一致
  • 用Postman或curl手动构造相同的Batch请求,排除客户端代码的问题,验证服务器是否能正常处理
  • 在客户端代码中捕获ReadAsHttpResponseMessageAsync()抛出的具体异常,而不是只看400状态码,这能帮你定位更细节的错误原因

内容的提问来源于stack exchange,提问作者Scofield Michael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:33:00