En-têtes en double reçus du serveur

119

En-têtes en double reçus du serveur

La réponse du serveur contenait des en-têtes en double. Ce problème est généralement le résultat d'un site Web ou d'un proxy mal configuré. Seul le site Web ou l'administrateur proxy peut résoudre ce problème.

Erreur 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): plusieurs en-têtes Content-Disposition distincts reçus. Ceci est interdit pour se protéger contre les attaques de fractionnement de réponse HTTP.

J'ai trouvé cette erreur lors de l'exportation au format pdf dans 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();

Comment régler ceci?

Purvesh Desai
la source
18
J'ai également trouvé que la virgule dans le nom de fichier donnera cette erreur (dans Chrome uniquement). Je pense qu'il doit y avoir un moyen de lui dire que le filename = "abc, xyz.pdf" est valide. Je comprends que nous pouvons remplacer le "," par autre chose, mais je veux conserver et renvoyer le nom de fichier exactement tel qu'il est. Aucun des autres navigateurs (IE, FireFox, Safari, Opera) que j'ai essayés n'a ce problème.
cusman
29
Il existe donc un moyen de laisser des virgules dans le nom de fichier. Il suffit de citer le nom du fichier. Response.AddHeader("content-disposition", "attachment; filename=\"" + FileNameWithCommas + "\"");
cusman
3
Merci @cusman. C'était exactement mon problème - une virgule dans le nom de fichier ET seul Chrome avait un problème avec cela.
PeterKA

Réponses:

236

Ceux-ci sont un peu vieux mais étaient élevés dans le classement Google, alors j'ai pensé que je jetterais la réponse que j'ai trouvée à partir de Chrome, affichage pdf, En-têtes en double reçus du serveur

Fondamentalement, mon problème était également que le nom de fichier contenait des virgules. Remplacez les virgules pour les supprimer et tout devrait bien se passer. Ma fonction pour créer un nom de fichier valide est ci-dessous.

    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
la source
22
D'après le commentaire de @roryok à la réponse liée, les guillemets autour du nom de fichier devraient résoudre les problèmes. Et en fait, la spécification semble indiquer que le nom de fichier doit être cité.
Touko
Les guillemets seraient une aide (et devraient être ajoutés), mais cette fonction a l'avantage supplémentaire de supprimer les caractères non valides afin de créer un nom plus convivial à la fin.
Bryan Roberts
@Younisbarznji cela a fonctionné pour moi, vous devez échapper aux guillemets dans le nom du fichier
coffekid
3
Ça marche pour moi! Les virgules et les espaces ne sont pas une bonne idée dans les noms de fichiers!
Hugo le
Pourquoi .Replace(";", "").Replace(",", "")déjà remplacé par RegEx? Ajoutez ;,à votre modèle RegEx:string invalidReStr = string.Format(@"[{0};,]+", invalidChars); string replace = Regex.Replace(name, invalidReStr, "_");
SBF
97

Le serveur DEVRAIT mettre des guillemets doubles autour du nom de fichier, comme mentionné par @cusman et @Touko dans leurs réponses.

Par exemple:

Response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");
tomc
la source
J'ai également remplacé les guillemets doubles dans le nom du fichier par des traits de soulignement.
Peter L
J'ai fait la même chose, ici aussi le nom de fichier avec des traits de soulignement.
Jamsheer
5

Pour moi, le problème concernait une virgule pas dans le nom du fichier mais comme ci-dessous: -

Response.ok (streamingOutput, MediaType.APPLICATION_OCTET_STREAM_TYPE) .header ("disposition du contenu", " pièce jointe, nom_fichier = votre_nom_fichier"). Build ();

J'ai accidentellement mis une virgule après l'attachement. Je l'ai résolu en remplaçant la virgule par un point-virgule.

Deepak Agrawal
la source
3

Mettez simplement une paire de guillemets doubles autour de votre nom de fichier comme ceci:

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

user3578181
la source
Mais il y a un trait de soulignement dans le nom du fichier téléchargé.
Jamsheer
1

Les guillemets doubles autour du nom de fichier dans l'en-tête sont la norme pour les documents Web MDN. L'omission des guillemets crée de multiples opportunités de problèmes liés aux caractères du nom de fichier.

Will Brownsberger
la source