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ć?

Purvesh Desai
źródło
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;
    }
Bryan Roberts
źródło
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 + "\"");
tomc
źródło
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.

Deepak Agrawal
źródło
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} \ "");

user3578181
źródło
Ale w pobranej nazwie pliku jest podkreślenie.
Jamsheer
1

Podwójne cudzysłowy wokół nazwy pliku w nagłówku to standard w dokumentach internetowych MDN. Pominięcie cudzysłowów stwarza wiele możliwości problemów wynikających ze znaków w nazwie pliku.

Will Brownsberger
źródło