IE6-8 не может загрузить файл с сайта HTTPS
У меня есть приложение MVC .Net, у которого есть действия, которые возвращают файлы отчетов, обычно:.xslx
byte[] data = GetReport();
return File(data,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"filename.xlsx");
Это прекрасно работает в тестировании и во всех браузерах, но когда мы помещаем это на сайт SSL, это не работает для IE6, 7 и 8 (все правильные браузеры все еще работают нормально) с этой бесполезной ошибкой:
Раньше это работало в устаревшем приложении (не-MVC), которое заменяет это действие.
Мы можем'Не говорите нашим пользователям что-либо менять локально - около 60% все еще работают на IE6!
Как я могу это исправить с помощью MVC?
ОбновитьДальнейшее копание показывает, что это фундаментальный сбой в IE6-8. В соответствии сЭрик ЛоуВнутренний блог IE это происходит потому, что во время соединения SSL IE рассматривает директиву no-cache как абсолютное правило. Таким образом, вместо того, чтобы не кэшировать копию, он считает, что отсутствие кэширования означает, что он не долженсохранить копию на диск невозможно, даже еслиContent-Disposition:attachment
и с явной подсказкой для местоположения загрузки.
Очевидно, что это неправильно, но покаисправлено в IE9 мывсе еще застрял со всеми пользователями IE6-8.
Используя MVC 'Атрибуты фильтра действия s создают следующие заголовки:
Cache-Control:no-cache, no-store, must-revalidate
Pragma:no-cache
Используя Fiddler, чтобы изменить их на лету, мы можем проверить заголовки, которые должны быть возвращены:
Cache-Control:no-store, no-cache, must-revalidate
Обратите внимание на порядокCache-Control
должен иметьno-store
до no-cache
и чтоPragma
директивадолжен быть полностью удаленным
Это проблема - мы используем MVC 'атрибуты действия экстенсивно, и я действительно нене хочу переписывать их с нуля. Даже если бы мы могли IIS выдает исключение, если вы пытаетесь удалитьPragma
директивы.
Как вы делаете Microsoft 's MVC и IIS возвращают директиву no-cache, которую Microsoft 's IE6-8 может обрабатывать под HTTPS? Я не хочу разрешать частное кэширование ответа (согласно этомуаналогичный вопрос) или игнорировать встроенные методы MVC с переопределением (согласно моему собственному ответу, который является моим лучшим хаком).