java - 如何通过 nginx 发出分块请求

标签 java soap nginx chunked-encoding cloud-foundry

看来nginx对chunked request的支持不是很好。但我正在尝试获得更明确(和最新)的答案。我有一个客户端从设置 header Transfer-Encoding: chunked 的 Java 客户端向服务器发出 SOAP 请求。当我直接连接到 Tomcat 上的应用程序时,一切正常。

但是当我将 nginx 放在它们之间时,事情就崩溃了。

添加一些细节:我正在使用 CloudFoundry。我正在使用 Micro Cloud Foundry 来确认在没有 nginx 的情况下一切正常。但是我的要求是使用cloudfoundry.com,所以我没有能力在那里绕过nginx。

This question and answer说这可能是我唯一的解决方法:http://wiki.nginx.org/NginxHttpChunkinModule .但该解决方法不可用,因为我无法修改 cloudfoundry.com 上的配置。

This question看起来也很相似,但它实际上涵盖了这个要求的反面。它涵盖分块响应而不是分块请求。

那么客户端上的任何更改如何解决这个问题?是否可以同时发送 Transfer-Encoding: chunkedContent-Length: 123 作为 header ?这个领域对我来说是新的,但从像 Apache HttpComponents 这样的项目来看,似乎可以设置长度或分块,但不能同时设置两者。分块的要点是您不需要知道请求开始时的长度。我可以告诉我的客户使用 HTTP/1.0 并在不分块的情况下与 nginx 一起玩吗?是否还有其他我忘记的解决方法?

最佳答案

我已经收集了这个问题所有部分的答案。

基础 nginx 不支持分块请求(正如 Alexander 所证实的!)。 Nginx 可以通过使用 NginXHttpCunkinModule 来支持分块请求(正如我的问题提到的)。更好:这个模块在 18 个多月前从测试状态升级到生产质量。最佳:我在最近的 meetup 上与 CloudFoundry 工程团队的一些成员进行了交谈。 ;他们确认计划将此模块添加到他们的 nginx 版本中。问题解决了。 (好吧,从长远来看,它已经完全解决了。但是我们没有确切的日期来确定何时会出现这种情况。)

因此,短期解决方案也不错。我找到了一个。

回答我向 Alexander 提出的问题:无法使用分块消息发送“Content-Length”。这就是分块消息的真正意义所在:您在拥有完整内容之前就开始发送它们,因此您还不可能知道长度。所以他避免分块请求的想法是正确的。但为了更实际,我会说,“使用 HTTP/1.0 而不是 HTTP/1.1”。这具有不发送分块消息的效果。我们能够临时修补我们的客户端来测试这个想法。有效。但我们不打算推出公共(public)补丁。让每个人都使用十年前的协议(protocol)(和一个十年前不受支持的客户端库!)来解决这种情况的问题似乎适得其反。

相反,我会在需要时使用被黑的客户端,如果其他人发现需要它,我会通过电子邮件发送出去,我们会等待 CloudFoundry 更新到 HttpChunkin 和 HTTP/1.1。

关于java - 如何通过 nginx 发出分块请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8528600/

相关文章:

Nginx 无法创建日志文件

AngularJS、Nodejs 和 Nginx 应用程序在尝试访问端点时返回 404

Java 方法作为带有嵌套方法调用的函数中的参数(更新)

java - 如何在 map View 中获得透明状态栏?

Java ArrayList - 将输入的整数存储到数组中并打印它

xml - 有效的 OTRS-TicketSearch 请求的 XML 是什么

php - NGINX try_files 重写导致 css 样式在存在斜线时消失

java - 类定义中的序列版本 ID

c# - 从 .NET 调用基于 AXIS 的 Web 服务时,永远不会填充嵌套的复杂类型元素

vb.net - 如何向 VB.NET 2008 SOAP 请求添加 header ?