【问题标题】:Webrick/Rails - Timeout Error after sending POST requestWebrick/Rails - 发送 POST 请求后超时错误
【发布时间】:2014-04-02 07:32:13
【问题描述】:

我正在开发一个 Redmine 插件,我创建了一个方法,我发送 2 个 HTTP POST 请求以将文件附加到文档。

执行第一个请求后,我得到一个Timeout::Error (Timeout::Error),虽然请求已经成功完成,但这是来自Webrick的错误代码

Timeout::Error (Timeout::Error): 
/usr/local/lib/ruby/1.9.1/net/protocol.rb:146:in `rescue in rbuf_fill' 
/usr/local/lib/ruby/1.9.1/net/protocol.rb:140:in `rbuf_fill' 
/usr/local/lib/ruby/1.9.1/net/protocol.rb:122:in `readuntil' 
/usr/local/lib/ruby/1.9.1/net/protocol.rb:132:in `readline' 
/usr/local/lib/ruby/1.9.1/net/http.rb:2562:in `read_status_line' 
/usr/local/lib/ruby/1.9.1/net/http.rb:2551:in `read_new' 
/usr/local/lib/ruby/1.9.1/net/http.rb:1319:in `block in transport_request'  
/usr/local/lib/ruby/1.9.1/net/http.rb:1316:in `catch' 
/usr/local/lib/ruby/1.9.1/net/http.rb:1316:in `transport_request' 
/usr/local/lib/ruby/1.9.1/net/http.rb:1293:in `request' rest-client (1.6.7) lib/restclient/net_http_ext.rb:51:in `request' 
/usr/local/lib/ruby/1.9.1/net/http.rb:1286:in `block in request' 
/usr/local/lib/ruby/1.9.1/net/http.rb:745:in `start' 
/usr/local/lib/ruby/1.9.1/net/http.rb:1284:in `request'
...
...
Started POST "/uploads.json?attachment_id=1&filename=testFile.txt" for <server_IP_address> at 2014-04-02 09:15:28 +0200 
Processing by AttachmentsController#upload as JSON 
Parameters: {"attachment_id"=>"1", "filename"=>"testFile.txt"} 
Current user: <user> (id=3) 
Saving attachment '/home/user/Redmine/redmine-2.4.2/files/2014/04/140402091528_testFile.txt' (72 bytes) 
Rendered attachments/upload.api.rsb (1.7ms) 
Completed 201 Created in 87.9ms (Views: 7.9ms | ActiveRecord: 11.4ms)

您可以看到我在响应中得到了 201 状态,因此它起作用了,但是我有这个超时错误并且执行在那里停止。

这是我的代码:

uri = URI.parse("http://<server_IP_address>:3000/uploads.json")

http = Net::HTTP.new(uri.host, uri.port)
@file = File.new("/home/testFile.txt")
@csrfToken = session[:_csrf_token]

request = Net::HTTP::Post.new(@uri.path+"?attachment_id=1&filename=testFile.txt", initheader = {'Content-Type' => "application/octet-stream", 'X-CSRF-Token' => @csrfToken, 'X-Redmine-API-Key' => "my_key"})
request.body = @file.read
@response = http.request(request)

@upToken = @response.body

@secondResponse = RestClient.post 'http://<server_IP_address>:3000/documents/150/add_attachment', {:multipart => true, :utf8 => "\u2713", :authenticity_token => @csrfToken, :attachment => { "1" => {:filename => "testFile.txt", :description => "Dropbox blabla", :token => @upToken}}, :commit => "Add"}, :'X-Redmine-API-Key' => "mykey"

我也尝试过使用 Apache Web 服务器,第一个请求运行良好,我只在 Webrick 服务器上运行 Redmine 时遇到了这个问题。

你知道这个错误是从哪里来的吗?我该如何摆脱它?

【问题讨论】:

  • 希望我能帮上忙——我唯一能说的是这个错误将与 WebBrick 相关联,但除此之外我还需要了解它
  • 网络超时错误是指服务器处理您的请求所花费的时间超过了指定的超时间隔。应该有一个配置选项来指定它。在独角兽中,您可以将超时间隔指定为所需的值。但是,具有更长的超时间隔意味着您的应用程序对用户来说很慢。我建议您将这类请求的处理放到后台作业中。
  • 把这些请求放在后台是个好主意,我要试试这个。

标签: ruby-on-rails ruby http webrick redmine-plugins


【解决方案1】:

您需要做的是您需要更改 webrick 服务器中的请求超时值,以便检查此问题的答案: how to set request timeout in rails ( thin or webrick server)

【讨论】:

  • 我看到这篇文章并试图改变这个值,但它并没有解决问题。这是一个“小”请求,执行速度非常快,因此不应该成为问题。此外,当它在 Apache Web 服务器上运行时,不到 10 秒,并且运行良好。
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 2021-01-14
  • 2019-08-10
相关资源
最近更新 更多