Сбой ASP.Net MVC FilePathResult в IE - PullRequest
0 голосов
/ 02 февраля 2010

У меня есть действие контроллера, которое возвращает документ PDF. В зависимости от переменной переключения сайта он выберет один из нескольких исходных файлов, переименует его и вернет в браузер. Это прекрасно работает в Chrome и Firefox, но в IE8 появляется диалоговое окно загрузки, а затем появляется следующее сообщение об ошибке ...

"Internet Explorer не может загрузить FullTermsAndConditions от www.mydomain.com.

Internet Explorer не смог открыть этот интернет-сайт. Запрашиваемый сайт либо недоступен, либо не может быть найденный. Пожалуйста, попробуйте позже. "

Это мой код ...

public ActionResult FullTermsAndConditions()
{
  var targetFileName = LookupTargetFileName();
  var fullPath = System.IO.Path.Combine(DownloadsPath, LookupSourceFileName());
  var result = File(fullPath, "application/pdf");
  result.FileDownloadName = targetFileName;

  return result;
}

Кто-нибудь может увидеть, что я сделал не так?


Дополнительная информация ...

Я добавил следующий код в мой контроллер для просмотра заголовков ...

protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
  base.OnResultExecuted(filterContext);

  WriteResponseHeadersToFile(@"C:\temp\ResponseHeaders.txt", filterContext.HttpContext.Response);
}

private static void WriteResponseHeadersToFile(string fileName, System.Web.HttpResponseBase response)
{
  using (StreamWriter writer = new StreamWriter(fileName, true))
  {
    writer.Write("Reponse started @ ");
    writer.WriteLine(DateTime.Now.ToShortTimeString());

    var allHeaders = response.Headers;

    for (int i = 0; i < allHeaders.Count; i++)
      writer.WriteLine("{0} = {1}", allHeaders.Keys[i], allHeaders[i]);

    writer.Close();
  }
}

Это был результат ...

Отклик начался @ 09: 02
Сервер = Microsoft-IIS / 7.0
X-AspNetMvc-Version = 1.0
Content-Disposition = вложение; filename = "Полные условия.pdf"

1 Ответ

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

Успех!

Проблема связана с кэшированием на стороне клиента. Один из классов моего родительского контроллера имел следующий код (в попытке остановить возвращение пользователя после выхода из системы) ...

protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
  base.OnResultExecuted(filterContext);

  Response.Buffer = true;
  Response.Cache.SetCacheability(HttpCacheability.NoCache);
  Response.ExpiresAbsolute = DateTime.Now.AddDays(-1d);
  Response.Expires = -1500;
  Response.Cache.SetETag(DateTime.Now.Ticks.ToString());
}

Если в IE8 загружаемый файл не может быть открыт в браузере, он попытается сохранить временную копию. Это является нарушением заголовка без кэширования. Удаление этого заголовка решает проблему.

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