“ WARN无法确定响应正文的内容长度。” 是什么意思,我该如何摆脱呢?


320

自从升级到Rails 3.1之后,我在开发日志中看到以下警告消息:

WARN无法确定响应正文的内容长度。设置响应的内容长度或设置Response#chunked = true

这是什么意思,我该如何删除?这是个问题吗?


1
同样,对我来说,这是通过JS进行远程调用时发生的。
蒂姆·巴斯

2
我今天升级到Ruby 1.9.3后就开始使用它。以前没看过。我认为这一定是由于Ruby 1.9.3中的WEBrick发生了变化...
Tyler Rick

50
这确实是一个WEBrick问题。同时,您可以将'thin'gem添加到Gemfile中,并用它代替WEBrick引导Rails,例如rails s thin; - 没有更多警告。
斯科特

Answers:


229

向Rails-Core的成员之一问了同样的问题:

https://twitter.com/luislavena/status/108998968859566080

答案是:

https://twitter.com/tenderlove/status/108999110136303617

是的,很好。需要清理,但没有受到伤害。


9
仅供参考,如果消息困扰您,则可以使用thin(添加gem 'thin'到gemfile中,使用来启动服务器rails server thin)作为解决方法。(哎呀,刚刚注意到@Scott Lowe已经在上面说了这一点。)
fearless_fool

280
将这些事情归类为“没有伤害”的类别时,我感到很烦。数千人都在浪费时间不得不弄清楚到底是怎么回事,这一事实足以引起人们的质疑。
Mark Fraser

16
@KenThompson的问题是Webrick,而不是Rails。Webrick不支持保持活动连接,因此会引发我们所看到的警告/问题。建议您使用适当/更好的Web服务器(例如瘦客户机或乘客独立服务器)进行Web。即将发布的Ruby版本将解决此问题。
路易斯·拉韦纳

3
我们的开发PC上的Webrick服务器两次渲染相同的.js.erb文件。两次渲染问题在运行nginx的生产服务器上消失了。因此,在像我们这样的情况下,这是一个真正的问题。
user938363 2012年

2
答案应包含Twitter帖子的内容,而不是链接。
Pedro Rolo

78

以下补丁解决了的问题;没有更多的警告给我。

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

我希望这对某人有帮助。

编辑:这是更改红宝石项目的主干分支中有关行的提交的链接


我使用的是debian squeeze,安装了ruby版本1.9.3p194,并且仍然会出现此问题。Ruby的日期为2012-04-20,Tenderlove的补丁程序的日期为2011年12月13日星期二,但仍会发生。
kristianp 2013年

在Debian挤压下,安装了RVM的Ruby版本1.9.3-p327 WEBrick仍会发出这些有问题的警告。
MarkDBlackwell 2013年

56

只是将Gem明确地添加到Gemfile中,为我摆脱了警告消息:

group :development do
  gem 'webrick', '~> 1.3.1'
end

5
是的,对我来说也是。这项功能起作用的线索可能出现在Feature#5481 Gemifying Ruby标准库中:“由于存在'fake gems',除非用户明确编写gem ['webrick'],否则'gem update'安装的stdlib的新文件将被忽略。 ”。
MarkDBlackwell

2
这比“忽略它”或“修补webrick”要好得多。谢谢!
nessur 2013年

54

您也可以使用Thin代替默认的Webrick。将此添加到Gemfile gem 'thin'

然后rails s thin会变薄,警告会消失。


是。这就是我最近几个月来所做的事情。Ryan Bates在最近的Railscast中也提到过。
Nate Bird

1
@cam歌曲:几乎正确:rails的Thin将使用Thin代替Webrick,并且警告将消失。
fearless_fool 2012年

1
我把thindevelopment组。Rails 4在运行时似乎会自动拾取它rails s
绘制

15

如果您使用的是.rvm,请执行此操作以对其进行修复...

正如JoãoSoares所提到的,所有功劳都归功于他,如果您不希望摆脱对发展的警告,这就是您可以做的。

  1. 使用您喜欢的编辑器打开此文件:

    ~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb
  2. 转到包含此内容的行(对我来说,这确实是第206行):

    if chunked? || @header['content-length']
  3. 将此补丁从此补丁更改为:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. 保存文件并最终重新启动Rails服务器


1
谢谢!是line 107给我的。
gbdev13 2013年

12

通过对Webrick的提交,该问题已在Ruby的主干分支中得到解决。

您可以在设置中类似地编辑此特定的webrick文件。大致位置可以通过以下方式找到:

gem which webrick

实际编辑文件:

nano \`ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"\`/httpresponse.rb

(或者使用您喜欢的编辑器代替nano。)


我上面上面的漂亮命令行(很高兴包括编辑人员nano)被取消了版权,但并未在此处的RailsRock网站上享有版权。
MarkDBlackwell

反引号可能不应该逃脱。因此它实际上应该是:nano `ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"`/httpresponse.rb
MarkDBlackwell,

5

JRuby版本:如果您使用的是.rvm,请执行此操作以对其进行修复...

正如提到的若昂·苏亚雷斯Kjellski,这就是,如果你想摆脱对发展这一警告的,你正在使用JRuby你可以做什么。

  1. 使用您喜欢的编辑器打开此文件:

    ~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb
  2. 转到包含此内容的行(对我来说是205行):

    if chunked? || @header['content-length']
  3. 将此补丁从此补丁更改为:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. 保存文件并最终重新启动Rails服务器。


@schwabsauce除了第一条指令,其余的都不是JRuby特定的。它有助于查找文件。为了清楚起见,重复其他说明。
Crimbo 2013年

3

另一个解决方法是从webrick中删除违规行。它不是那么有用:

cd `which ruby`/../../lib/ruby/1.9.1/webrick/ && sed -i '.bak' -e'/logger.warn/d' httpresponse.rb

(您可能需要sudo


3

config.middleware.use Rack::ContentLength

到您的application.rb文件,即使使用webrick,警告也会消失。Content-Length呈现json或文本响应时,这也将在生产中正确设置。


我喜欢真正解决问题而不是用keep-alive补丁隐藏它的想法。不幸的是,这个建议只发出了两倍的警告。
迷宫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.