Các tiêu đề trùng lặp nhận được từ máy chủ


119

Các tiêu đề trùng lặp nhận được từ máy chủ

Phản hồi từ máy chủ chứa các tiêu đề trùng lặp. Sự cố này thường là kết quả của một trang web hoặc proxy được định cấu hình sai. Chỉ quản trị viên trang web hoặc proxy mới có thể khắc phục sự cố này.

Lỗi 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): Đã nhận được nhiều tiêu đề Nội dung-Bố trí riêng biệt. Điều này không được phép để bảo vệ khỏi các cuộc tấn công phân chia phản hồi HTTP.

Tôi đã tìm thấy lỗi này khi xuất sang pdf trong 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();

Làm thế nào để khắc phục điều này?


18
Tôi cũng nhận thấy rằng dấu phẩy trong tên tệp sẽ gây ra lỗi đó (chỉ trong Chrome). Tôi đang nghĩ phải có cách nào đó để thông báo rằng tên tệp = "abc, xyz.pdf" là hợp lệ. Tôi hiểu rằng chúng tôi có thể thay thế "," bằng một cái gì đó khác, nhưng tôi muốn giữ nguyên và trả lại tên tệp chính xác như nó vốn có. Không có trình duyệt nào khác (IE, FireFox, Safari, Opera) mà tôi đã thử gặp sự cố này.
cusman

29
Vì vậy, có một cách để nó vẫn còn dấu phẩy trong tên tệp. Chỉ cần trích dẫn tên tệp. Response.AddHeader("content-disposition", "attachment; filename=\"" + FileNameWithCommas + "\"");
cusman

3
Cảm ơn @cusman. Đó chính xác là vấn đề của tôi - dấu phẩy trong tên tệp VÀ chỉ có Chrome gặp vấn đề với điều đó.
PeterKA

Câu trả lời:


236

Cái này hơi cũ nhưng đã được xếp hạng cao trong google nên tôi nghĩ tôi sẽ đưa ra câu trả lời mà tôi tìm thấy từ Chrome, hiển thị pdf, Tiêu đề trùng lặp nhận được từ máy chủ

Về cơ bản, vấn đề của tôi cũng là tên tệp chứa dấu phẩy. Thay thế dấu phẩy để xóa chúng và bạn sẽ ổn. Chức năng của tôi để tạo một tên tệp hợp lệ là bên dưới.

    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
Từ nhận xét của @roryok tại câu trả lời được liên kết, các dấu ngoặc kép xung quanh tên tệp sẽ khắc phục sự cố. Và trên thực tế , thông số kỹ thuật dường như nói rằng tên tệp nên được trích dẫn.
Touko

Dấu ngoặc kép sẽ là một trợ giúp (và nên được thêm vào) nhưng chức năng này có thêm lợi ích là loại bỏ các ký tự không hợp lệ để bạn tạo một cái tên thân thiện hơn ở phần cuối.
Bryan Roberts

@Younisbarznji nó làm việc cho tôi, bạn cần phải thoát khỏi dấu ngoặc kép trong tên tập tin
coffekid

3
Nó hoạt động cho tôi! Dấu phẩy và dấu cách không phải là ý kiến ​​hay trong tên tệp!
Hugo

Tại sao .Replace(";", "").Replace(",", "")khi đã thay thế bằng RegEx? Thêm vào ;,mẫu RegEx của bạn:string invalidReStr = string.Format(@"[{0};,]+", invalidChars); string replace = Regex.Replace(name, invalidReStr, "_");
SBF

97

Máy chủ NÊN đặt dấu ngoặc kép xung quanh tên tệp, như được đề cập bởi @cusman và @Touko trong câu trả lời của họ.

Ví dụ:

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

Tôi cũng thay thế bất kỳ dấu ngoặc kép nào trong tên tệp bằng dấu gạch dưới.
Peter L

Tôi đã làm tương tự, ở đây cũng nhận được tên tệp với dấu gạch dưới.
Jamsheer

5

Đối với tôi, vấn đề là về dấu phẩy không phải trong tên tệp mà ở dưới đây: -

Response.ok (streamingOutput, MediaType.APPLICATION_OCTET_STREAM_TYPE) .header ("content-disposition", " file đính kèm, filename = your_file_name"). Build ();

Tôi vô tình đặt dấu phẩy sau phần đính kèm. Đã giải quyết vấn đề bằng cách thay thế dấu phẩy bằng dấu chấm phẩy.


3

Chỉ cần đặt một cặp dấu ngoặc kép xung quanh tên tệp của bạn như sau:

this.Response.AddHeader ("Định vị nội dung", $ "tệp đính kèm; filename = \" {outputFileName} \ "");


Nhưng có một dấu gạch dưới trong tên tệp đã tải xuống.
Jamsheer

1

Dấu ngoặc kép xung quanh tên tệp trong tiêu đề là tiêu chuẩn cho mỗi tài liệu web MDN. Việc bỏ qua các dấu ngoặc kép sẽ tạo ra nhiều cơ hội cho các vấn đề phát sinh từ các ký tự trong tên tệp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.