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.