Intestazioni duplicate ricevute dal server


119

Intestazioni duplicate ricevute dal server

La risposta dal server conteneva intestazioni duplicate. Questo problema è generalmente il risultato di un sito Web o proxy configurato in modo errato. Solo l'amministratore del sito Web o del proxy può risolvere questo problema.

Errore 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): più intestazioni distinte Content-Disposition ricevute. Ciò non è consentito per proteggere dagli attacchi di suddivisione della risposta HTTP.

Ho trovato questo errore durante l'esportazione in pdf in 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();

Come risolvere questo problema?


18
Ho anche scoperto che la virgola nel nome del file darà quell'errore (solo in Chrome). Penso che ci debba essere un modo per dirgli che il nome del file = "abc, xyz.pdf" è valido. Capisco che possiamo sostituire "," con qualcos'altro, ma voglio preservare e restituire il nome del file esattamente così com'è. Nessuno degli altri browser (IE, FireFox, Safari, Opera) che ho provato ha questo problema.
cliente

29
Quindi c'è un modo per lasciare che abbia ancora virgole nel nome del file. Basta citare il nome del file. Response.AddHeader("content-disposition", "attachment; filename=\"" + FileNameWithCommas + "\"");
cliente

3
Grazie @cusman. Questo era esattamente il mio problema: una virgola nel nome del file E solo Chrome aveva un problema con quello.
PeterKA

Risposte:


236

Questo è un po 'vecchio ma era in cima alla classifica di Google, quindi ho pensato di inserire la risposta che ho trovato da Chrome, visualizzazione pdf, intestazioni duplicate ricevute dal server

Fondamentalmente il mio problema era anche che il nome del file conteneva virgole. Sostituisci le virgole per rimuoverle e dovresti stare bene. La mia funzione per creare un nome file valido è sotto.

    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
Dal commento di @roryok alla risposta collegata, le virgolette attorno al nome del file dovrebbero risolvere i problemi. E in realtà le specifiche sembrano dire che il nome del file dovrebbe essere citato.
Touko

Le virgolette sarebbero un aiuto (e dovrebbero essere aggiunte) ma questa funzione ha l'ulteriore vantaggio di eliminare i caratteri non validi in modo da creare un nome più amichevole alla fine.
Bryan Roberts

@Younisbarznji ha funzionato per me, devi evitare le virgolette nel nome del file
coffekid

3
Per me funziona! Le virgole e gli spazi non sono una buona idea nei nomi dei file!
Hugo

Perché .Replace(";", "").Replace(",", "")quando si sostituisce già con RegEx? Aggiungi ;,al tuo pattern RegEx:string invalidReStr = string.Format(@"[{0};,]+", invalidChars); string replace = Regex.Replace(name, invalidReStr, "_");
SBF

97

Il server DOVREBBE mettere virgolette doppie attorno al nome del file, come menzionato da @cusman e @Touko nelle loro risposte.

Per esempio:

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

Ho anche sostituito le virgolette doppie nel nome del file con trattini bassi.
Peter L

Ho fatto lo stesso, anche qui ottenendo il nome del file con trattini bassi.
Jamsheer

5

Per me il problema riguardava una virgola non nel nome del file ma come di seguito: -

Response.ok (streamingOutput, MediaType.APPLICATION_OCTET_STREAM_TYPE) .header ("content-disposition", " attachment, filename = your_file_name"). Build ();

Ho accidentalmente inserito una virgola dopo l'allegato. È stato risolto sostituendo la virgola con un punto e virgola.


3

Basta inserire un paio di virgolette doppie attorno al nome del file in questo modo:

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


Ma c'è un trattino basso nel nome del file scaricato.
Jamsheer

1

Le virgolette doppie attorno al nome del file nell'intestazione sono lo standard per i documenti Web MDN. L'omissione delle virgolette crea molteplici opportunità per i problemi derivanti dai caratteri nel nome del file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.