我有一些相当简单的代码,可以将照片或视频上传到端点(使用HTTP PUT或POST)。每隔一段时间我就会看到连接关闭的异常抛出,实际上照片/视频上传得很好,它正在调用GetResponse发生异常的地方。
我注意到的一件事是GetResponse可能需要花费很长时间才能完成。通常比照片到服务器的实际上传时间长。我的代码使用RequestStream.Write写入Web服务器。
我做了一点测试,上传了大约40张照片/视频到服务器,大小从1MB到85MB不等,GetResponse返回的时间是3到40秒。
我的问题是,这是正常的吗?这仅仅是我上传这些文件的服务器需要多长时间来处理我的请求并做出响应?在查看Fidder HTTP跟踪时,似乎就是这种情况。
仅供参考,我上传的是HTTP 1.0,Timeout值设置为Infinite(Timeout和ReadWriteTimeout)
答案 0 :(得分:6)
如果服务器真正需要很长时间才能返回任何数据(如Fiddler所示)那么这就是原因。上传85MB附件需要很长时间才能开始,然后服务器必须处理它。除了使用异步方法,如果你能够在调用返回之前继续做更多的工作,你不能做很多事情。
它不是完全清楚Fiddler向你展示的内容 - 是否在服务器发送响应之前显示了很长时间?如果是这样,那么你无能为力。无可否认,我很惊讶连接正在关闭。但是,如果你没有看到你的数据写入一段时间,那就是另一回事了。
您是否处理了返回的回复?如果没有,您可能有连接保持活着。如果它是明确的HTTP 1.0,那么不应该成为一个问题,但这是根据我的经验“悬挂”网络电话的最常见原因。
基本上,如果你不处理WebResponse
,它通常会(至少使用HTTP 1.1和keepalive)保持连接。可以对单个主机开放的连接数有限制,因此您可能最终等待,直到较早的响应完成,然后才能继续下一个。
如果 问题,那么简单的using
语句就是答案:
using (WebResponse response = request.GetResponse())
{
...
}
答案 1 :(得分:0)
是的,响应时间可能比上传时间长很多。在将请求发送到服务器之后,必须处理它并且必须返回响应。处理请求之前可能需要一段时间,然后文件通常会保存在某个地方。之后,服务器将创建发回的响应页面。
IIS每次只处理一个来自每个用户的请求,因此如果您在第一个用户完成之前开始另一个上传,它将等到第一个上传完成后再开始处理下一个用户。