サーバーから重複したヘッダーを受信しました


119

サーバーから重複したヘッダーを受信しました

サーバーからの応答に重複したヘッダーが含まれていました。この問題は、通常、ウェブサイトまたはプロキシの設定が不適切なために発生します。この問題を修正できるのは、Webサイトまたはプロキシ管理者だけです。

エラー349(net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION):複数の異なるContent-Dispositionヘッダーを受信しました。これは、HTTP応答分割攻撃から保護するために許可されていません。

ChromeでPDFにエクスポート中にこのエラーが見つかりました。

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();

これを修正するには?


18
また、ファイル名にコンマを使用するとそのエラーが発生することもわかりました(Chromeのみ)。filename = "abc、xyz.pdf"が有効であることを伝える方法が必要だと思います。「、」を別のものに置き換えることができるとわかりましたが、ファイル名をそのまま正確に保持して返したいと思います。私が試した他のブラウザ(IE、FireFox、Safari、Opera)はどれもこの問題はありません。
cusman 14

29
したがって、ファイル名にコンマを含める方法はあります。ファイル名を引用するだけです。Response.AddHeader("content-disposition", "attachment; filename=\"" + FileNameWithCommas + "\"");
cusman 14

3
@cusmanに感謝します。それはまさに私の問題でした-ファイル名にコンマがあり、それだけにChromeに問題がありました。
PeterKA 2015年

回答:


236

これは少し古いですが、Googleランキングで高かったので、Chromeから見つけた回答、pdf表示、サーバーから受信した重複ヘッダーを投げると思いました

基本的に私の問題は、ファイル名にカンマが含まれていることでもありました。それらを削除するためにコンマを置き換えてください。そうすれば大丈夫です。有効なファイル名を作成するための関数は以下のとおりです。

    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
リンクされた回答での@roryokのコメントから、ファイル名を囲む引用符で問題を修正する必要があります。そして実際には、仕様ではファイル名を引用符で囲む必要があると記載されているようです。
Touko

引用符は助けになります(追加する必要があります)が、この関数には、無効な文字を削除して最後にわかりやすい名前を付けるという追加の利点があります。
ブライアンロバーツ

@Younisbarznjiはそれは、あなたがファイル名に引用符をエスケープする必要が私のために働いた
coffekid

3
わたしにはできる!ファイル名にカンマとスペースは使用しないでください。
ヒューゴ

なぜ.Replace(";", "").Replace(",", "")RegExに置き換えたのですか?;,RegExパターンに追加します:string invalidReStr = string.Format(@"[{0};,]+", invalidChars); string replace = Regex.Replace(name, invalidReStr, "_");
SBF

97

サーバーSHOULD@cusmanと@Toukoの返信で述べられているように、はファイル名を二重引用符で囲む必要があります(。

例えば:

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

また、ファイル名の二重引用符もアンダースコアに置き換えました。
Peter L

同じことをしましたが、ここでもアンダースコア付きのファイル名を取得しています。
Jamsheer

5

私にとっての問題は、ファイル名ではなく、以下のようなコンマに関するものでした:-

Response.ok(streamingOutput、MediaType.APPLICATION_OCTET_STREAM_TYPE).header( "content-disposition"、 " attachment、filename = your_file_name")。build();

添付後に誤ってカンマを入れてしまいました。コンマをセミコロンに置き換えることで解決しました。


3

次のように、ファイル名を二重引用符で囲みます。

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


ただし、ダウンロードしたファイル名にはアンダースコアが含まれています。
Jamsheer

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.