“警告无法确定响应正文的内容长度”是啥意思。意思是我如何摆脱它?
Posted
技术标签:
【中文标题】“警告无法确定响应正文的内容长度”是啥意思。意思是我如何摆脱它?【英文标题】:What does "WARN Could not determine content-length of response body." mean and how to I get rid of it?“警告无法确定响应正文的内容长度”是什么意思。意思是我如何摆脱它? 【发布时间】:2011-10-28 06:47:44 【问题描述】:自从升级到 Rails 3.1 后,我在开发日志中看到了这条警告消息:
WARN 无法确定响应正文的内容长度。设置响应的内容长度或设置
Response#chunked = true
这是什么意思,我该如何删除它?有问题吗?
【问题讨论】:
这里也一样,对我来说这是通过 JS 远程调用时发生的。 我今天升级到 Ruby 1.9.3 后就开始使用它。以前没见过。我认为这一定是由于 Ruby 1.9.3 中 WEBrick 的变化... 确实是WEBrick问题。同时,您可以将“瘦”gem 添加到您的 Gemfile 并使用它而不是 WEBrick 启动 Rails,例如rails s thin
;达达!没有更多警告。
【参考方案1】:
向 Rails-Core 的一位成员提出了同样的问题:
https://twitter.com/luislavena/status/108998968859566080
答案是:
https://twitter.com/tenderlove/status/108999110136303617
是的,没关系。需要清理它,但没有受到任何伤害。
【讨论】:
fyi,如果消息困扰您,作为一种解决方法,您可以使用 Thin(将gem 'thin'
添加到您的 gemfile,使用 rails server thin
启动您的服务器)。 (哎呀,刚刚注意到@Scott Lowe 已经在上面说过了。)
当这些事情被归入“没有受到伤害”的类别时,我觉得这很烦人。数以千计的人都在浪费时间弄清楚到底发生了什么,这一事实足以反驳这一点。
@KenThompson 问题出在 Webrick,而不是 Rails。 Webrick 不支持保持连接,因此会引发我们看到的警告/问题。建议您使用适当/更好的网络服务器(如瘦或独立的乘客)进行网络。即将发布的 Ruby 版本将解决此问题。
我们开发PC上的webrick服务器两次渲染同一个.js.erb文件。两次渲染问题在我们运行 nginx 的生产服务器上消失了。所以在我们这样的案例中,这是一个真正的问题。
答案应该包含推特帖子的内容而不是链接。【参考方案2】:
添加
config.middleware.use Rack::ContentLength
到您的application.rb
文件,即使使用 webrick,警告也会消失。这也将在渲染 json 或文本响应时在生产环境中正确设置 Content-Length
。
【讨论】:
我喜欢实际解决问题的想法,而不是用保活补丁隐藏它。不幸的是,这个建议只是发出了两倍的警告。【参考方案3】:这个问题已经在 Ruby 的主干分支中通过 commit 到 webrick 得到修复。
您可以在您的设置中类似地编辑这个特定的 webrick 文件。大致位置可通过以下方式找到:
gem which webrick
实际编辑文件:
nano \`ruby -e"print %xgem which webrick.chomp %Q.rb\n"\`/httpresponse.rb
(或者用你最喜欢的编辑器代替 nano。)
【讨论】:
我上面花哨的命令行(幽默地包括编辑器 nano)在 RailsRock 网站here 上被取消了署名并受版权保护。 反引号可能不应该被转义。所以它真的应该是:nano `ruby -e"print %xgem which webrick.chomp %Q.rb\n"`/httpresponse.rb
.【参考方案4】:
JRuby 版本:如果您使用的是 .rvm,请执行此操作以修复它...
正如 João Soares 和 Kjellski 所提到的,如果您想摆脱这个关于开发的警告并且您正在使用 JRuby,那么您可以这样做。 p>
使用您喜欢的编辑器打开此文件:
~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb
转到包含此内容的行(对我来说是第 205 行):
if chunked? || @header['content-length']
将其从this patch更改为:
if chunked? || @header['content-length'] || @status == 304 || @status == 204
保存文件并最终重新启动您的 Rails 服务器。
【讨论】:
@schwabsauce 除了第一条指令,其余的都不是 JRuby 特有的;它有助于找到文件。为了清楚起见,重复了其他说明。【参考方案5】:只需将 Gem 显式添加到 Gemfile 即可消除警告消息:
group :development do
gem 'webrick', '~> 1.3.1'
end
【讨论】:
是的,我也是。为什么这个工作的线索可能在Feature #5481 Gemifying Ruby standard library:“因为'fake gems','gem update'安装的stdlib的新文件是ignored,除非用户明确写gem ['webrick']。” 这比“忽略它”或“修补 webrick”要好得多。谢谢!【参考方案6】:如果您使用的是 .rvm,请执行此操作来修复它...
正如 João Soares 所提到的,所有功劳归于他,如果你不想摆脱这个关于开发的警告,你可以这样做。
使用您喜欢的编辑器打开此文件:
~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb
转到包含此内容的行(对我来说确实是第 206 行):
if chunked? || @header['content-length']
将其从this patch更改为:
if chunked? || @header['content-length'] || @status == 304 || @status == 204
保存文件并最终重新启动您的 Rails 服务器
【讨论】:
谢谢!对我来说是line 107
。【参考方案7】:
您也可以使用 Thin 代替默认的 Webrick。
将此添加到Gemfile
gem 'thin'
那么rails s thin
会使用thin,警告就会消失。
【讨论】:
是的。这就是我最近几个月所做的事情。 Ryan Bates 在最近的 Railscast 中也提到过。 @cam song:几乎正确:rails s thin 将使用 thin 而不是 Webrick,并且警告会消失。 我将thin
放入development
组。 Rails 4 似乎在运行 rails s
时自动拾取它【参考方案8】:
以下补丁解决了我的问题;不再向我发出警告。
204_304_keep_alive.patch
只需在第 205 行编辑文件 httpresponse.rb,如上面的链接所示;实际上,该链接显示了对 Ruby 未来版本的更正。
我在通过 RVM 作为单个用户安装的 ruby 1.9.3-p0 上使用 rails 3.2.0。所以我的位置是:
~/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpresponse.rb
要更改的文件的位置因安装类型、是否为 RVM、甚至是多用户或单用户而异,所以我只给出它的最后一部分:
.../ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpresponse.rb
我希望这对某人有所帮助。
编辑:这是 link 提交更改了 ruby 项目的主干分支中的相关行。
【讨论】:
我用的是debiansqueeze,apt安装了ruby 1.9.3p194版,还是出现这个问题。 Ruby 的日期为 2012-04-20,tenderlove 的补丁日期为 2011 年 12 月 13 日星期二 07:30:14,但这仍然会发生。 在 Debian Squeeze 上,RVM 安装的 Ruby 版本 1.9.3-p327 WEBrick 仍然给出这些有问题的警告。【参考方案9】:从 webrick 中删除违规行的另一种解决方法。它只是没那么有用:
cd `which ruby`/../../lib/ruby/1.9.1/webrick/ && sed -i '.bak' -e'/logger.warn/d' httpresponse.rb
(您可能需要sudo
)
【讨论】:
以上是关于“警告无法确定响应正文的内容长度”是啥意思。意思是我如何摆脱它?的主要内容,如果未能解决你的问题,请参考以下文章