ConnectionDidFinishLoading, вызываемый до didReceiveData, с отправкой фотографий на рельсы

У меня есть веб-сайт rails 3.0.3, который в режиме разработки отвечает на HTTP GET, вызывая didReceiveData, а затем connectionDidFinishLoading, а данные фотографий отправляются с веб-сайта на iPhone и отображаются правильно. Но когда я запускаю веб-сайт rails 3.0.3 в производственном режиме на Amazon Web Services, connectionDidFinishLoading вызывается до didReceiveData. Я использую операторскую волну для обработки фотографий как для разработки, так и для производства рельсов.

Кто-нибудь знает, что может вызвать вызов connectionDidFinishLoading до didReceiveData?

Я пытался проверить следующее:

1) Я убедился, что NSURLConnectionDelegate вызывается для интерфейса класса.

2) didReceiveResponse не вызывается до подключенияDidFinishLoading и statusCode = 200.

3) В приложении rails я использую send_file для отправки данных фотографии, а путь к файлу, отправленному в производство, является реальной фотографией.

4) Проверка с полным запросом к веб-сайту показала, что с производственного веб-сайта возвращается 0 байт данных с использованием приведенного ниже кода в connectionDidFinishLoading (это оказалось причиной того, что didReceiveData не вызывался):

NSData *returnedData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://production_website"]];

Вот код для didReceiveData:

// theConnectionData is an instance variable defined as:

      NSMutableData  *theConnectionData = [[NSMutableData data] retain];


-(void)connection:(NSURLConnection *)con didReceiveData: (NSData *)data {

[theConnectionData   appendData:data ];

}

Обновление. Я думаю, что проблема может быть на стороне рельсов. Вот код, который я использую для отправки фотографии из приложения rails из локального хранилища на AWS в приложение для iPhone:

  @p       = Photo.find_by_user_id(user_id)
  uploader = @p.avatar
  uploader.retrieve_from_store!(File.basename(@p.avatar.url))
  uploader.cache_stored_file!

      send_file(uploader.file.path,
                :disposition   => 'inline',
                :encoding      => 'binary',
                :type          => @p.content_type,
                :stream        => false,
                :filename      => URI.encode(@p.filename),
                :x_sendfile    => true,
                :buffer_size   => 16384
                )

Кто-нибудь знает, почему didReceiveData не вызывается перед connectionDidFinishLoading для веб-сайта производства рельсов?


person James Testa    schedule 28.02.2012    source источник
comment
это должно работать.. но мы не можем проверить ваш код. Если вы можете предоставить код для didReceiveData.   -  person Inder Kumar Rathore    schedule 28.02.2012
comment
Обратите внимание, что didReceiveData вызывается разрабатываемой версией rails, но не вызывается рабочей версией rails.   -  person James Testa    schedule 28.02.2012
comment
можете ли вы дать адрес производственных веб-сайтов, чтобы я мог проверить ... и это может быть проблема на вашем сайте, а не в кодировании iphone   -  person Inder Kumar Rathore    schedule 28.02.2012
comment
в производственном режиме вызывается ли didReceiveData даже после connectionDidFinishLoading ? На самом деле сервер ничего не вызывает, это ваш NSURLConnection, который информирует своего делегата о своем статусе. Вы загружаете свои фотографии по одной? возможно, несколько журналов NSURLConnection перекрываются в консоли.   -  person teriiehina    schedule 28.02.2012
comment
Да, я загружаю фотографии по одной. Это интересная мысль, что запросы могут пересекаться. Но если бы они были, как могло бы вызвать connectionDidFinishLoading, а didReceiveData никогда не вызывается? Не вызовется ли вызов didReceiveData перед connectionDidFinishLoading для одной из фотографий?   -  person James Testa    schedule 01.03.2012


Ответы (1)


Я наконец-то понял. Комментирование следующего в config/environments/production.rb устранило проблему:

# config.action_dispatch.x_sendfile_header = "X-Sendfile"

Проблема также была устранена путем замены приведенной выше строки в config/environments/production.rb на следующую:

config.action_dispatch.x_sendfile_header = "X-Accel-Redirect"

Согласно этому сообщению это похоже, в Rails 3 были внесены некоторые изменения для send_file. В этом сообщении предлагается использовать X-Accel -Подход с перенаправлением, но в сообщении утверждается, что запрос затем отправляется из приложения rails, а не из nginx. В этом сообщении утверждается, что nginx требует X-Accel-Redirect подход.

person James Testa    schedule 02.03.2012