ส่วนหัวซ้ำที่ได้รับจากเซิร์ฟเวอร์


119

ส่วนหัวซ้ำที่ได้รับจากเซิร์ฟเวอร์

การตอบสนองจากเซิร์ฟเวอร์มีส่วนหัวที่ซ้ำกัน โดยทั่วไปปัญหานี้เป็นผลมาจากเว็บไซต์หรือพร็อกซีที่กำหนดค่าไม่ถูกต้อง เฉพาะผู้ดูแลระบบเว็บไซต์หรือพร็อกซีเท่านั้นที่สามารถแก้ไขปัญหานี้ได้

ข้อผิดพลาด 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): ได้รับส่วนหัวการจัดการเนื้อหาที่แตกต่างกันหลายรายการ สิ่งนี้ไม่ได้รับอนุญาตเพื่อป้องกันการโจมตีแยกการตอบสนองของ HTTP

ฉันพบข้อผิดพลาดนี้ขณะส่งออกเป็น pdf ใน 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();

จะแก้ไขได้อย่างไร?


18
ฉันยังพบว่าลูกน้ำในชื่อไฟล์จะให้ข้อผิดพลาดนั้น (ใน Chrome เท่านั้น) ฉันคิดว่าต้องมีวิธีที่จะบอกได้ว่า filename = "abc, xyz.pdf" นั้นถูกต้อง ฉันเข้าใจว่าเราสามารถแทนที่ "," ด้วยอย่างอื่นได้ แต่ฉันต้องการรักษาและส่งคืนชื่อไฟล์ให้ตรงตามที่เป็นจริง ไม่มีเบราว์เซอร์อื่น ๆ (IE, FireFox, Safari, Opera) ที่ฉันได้ลองมีปัญหานี้
cusman

29
ดังนั้นจึงมีวิธีที่จะให้มันยังคงมีเครื่องหมายจุลภาคอยู่ในชื่อไฟล์ เพียงแค่ต้องอ้างชื่อไฟล์ Response.AddHeader("content-disposition", "attachment; filename=\"" + FileNameWithCommas + "\"");
cusman

3
ขอบคุณ @cusman นั่นคือปัญหาของฉัน - จุลภาคในชื่อไฟล์และ Chrome เท่านั้นที่มีปัญหา
PeterKA

คำตอบ:


236

อันนี้เก่าไปหน่อย แต่อยู่ในอันดับสูงของ Google ดังนั้นฉันคิดว่าฉันจะตอบคำถามที่พบจากChrome, pdf display, Duplicate headers ที่ได้รับจากเซิร์ฟเวอร์

โดยทั่วไปปัญหาของฉันก็คือชื่อไฟล์มีเครื่องหมายจุลภาค แทนที่ด้วยเครื่องหมายจุลภาคเพื่อลบออกและคุณน่าจะสบายดี ฟังก์ชั่นของฉันในการสร้างชื่อไฟล์ที่ถูกต้องอยู่ด้านล่าง

    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

เครื่องหมายคำพูดจะเป็นตัวช่วย (และควรเพิ่ม) แต่ฟังก์ชันนี้มีประโยชน์เพิ่มเติมในการแยกอักขระที่ไม่ถูกต้องออกเพื่อให้คุณสร้างชื่อที่เป็นมิตรต่อท้าย
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

1

เครื่องหมายคำพูดคู่รอบชื่อไฟล์ในส่วนหัวเป็นมาตรฐานสำหรับเอกสารเว็บ MDN การละเว้นเครื่องหมายคำพูดจะสร้างโอกาสมากมายสำหรับปัญหาที่เกิดจากอักขระในชื่อไฟล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.