Zduplikowane nagłówki odebrane z serwera


119

Zduplikowane nagłówki odebrane z serwera

Odpowiedź z serwera zawierała zduplikowane nagłówki. Ten problem jest zwykle wynikiem nieprawidłowo skonfigurowanej witryny internetowej lub serwera proxy. Tylko administrator serwisu WWW lub proxy może rozwiązać ten problem.

Błąd 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): Otrzymano wiele różnych nagłówków Content-Disposition. Jest to niedozwolone w celu ochrony przed atakami polegającymi na dzieleniu odpowiedzi HTTP.

Znalazłem ten błąd podczas eksportowania do pdf w 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();

Jak to naprawić?


18
Odkryłem również, że przecinek w nazwie pliku spowoduje ten błąd (tylko w Chrome). Myślę, że musi istnieć sposób, aby powiedzieć, że nazwa_pliku = "abc, xyz.pdf" jest prawidłowa. Rozumiem, że możemy zastąpić znak „,” czymś innym, ale chcę zachować i zwrócić nazwę pliku dokładnie tak, jak jest. Żadna z innych przeglądarek (IE, FireFox, Safari, Opera), których próbowałem, nie ma tego problemu.
— cusman

29
Jest więc sposób, aby nadal mieć przecinki w nazwie pliku. Wystarczy zacytować nazwę pliku. Response.AddHeader("content-disposition", "attachment; filename=\"" + FileNameWithCommas + "\"");
— cusman,

3
Dzięki @cusman. To był dokładnie mój problem - przecinek w nazwie pliku ORAZ tylko Chrome miał z tym problem.
— PeterKA

Odpowiedzi:


236

Ten trochę stary, ale był wysoko w rankingu Google, więc pomyślałem, że wrzucę odpowiedź, którą znalazłem z Chrome, wyświetlacz pdf, zduplikowane nagłówki otrzymane z serwera

Zasadniczo moim problemem było również to, że nazwa pliku zawierała przecinki. Zastąp przecinki, aby je usunąć i wszystko powinno być w porządku. Poniżej znajduje się moja funkcja tworzenia prawidłowej nazwy pliku.

    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
Z komentarza @roryok w połączonej odpowiedzi, cudzysłowy wokół nazwy pliku powinny rozwiązać problem. W rzeczywistości specyfikacja wydaje się mówić, że nazwa pliku powinna być cytowana.
— Touko

Cudzysłowy byłyby pomocne (i powinny być dodane), ale ta funkcja ma dodatkową zaletę polegającą na usuwaniu nieprawidłowych znaków, dzięki czemu na końcu tworzysz bardziej przyjazną nazwę.
— Bryan Roberts

@Younisbarznji to zadziałało dla mnie, musisz uciec od cytatów w nazwie pliku
— coffekid

3
Mi to pasuje! Przecinki i spacje nie są dobrym pomysłem w nazwach plików!
— Hugo

Dlaczego .Replace(";", "").Replace(",", "")już zastępując RegEx? Dodaj ;,do wzoru RegEx:string invalidReStr = string.Format(@"[{0};,]+", invalidChars); string replace = Regex.Replace(name, invalidReStr, "_");
— SBF

97

Serwer POWINIEN umieścić nazwę pliku w podwójne cudzysłowy, o czym wspominali @cusman i @Touko w swoich odpowiedziach.

Na przykład:

Response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");

Zastąpiłem również wszelkie podwójne cudzysłowy w nazwie pliku podkreśleniami.
— Peter L

Zrobiłem to samo, tutaj również otrzymałem nazwę pliku z podkreśleniami.
— Jamsheer

5

U mnie problem dotyczył przecinka nie w nazwie pliku ale jak poniżej: -

Response.ok (streamingOutput, MediaType.APPLICATION_OCTET_STREAM_TYPE) .header ("dyspozycja zawartości", " załącznik, nazwa_pliku = twoja_nazwa_pliku"). Build ();

Przypadkowo wstawiłem przecinek po załączniku. Rozwiązałem to, zastępując przecinek średnikiem.


3

Po prostu umieść dwa podwójne cudzysłowy wokół nazwy pliku w następujący sposób:

this.Response.AddHeader ("Dyspozycja zawartości", $ "załącznik; nazwa_pliku = \" {nazwa_pliku_wyjściowego} \ "");


Ale w pobranej nazwie pliku jest podkreślenie.
— Jamsheer

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.