Повторяющиеся заголовки получены с сервера

119

Повторяющиеся заголовки получены с сервера

Ответ от сервера содержал повторяющиеся заголовки. Эта проблема обычно является результатом неправильно настроенного веб-сайта или прокси-сервера. Только администратор веб-сайта или прокси-сервера может решить эту проблему.

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

Я обнаружил эту ошибку при экспорте в pdf в Chrome.

Response.Buffer = false;
Response.ClearHeaders();
string ext = objProp.PACKAGEFILENAME.Substring(objProp.PACKAGEFILENAME.LastIndexOf("."));
string ext1 = ext.Substring(1);
Response.ContentType = ext1;
Response.AddHeader("Content-Disposition", "target;_blank,attachment; filename=" + objProp.PACKAGEFILENAME);
const int ChunkSize = 1024;
byte[] binary = objProp.PACKAGEDOCUMENT;
System.IO.MemoryStream ms = new System.IO.MemoryStream(binary);
int SizeToWrite = ChunkSize;

for (int i = 0; i < binary.GetUpperBound(0) - 1; i = i + ChunkSize)
{
    if (!Response.IsClientConnected) return;
    if (i + ChunkSize >= binary.Length) SizeToWrite = binary.Length - i;
    byte[] chunk = new byte[SizeToWrite];
    ms.Read(chunk, 0, SizeToWrite);
    Response.BinaryWrite(chunk);
    Response.Flush();
}
Response.Close();

Как это исправить?

Пурвеш Десаи
источник
18
Я также обнаружил, что запятая в имени файла дает эту ошибку (только в Chrome). Я думаю, должен быть способ сказать ему, что имя файла = "abc, xyz.pdf" действительно. Я понимаю, что мы можем заменить "," чем-то другим, но я хочу сохранить и вернуть имя файла в точности таким, как оно есть. Ни в одном из других браузеров (IE, FireFox, Safari, Opera), которые я пробовал, не возникало этой проблемы.
cusman
29
Таким образом, есть способ оставить в имени файла запятые. Просто нужно указать имя файла. Response.AddHeader("content-disposition", "attachment; filename=\"" + FileNameWithCommas + "\"");
cusman
3
Спасибо @cusman. Это была моя проблема - запятая в имени файла, И только у Chrome была проблема с этим.
PeterKA

Ответы:

236

Это немного старовато, но занимало высокое место в рейтинге Google, поэтому я подумал, что добавлю ответ, который я нашел из Chrome, отображение pdf, повторяющиеся заголовки, полученные с сервера

В основном моя проблема также заключалась в том, что имя файла содержало запятые. Замените запятые, чтобы удалить их, и все будет в порядке. Моя функция для создания действительного имени файла приведена ниже.

    public static string MakeValidFileName(string name)
    {
        string invalidChars = Regex.Escape(new string(System.IO.Path.GetInvalidFileNameChars()));
        string invalidReStr = string.Format(@"[{0}]+", invalidChars);
        string replace = Regex.Replace(name, invalidReStr, "_").Replace(";", "").Replace(",", "");
        return replace;
    }
Брайан Робертс
источник
22
Из комментария @roryok к связанному ответу кавычки вокруг имени файла должны решить проблемы. И на самом деле в спецификации, кажется, сказано, что имя файла должно быть указано в кавычках.
Touko
Кавычки могут помочь (и их следует добавить), но у этой функции есть дополнительное преимущество, заключающееся в том, что они удаляют недопустимые символы, так что в конце вы делаете более дружелюбное имя.
Брайан Робертс
@Younisbarznji, у меня это сработало, вам нужно избегать кавычек в имени файла
coffekid
3
Меня устраивает! Запятые и пробелы в именах файлов не подходят!
Hugo
Почему .Replace(";", "").Replace(",", "")при уже замене на RegEx? Добавьте ;,в свой шаблон string invalidReStr = string.Format(@"[{0};,]+", invalidChars); string replace = Regex.Replace(name, invalidReStr, "_");
SBF
97

Серверу СЛЕДУЕТ заключать имя файла в двойные кавычки, как указано @cusman и @Touko в их ответах.

Например:

Response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");
tomc
источник
Я также заменил любые двойные кавычки в имени файла знаками подчеркивания.
Peter L
Я сделал то же самое, здесь также получил имя файла с подчеркиванием.
Джамшир
5

Для меня проблема заключалась в запятой не в имени файла, а как показано ниже: -

Response.ok (streamingOutput, MediaType.APPLICATION_OCTET_STREAM_TYPE) .header ("расположение содержимого", " вложение, имя файла = имя_вашего_файла»). Build ();

Я случайно поставил запятую после прикрепления. Решил, заменив запятую точкой с запятой.

Дипак Агравал
источник
3

Просто заключите имя файла в двойные кавычки, например:

this.Response.AddHeader ("Content-disposition", $ "attachment; filename = \" {outputFileName} \ "");

user3578181
источник
Но в загруженном имени файла есть символ подчеркивания.
Джамшир
1

Двойные кавычки вокруг имени файла в заголовке являются стандартом для веб-документов MDN. Отсутствие кавычек создает множество возможностей для проблем, возникающих из-за символов в имени файла.

Уилл Браунсбергер
источник