C # BinaryWrite через SSL

Я пытаюсь ответить клиенту PDF-файлом, хранящимся в поле MSSQL varbinary (MAX). Ответ работает на моем локальном хосте и тестовом сервере через соединение http, но не работает на производственном сервере через соединение https. Я использую только простой BinaryWrite (код ниже).

    byte[] displayFile = DatabaseFiles.getPdfById(id);

    Response.ContentType = "application/pdf";
    Response.BinaryWrite(displayFile);

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

Изменить: По не работает, я имею в виду, что я получаю пустой документ в браузере. Acrobat не загружается в браузер.

Изменить: Я только что заметил, что эта проблема возникает только в IE 7. PDF-файл корректно загружается в Firefox 3. Наш клиент использует исключительно IE 7 (лучше, чем IE 6, который я убедил их обновить с ... LOL).

Изменить: Попытка добавить заголовок «расположение содержимого», чтобы файл действовал как вложение. Не удалось загрузить браузер по протоколу SSL с ошибкой IE «Internet Explorer не может загрузить displayFile.aspx с ProductionServer.net». (Код ниже)

    byte[] displayFile = DatabaseFiles.getPdfById(id);
    Response.Clear();
    Response.AddHeader("content-disposition", String.Format("attachment;filename={0}", fileName));
    Response.ContentType = "application/pdf";
    Response.BinaryWrite(displayFile);

Редактировать: если файл просматривается по протоколу http на производственном сервере, браузер отображает код PDF-файла так же, как он просматривался через Блокнот. (например,% PDF-1,4% - 6 0 obj <> endobj xref 6 33 ... и т. д.)

10.12.2008 15:53:01
Определить "не работает". Исключения? Неверный вывод?
Mark Brackett 10.12.2008 15:57:03
Проверьте редактирование в вопросе для ответа.
Eddie 10.12.2008 16:11:10
6 ОТВЕТОВ
РЕШЕНИЕ

Мне просто удалось обойти это, заменив

Response.Clear();

с

Response.ClearContent();
Response.ClearHeaders();

так что все выглядит так:

byte[] downloadBytes = doc.GetData();
Response.ClearContent();
Response.ClearHeaders();

Response.Buffer = true;
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Length", downloadBytes.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=myFile.pdf");
Response.BinaryWrite(downloadBytes);
Response.Flush();
Response.End();
8
18.02.2009 16:42:15
Спасибо. Это сработало и для меня, оказалось, что вы должны использовать Response.BinaryWrite. Другие (Transmitfile, outputtream.write, writefile) не работали.
Cerveser 22.02.2012 10:09:10
На самом деле ключом к этому ответу является заголовок Content-Length. У меня была проблема с BinaryWrite с docx, пока я не добавил заголовок, чтобы явно указать размер содержимого.
Roman 11.02.2013 23:23:02
Сначала это не сработало, но после копирования настроек это сработало. Я думаю, что ключом в моем случае был Response.AddHeader («Content-Length», ...
Lukas 19.03.2014 15:02:39

Я столкнулся с той же проблемой пару лет назад. Решение, которое мы нашли, было не самым красивым. Мы записали файл на диск и сделали Response.Redirect на него.

0
10.12.2008 21:42:11

Можете ли вы использовать Wireshark (или аналогичный), чтобы увидеть, что происходит с клиентом?

0
10.12.2008 16:13:39
Какие данные в Wireshark я ищу? Я вижу первый запрос по протоколу TLSv1. У меня есть инструмент, но я не знаю, как разобраться в результатах. Спасибо.
Eddie 10.12.2008 16:19:47
Fiddler, вероятно, будет лучше для такого рода вещей.
Mark Brackett 10.12.2008 17:08:55
Только что опубликовал необработанный запрос от Fiddler
Eddie 10.12.2008 18:13:40

В IE 7 была / была проблема типа mime с PDF, связанная с запутанными правилами типа mime . Вы можете проверить, есть ли у клиента этот патч.

Также были единичные жалобы на пустые страницы IE 7 по другим причинам (среди них теги script, response.flush и keepalive), которые, AFAIK, не были надежно решены.

К счастью, это звучит так, как будто это происходит каждый раз, так что вы должны довольно быстро разобраться в этом.

Вы можете попробовать связать .pdf с ASP.NET, чтобы IE воспринимал URL как файл PDF. Это должно перевесить проблему типа пантомимы.

Перенаправления (HTTP Response.Redirect, Javascript на основе и ссылки), кажется, помогают некоторые другие проблемы.

Проверка настроек поддержки активности IIS на рабочем сервере или просмотр с помощью Fiddler покажет вам, являются ли сообщения поддержки активности проблемой.

Может быть, добавление заголовка размещения контента помогло бы ... Хотя это не в моей голове.

Я предполагаю, что отношение SSL - это красная сельдь, поэтому я бы проверил также и не-SSL на производственном сервере.

1
10.12.2008 17:22:45

Вот необработанный запрос в Fiddler

GET /displayFile.aspx?id=128 HTTP/1.1
Accept: */*
Accept-Language: en-us
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618)
Host: ProductionServer.net
Connection: Keep-Alive

Изменить: Вот необработанные заголовки ответа, как показано в Fiddler

HTTP/1.1 200 OK
Date: Wed, 10 Dec 2008 18:39:54 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/pdf; charset=utf-8
Content-Length: 102076
0
10.12.2008 18:45:11
Кстати, вы должны перенести этот пост в свой вопрос
G. Stoynev 8.09.2016 17:20:16

Столкнулся с той же проблемой. Также только с IE. Исправил мой, удалив <%@ OutputCache Location="None" %>со страницы .aspx. Это, возможно, объясняет, почему Response.ClearHeadersзвонок работал выше.

1
17.12.2011 18:27:06