http POST请求头默认携带Expect:100-continue参数,导致发送网络请求出错

BUG反馈 · 3220 次浏览
筱墙萤暗 创建于 2024-10-02 13:01

我在测试向 API 发送 POST 请求时发现报错“发送网络请求出错:已取消一个任务”,奇怪的是我用 Apifox 调试时完全正常

抓包发现 Quicker 在发送 POST 请求时会默认在请求头携带Expect:100-continue参数,服务器无法正常处理时就会发生报错,即便是指定了请求头依旧如此;GET 请求则不会有这个参数

希望作者大大可以修复这个bug,谢谢!

Quicker版本:1.43.29

系统:Windows11 23H2


回复内容
CL 2024-10-02 13:18
#1

查了一下,这个是.net底层自动带上的一个头,似乎是一个标准的请求头,参考 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/100 

修改这个设置似乎会有全局的影响,我还不是很确定是否应该关掉它。

感觉在服务端处理似乎更合理一些。 服务端是什么程序?

--

相关资料:

https://stackoverflow.com/questions/15341287/expect-100-continue

https://learn.microsoft.com/en-us/dotnet/api/system.net.servicepointmanager.expect100continue?view=net-8.0 


`ServicePointManager.Expect100Continue` 是 .NET 中用于控制 HTTP 请求行为的一个设置。具体来说,它与 HTTP 1.1 协议中的 "100 Continue" 状态码有关。

### `Expect100Continue` 的作用:

在 HTTP 1.1 协议中,当客户端发送带有大数据量(如文件上传)的请求时,它可以首先发送一个带有 `Expect: 100-continue` 头部的小请求,询问服务器是否愿意处理这个请求。如果服务器返回 `100 Continue`,客户端才会继续发送完整的数据。如果服务器返回其他状态码(如 4xx 或 5xx 错误),则客户端不会发送数据,从而节省了带宽。

`ServicePointManager.Expect100Continue` 的默认值为 `true`,表示在发送带有数据的 POST 请求时,客户端会使用这种 "探测" 机制。

### 是否应该将其设置为 `false`?

是否设置为 `false` 取决于具体的应用场景:

1. **如果你在发送大量小型请求**(如 JSON 请求或小型表单数据):
   - **可以考虑设置为 `false`**,这样可以减少一次额外的请求,提高性能。

2. **如果你发送的是大型文件或数据**:
   - **保持为 `true` 可能更好**,因为如果服务器拒绝处理请求(例如由于认证失败),客户端不会浪费带宽传输整个请求体。

3. **服务器兼容性**:
   - 如果服务器不支持 `100 Continue` 或者处理有问题,设置为 `false` 可以避免潜在的兼容性问题。

### 总结:
- 小型请求(POST 请求体较小):可以将 `ServicePointManager.Expect100Continue` 设置为 `false`。
- 大型请求:建议保持 `true`。


CL 最后更新于 2024-10-02 13:23
CL 回复 CL 2024-10-02 13:25 :

另外,在Quicker里是用的什么方式发送的请求?

筱墙萤暗 回复 CL 2024-10-02 13:48 :

没想到大佬在假期也回复得这么快,国庆快乐!

服务端是公司的内部系统,我没有办法控制;根据我自己的测试,请求头携带 Expect:100-continue 参数时会长时间无反应导致连接超时,去掉时则可以正常拿到 response

我的建议是在 Quicker 中提供是否携带这个请求头的开关,或者当用户自定义请求头时覆盖默认的参数

CL 回复 筱墙萤暗 2024-10-02 13:52 :

--

CL 最后更新于 2024-10-02 13:59
筱墙萤暗 2024-10-02 13:50
#2

我在 Quicker 中发送 POST 请求的配置如图所示:


CL 回复 筱墙萤暗 2024-10-02 13:52 :

好的

筱墙萤暗 2024-10-06 02:05
#3
刚刚才发现大佬2号就已经更新了 1.43.30 预览版解决了这个问题,现在一切正常,非常感谢!
回复主贴