gpt4 book ai didi

c# - 为什么 HttpWebRequest GetResponse 会阻塞这么长时间?

转载 作者:太空狗 更新时间:2023-10-29 23:11:48 28 4
gpt4 key购买 nike

我有一些相当简单的代码可以将照片或视频上传到端点(使用 HTTP PUT 或 POST)。我经常看到连接关闭异常抛出,实际上照片/视频上传得很好,它在异常发生的地方调用 GetResponse。

我注意到的一件事是 GetResponse 可能需要很长时间来处理。通常比照片实际上传到服务器的时间要长。我的代码使用 RequestStream.Write 写入 Web 服务器。

我做了一个小测试,将大约 40 张照片/视频上传到服务器,大小从 1MB 到 85MB 不等,GetResponse 返回的时间从 3 到 40 秒不等。

我的问题是,这正常吗?这只是我上传这些文件的服务器处理我的请求和响应需要多长时间的问题吗?在查看 Fidder HTTP 跟踪时,情况似乎是这样。

仅供引用,我的上传是 HTTP 1.0,超时值设置为无限(超时和 ReadWriteTimeout)

最佳答案

如果服务器确实花很长时间返回任何数据(如 Fiddler 中所示),那么这就是它的原因。上传一个 85MB 的附件需要很长时间才能开始,然后服务器必须处理它。您对此无能为力 - 如果您能够在调用返回之前继续进行更多工作,则只能使用异步方法。

虽然 Fiddler 向您显示的内容并不完全清楚 - 它是否在服务器发送响应之前显示了很长时间?如果是这样,您无能为力。诚然,我很惊讶你正在关闭连接。但是,如果您有一段时间没有看到您的数据被写入到服务器,那就另当别论了。

您要处理返回的响应吗?如果没有,您可能拥有保持事件状态的连接。如果它是明确的 HTTP 1.0,这不应该成为问题,但根据我的经验,这是“挂起”网络调用的最常见原因。

基本上,如果您不处理 WebResponse,它通常(至少对于 HTTP 1.1 和 keepalive)会保持连接。可以对单个主机打开的连接数量是有限制的,因此您最终可能要等到较早的响应完成,然后才能继续下一个响应。

如果这 是问题所在,一个简单的 using 语句就是答案:

using (WebResponse response = request.GetResponse())
{
...
}

关于c# - 为什么 HttpWebRequest GetResponse 会阻塞这么长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1418117/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com