Chrome, pdf-дисплей, Дублированные заголовки, полученные с сервера

У меня есть раздел на веб-сайте, где я показываю PDF внутри световой коробки. Недавнее обновление хром нарушило это отображение:

Ошибка 349 (net:: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): Получено несколько заголовков Content-Disposition. Это запрещено защищать от атак, отбрасывающих ответ HTTP.

Это все еще корректно работает в IE.

Я использую ASP.NET MVC3 на IIS6

Код, который я использую для создания файла, выглядит следующим образом.

Если я удалю оператор inline, тогда загрузка файла, тем не менее, нарушит функциональность лайтбокса.

Код ошибки

public FileResult PrintServices()
{
    //... unrelated code removed
    MemoryStream memoryStream = new MemoryStream();
    pdfRenderer.PdfDocument.Save(memoryStream);
    string filename = "ServicesSummary.pdf";

    Response.AppendHeader("Content-Disposition", "inline;");

    return File(memoryStream.ToArray(), "application/pdf", filename);
}

Исправление

Удалить

Response.AppendHeader("Content-Disposition", "inline;");

Затем измените

return File(memoryStream.ToArray(), "application/pdf", filename);

к

return File(memoryStream.ToArray(), "application/pdf");

Ответ 1

Решение выше хорошо, если вам не нужно указывать имя файла, но мы хотели сохранить имя файла по умолчанию, указанное для пользователя.

Наше решение оказалось тем же самым именем файла, что и некоторые запятые. Я заменил запятую на "", и файл теперь доставляет документ, как ожидалось, в Chrome.

FileName = FileName.Replace(",", "")

Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=" & FileName)    
Response.BinaryWrite(myPDF)

Ответ 2

Я использовал комментарий @roryok, обернув имя файла в кавычки:

Response.AddHeader("content-disposition", "attachment; filename=\"" + FileName + "\"")

Ответ на код с использованием одиночных кавычек недействителен в IE. Файл, загруженный одиночными кавычками, все еще находится в имени.

Ответ 3

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

Предыдущий, Chrome FAIL:

header("Content-Disposition: attachment; filename=$file");

Текущий, Chrome ОК:

header("Content-Disposition: attachment; filename='$file'");

Обратите внимание на цитаты вокруг $file.

Ответ 4

Моя проблема была вызвана двойной цитатой, как показано ниже:

var encoding = System.Text.Encoding.UTF8;

*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**\"{0}\"**", HttpUtility.UrlEncode(file, encoding)));*

Смена вышеперечисленного на это сработала!

*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**{0}**", HttpUtility.UrlEncode(file, encoding)));*

Ответ 5

чтобы исправить это для любого типа файла с пользовательским именем файла, удалите (или похожие заголовки)

Response.AppendHeader("Content-Disposition", "inline;");

и добавьте

string fileName = "myfile.xlsx"
return File(fileStream, System.Web.MimeMapping.GetMimeMapping(Path.GetFileName(filePath)), fileName);

вы также можете использовать путь к файлу вместо потока в первом параметре