서버에서받은 중복 헤더


119

서버에서받은 중복 헤더

서버의 응답에 중복 헤더가 있습니다. 이 문제는 일반적으로 잘못 구성된 웹 사이트 또는 프록시의 결과입니다. 웹 사이트 또는 프록시 관리자 만이 문제를 해결할 수 있습니다.

오류 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION) : 여러 개의 고유 한 콘텐츠 처리 헤더가 수신되었습니다. 이것은 HTTP 응답 분할 공격으로부터 보호하기 위해 허용되지 않습니다.

크롬에서 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 2014

29
따라서 파일 이름에 쉼표를 여전히 포함하는 방법이 있습니다. 파일 이름을 인용하면됩니다. Response.AddHeader("content-disposition", "attachment; filename=\"" + FileNameWithCommas + "\"");
cusman 2014

3
감사합니다 @cusman. 그것은 정확히 내 문제였습니다. 파일 이름에 쉼표가 있고 Chrome에만 문제가 있습니다.
PeterKA

답변:


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 2013

따옴표는 도움이되지만 추가되어야하지만이 기능은 유효하지 않은 문자를 제거하는 추가 이점이 있으므로 끝에 더 친숙한 이름을 만들 수 있습니다.
Bryan Roberts

@Younisbarznji는, 당신은 파일 이름에 따옴표를 이스케이프 할 필요가 나를 위해 일한
coffekid

3
그것은 나를 위해 작동합니다! 쉼표와 공백은 파일 이름에 적합하지 않습니다!
Hugo

.Replace(";", "").Replace(",", "")이미 RegEx로 대체하는 이유는 무엇 입니까? ;,RegEx 패턴에 추가 :string invalidReStr = string.Format(@"[{0};,]+", invalidChars); string replace = Regex.Replace(name, invalidReStr, "_");
SBF

97

서버 @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.