Web服务器可以在客户端发送完整请求之前开始响应吗?

时间:2017-12-21 12:11:20

标签: http

我正在为一个学术研究小组写一个网络应用程序。研究人员需要能够以CSV格式上传大型数据集(100MB - 1GB)。我已经编写了服务器来处理数据。这意味着如果CSV的第一行出错,我们可以立即返回错误。

但是,当发生这种情况时,浏览器会报告"连接已重置"或类似的。很明显,我的网络服务器正在以一种没有意义的方式做出响应。

如果我在将错误返回给浏览器之前显式关闭HTTP请求流(这是JVM上的Kotlin),那么问题就会消失。然而,事实证明,请求流的紧密实现首先进行并将整个流读取到其结束。因此,此时用户仍需等待30分钟+才能发现其CSV的第一行出错。

我想做的是什么?在任何情况下,HTTP协议是否允许Web服务器在发送完整请求主体之前开始响应?如果没有,您是否可以建议一种解决方法,使我能够提供用户体验,用户在查明是否有任何问题之前不必等待整个文件上传?

2 个答案:

答案 0 :(得分:1)

答案是肯定的,根据http规范服务器应该能够及早发送响应,客户端应该停止发送请求正文。但是,大多数浏览器都没有正确实现这一点。

理论上,您的http服务器需要返回带有响应正文的4xx错误代码,然后重置连接以防止在后台继续上传。有关该问题的更详细说明,请参阅下面的答案。有几个浏览器版本支持这一点,所以如果您在实验室条件下执行此操作,您可以控制正在使用的客户端,下面的链接将有所帮助。

https://stackoverflow.com/a/14483857/2274303

https://stackoverflow.com/a/18370751/2274303

[编辑]

要回答有关使用变通方法的问题,使用javascript对上传内容进行分块是缓解互联网连接问题的好方法,但如果您想要实时解析它,就不会像任意分解那样简单归档。您需要确保不要在一行中间拆分文件,否则即使数据有效也会失败。这带来了在javascript中解析1GB文件的问题,这不是一个好主意。

如果您想使用javascript,请继续通过ajax请求立即上传整个文件,这样您就可以在主dom之外获得响应并强制重定向或取消上传。根据您使用的js库,有不同的方法。

这些都没有解决相反的情况。如果文件在发生错误之前上传了95%怎么办?研究人员需要再次上传整个文件或编辑文件,以便仅包含错误中的行。这意味着您的应用程序需要支持部分上传,并知道从中断的地方继续。所有这些都是可能的,但你可能不会找到一个简单的解决方法来使这个工作得很好。

如果不了解数据集以及您正在进行何种验证,很难找到完整的解决方案。如果解析每一行并不依赖于之前的行是有效的,那么您总是可以上传整个文件,然后在最后显示有错误的行,并要求他们上传第二个文件而只进行更正。

答案 1 :(得分:0)

HTTP Web服务器的正常过程如下:

Server listens for request
Client creates request
Client sends request to server
Server processes request
Server creates response
Server sends response to client
Client processes response

客户端启动通信连接,服务器能够响应该连接,但是如果关闭连接,服务器将需要在另一个连接上发送响应。浏览器可能不允许服务器启动客户端未请求的新连接。

您可以通过阅读第一行并快速创建错误来做出响应,但客户端在完成发送请求之前不会读取响应。

通过以块的形式发送文件或异步发送文件的行,您将能够立即提供反馈。您将发送许多较小的请求,并能够在两者之间做出响应。

问题是关于HTTP协议。如果您编写自定义应用程序和Web应用程序,我觉得协议允许这样做,但是如果您使用的是浏览器,则必须使用HTTP,因为公司已经实现了它。在自定义应用程序中,您可以检查是否存在中断,但是大多数浏览器可能会在收听响应之前触发完整请求,这也是AJAX在20年前发布的原因。