Мне кажется, я тоже столкнулся с вашей проблемой.
Я также использую IIS 7.5 и загружаю PDF с помощью действия по запросу HTTPS. По причинам, которые мне еще предстоит выделить, IIS 7.5, кажется, добавляет no-cache="Set-Cookie"
к моему Cache-Control
заголовку ответа независимо от того, какие настройки кэша я установил в ответе. Это вызывало довольно хорошо задокументированную проблему no-cache
в IE6, IE7 и IE8 .
Чтобы решить эту проблему, я создал небольшую оболочку для FileContentResult, которая очистила заголовки, называлась родительской, а затем установила для Cacheability значение «Private». Это необязательное требование IIS 7.5 добавить no-cache="Set-Cookie"
к заголовку, и файл загружен правильно во всех протестированных мной браузерах. Если вы хотите подражать тому, что я сделал, во-первых, вот моя оболочка FileContentResult.
public class PdfContentResult : FileContentResult {
public PdfContentResult(byte[] data) : base(data, "application/pdf") { }
public PdfContentResult(byte[] data, string fileName) : this(data) {
if (fileName == null) {
throw new ArgumentNullException("fileName");
}
this.FileDownloadName = fileName;
}
public override void ExecuteResult(ControllerContext context) {
context.HttpContext.Response.ClearHeaders();
base.ExecuteResult(context);
context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.Private);
}
}
Затем я добавил метод расширения к своему ControllerExtensions
, чтобы было легко найти:
public static class ControllerExtensions {
public static PdfContentResult Pdf(this Controller controller, byte[] fileContents, string fileName) {
return new PdfContentResult(fileContents, fileName);
}
}
Наконец, в рамках действия я сделал эквивалент этого:
public ActionResult MyGeneratedPdf() {
byte[] myPdfContentInByteStream = GetPdfFromModel();
return this.Pdf(myPdfContentInByteStream, "MyFile.pdf");
}
Очевидно, что если вы загружаете все типы данных, возможно, вы не захотите так тесно связывать обходной путь с PDF.