Как отобразить вложение PDF в IE6 - PullRequest
1 голос
/ 24 февраля 2010

У меня есть приложение ASP.net, которое возвращает двоичный файл PDF (сохраненный из базы данных, которая была ранее загружена) клиенту.

Код, который у меня есть, отлично работает для всех браузеров, кроме Internet Explorer 6 (история моей жизни!). В IE6, когда пользователь нажимает кнопку «Открыть», Adobe сообщает об ошибке: «Произошла ошибка при открытии этого документа. Файл не найден».

Когда пользователь нажимает кнопку «Сохранить», файл PDF отлично сохраняется и его можно открыть, дважды щелкнув его. Я в тупике. Google предложил варианты кэширования (настройка cachecontrol на private и т. Д.), И я попробовал все это, но ничего не помогло.

Странное поведение (er) - когда я с нуля создаю PDF на своем уровне сервера ASP .net (используя NFop), IE прекрасно его открывает (используя тот же код!).

Вот мой код для отправки двоичных данных по проводам:

    // Firefox doesn't like spaces in filenames.
    filename = filename.Replace(" ", "_");

    string extension = Path.GetExtension(filename);

    string contentType;

    switch (extension)
    {
        case "pdf":
            contentType = "application/pdf";
            break;
        default:
            contentType = "application/x-unknown";
            break;
    }

    context.Response.Clear();
    context.Response.AddHeader("content-disposition", "attachment;filename=" + filename);
    context.Response.Charset = "";
    context.Response.ContentType = contentType;
    context.Response.BinaryWrite(data);
    context.Response.Flush();

Вот версии приложения:

  • ASP .net 3.5
  • IE6.0.2900.2180.xpsp_s
  • Элемент списка
  • p2_gdr.091208-2028
  • Adobe Reader версия 8.0.0
  • Windows XP SP 2
  • SQL Server 2008

Любая помощь / предложения будут высоко оценены. Спасибо :)

РЕДАКТИРОВАТЬ:

Я подключил Fiddler для просмотра заголовков и, конечно же, это похоже на проблему с кэшированием. гррр!

Когда загружается мой NFop PDF (тот, который работает), он отправляет cache-control = private. При загрузке моего вложения PDF (тот, который не работает), он отправляет без кэширования.

Я посмотрел в объекте Response, и оба они имеют одинаковые заголовки при вызове context.Response.Flush ().

Все еще в тупике!

решаемые

Где-то в нашей структуре был мошеннический метод, который вызывался с помощью отражения:

/// /// Устанавливает истечение срока действия запроса и не вызывает кеш /// Защищенный void SetCacheExpiration (контекст HttpContext) { // устанавливает срок действия кэша немедленно context.Response.Cache.SetCacheability (HttpCacheability.NoCache); context.Response.Cache.SetSlidingExpiration (истина); context.Response.Cache.SetExpires (DateTime.Now); context.Response.Cache.SetMaxAge (new TimeSpan (0, 0, 0)); context.Response.Cache.SetNoStore (); context.Response.Cache.SetAllowResponseInBrowserHistory (ложь); context.Response.Cache.SetValidUntilExpires (ложный); context.Response.Cache.SetRevalidation (HttpCacheRevalidation.AllCaches);

}

Спасибо за вашу помощь, кеширование! Интересно, что единственным браузером, который фактически не кэшировал загрузку (при открытии), был IE6.

Ответы [ 2 ]

1 голос
/ 24 февраля 2010

Здесь метод, который я использовал ранее для рендеринга PDF-файлов в браузере для IE6. Опять же ... это было для проекта, в котором мы показали PDF в браузере, но он должен хорошо служить вам для PDF, который отображается в ридере.

0 голосов
/ 24 февраля 2010

Где-то в наших рамках был мошеннический метод, который вызывался с использованием отражения:

    /// <summary>
    /// Sets the expiratoin of the request and force no cache
    /// </summary>
    protected void SetCacheExpiration(HttpContext context)
    {
        //sets the cache to expire immediately
        context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        context.Response.Cache.SetSlidingExpiration(true);
        context.Response.Cache.SetExpires(DateTime.Now);
        context.Response.Cache.SetMaxAge(new TimeSpan(0, 0, 0));
        context.Response.Cache.SetNoStore();
        context.Response.Cache.SetAllowResponseInBrowserHistory(false);
        context.Response.Cache.SetValidUntilExpires(false);
        context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);

    }

Спасибо за вашу помощь, кеширование! Интересно, что единственным браузером, который фактически не кэшировал загрузку (при открытии), был IE6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...