Загрузка PDF с сервера Firefox/Chrome

У меня есть Windows 2008 R2 (виртуальный) сервер, на котором работает несколько веб-сайтов. Мой клиент загрузил несколько файлов PDF по FTP в каталог загрузки, откуда их можно получить через веб-страницу.

Это прекрасно работает в IE и Safari, но при попытке загрузки с Firefox или Chrome оба браузера зависают, а сообщения Firefox "останавливаются" в строке состояния в нижней части страницы. Мы пробовали это на нескольких ПК в разных местах, поэтому я думаю, что это может быть проблема с сервером - хотя, возможно, программное обеспечение, используемое для создания PDF-файлов, могло создать что-то несовместимое с потоковой передачей в Firefox/Chrome.

Почему могут быть причины для такого поведения? Есть ли какие-то настройки, которые мне нужно изменить?

РЕДАКТИРОВАТЬ: Проверенные заголовки с Firebug - GET палочки с частичным содержанием 206

Content-Type    application/pdf
Last-Modified   Sun, 21 Mar 2010 19:50:49 GMT
Accept-Ranges   bytes
Etag    "42da4bce2fc9ca1:0"
Server  Microsoft-IIS/7.5
X-Powered-By    ASP.NET
Date    Thu, 27 May 2010 15:39:34 GMT
Content-Length  329532
Content-Range   bytes 27484-357015/357016
Request Headersview source
Host    www.caepost.co.uk
User-Agent  Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language en-gb,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  115
Connection  keep-alive
Range   bytes=27484-357015,27484-27485

4 ответа

IIS версии 7.5 изменил способ, которым он отвечает на запросы диапазона байтов, такие как сделанные плагином Acrobat. Если запрос направлен на один непрерывный диапазон, IIS теперь отвечает заголовком "Content-Range", а не заголовком "ContentType: multipart/byteranges", который на самом деле является действительным HTTP, но это сбивает с толку плагин Acrobat.

Adobe в настоящее время работает над исправлением: http://kb2.adobe.com/cps/807/cpsid_80780.html

А тем временем Microsoft предоставила исправление, чтобы IIS 7.5 вернулся к старому поведению: http://support.microsoft.com/kb/979543

Мы обновили серверы, и IIS 7.5 дал нам ту же проблему. Проверил заголовки и подтвердил проблему.

Установил исправление http://support.microsoft.com/kb/979543 но это не решило проблему. Я думаю, что разница здесь в том, что наш сайт работал в классическом режиме. (Пришлось сделать это для другого установленного продукта (Imis)). Таким образом, кажется, исправление работает, только если ваш сайт работает в интегрированном режиме.

В конце мне пришлось написать обработчик для перехвата запросов в формате pdf и изменения заголовка ответа.

context.Response.ContentType = "application/pdf";
context.Response.TransmitFile(filePath);
context.Response.End();

Это добилось цели.

Симптомы не ограничивались только тем, что Акробат открыл документы. В нашем случае Google Chrome также зависал, когда пытался открыть PDF, независимо от того, какой у вас PDF-ридер.

Можете ли вы опубликовать отправляемые заголовки ответа?

Панель Firebug Net:
альтернативный текст

Просмотр заголовков:
альтернативный текст

Это может быть связано с настройками сжатия в IIS 7.0.

Заголовок запроса содержит следующее:

Accept-Encoding: gzip,deflate

чтобы указать, что браузер принимает сжатый контент.

Когда вы используете:

context.Response.TransmitFile(filePath);

IIS просматривает установленный тип содержимого и решает, следует ли сжимать ответ.

К сожалению IIS, кажется, не добавляет

Content-Encoding: gzip

в заголовок Response, что означает, что Firefox и Chrome не могут определить, сжаты данные или нет.

Отключение сжатия контента в IIS должно исправить это, но повлияет на весь сайт. Также предложение установки типа контента может работать в некоторых обстоятельствах. IIS 7 решает, следует ли сжимать ответ на основе MIME-типа.

http://www.iis.net/configreference/system.webserver/httpcompression приводит следующий пример настройки httpCompression в файле ApplicationHost.config:

<httpCompression
      directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
   <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
   <dynamicTypes>
      <add mimeType="text/*" enabled="true" />
      <add mimeType="message/*" enabled="true" />
      <add mimeType="application/javascript" enabled="true" />
      <add mimeType="*/*" enabled="false" />
   </dynamicTypes>
   <staticTypes>
      <add mimeType="text/*" enabled="true" />
      <add mimeType="message/*" enabled="true" />
      <add mimeType="application/javascript" enabled="true" />
      <add mimeType="*/*" enabled="false" />
   </staticTypes>
</httpCompression>

Другой вариант - убедиться, что Content-Encoding: gzip всегда добавляется в заголовок Response, но вам нужно быть осторожным, чтобы убедиться, что ответ действительно будет сжат, что может быть не для всех типов контента.

Другие вопросы по тегам