Загрузка 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, но вам нужно быть осторожным, чтобы убедиться, что ответ действительно будет сжат, что может быть не для всех типов контента.