我正在尝试通过spring-boot网关上传(上传)一个文件,将请求转发到内部RestController (请参阅DemoController.java)。我可以读取数据,但连接保持打开。网关路由是通过application.yml配置的。
演示代码和curl请求可以在https://github.com/knottnhupfer/spring-boot-reactive-gateway-demo上找到
启动spring boot应用程序并调用:
curl --user user:secret -v http://localhost:8080/api/testing/README.md \
--upload-file README.md更新:
在此期间,我可以读取文件,但服务器端的连接并未关闭。这是反应式的正常行为吗?我需要主动关闭连接吗?我意识到用Mono包装它会关闭连接,但不再读取数据。
目前,RestController方法如下所示:
@PutMapping(value = "/{value}/**", consumes = "application/octet-stream")
public Mono<ResponseEntity> putArtifact(ServerHttpRequest request,
@RequestBody ByteArrayResource resource, @PathVariable("value") String value) {
[...]
}提前进行Thx
/david
发布于 2020-03-19 16:30:37
简短的回答
解决方法是将-H 'Expect'添加到curl命令的末尾。
详细信息
这是关于Http 100继续状态代码。当服务器可能拒绝(可能是因为文件太大)时使用它,然后客户端可以首先询问服务器是否接受请求。因此,客户端和服务器都不会浪费它们的时间,例如:由于文件大小可能会被拒绝。
当你发送一个PUT请求时,默认情况下,curl adds将"Expect 100-continue“添加到请求中(如果大小大于某个阈值,也会在POST中添加)。我希望在这种情况下,服务器会响应Http 100,但看起来可能有一个issue in spring cloud gateway
将-H 'Expect'添加到命令的末尾意味着您作为客户端将不再等待来自服务器的HTTP100状态发送您的请求。但这仍然是一个问题,其根本原因应该调查。可能是因为有两台服务器在处理HTTP 100 (网关+服务器),客户端不知何故挂断了。在this issue中也提到了这些
https://stackoverflow.com/questions/57878258
复制相似问题