Score:0

IIS 10 ทำให้ไฟล์ Excel เสียหายเมื่อดาวน์โหลด

ธง bd

ฉันมีแอปพลิเคชัน ASP.Net MVC ที่ส่งออกข้อมูลไปยังสมุดงาน Excel ไฟล์ .xlsx

สมุดงานถูกสร้างขึ้นอย่างถูกต้องบนเซิร์ฟเวอร์และ Excel สามารถเปิดและแสดงไฟล์ได้หากฉันเปิดจากไดเร็กทอรีเอาต์พุต (เช่น d:\sites\app\content\exported_data\dataset_2021-12-12.xlsx) ไฟล์นี้มีขนาด 24k

เมื่อดาวน์โหลดสมุดงานผ่าน HTTP (เช่น http://site.company.com/content/exported_data/dataset_2021-12-12.xlsx) ไม่สามารถเปิดได้โดย ExcelExcel จะแจ้งให้คุณทราบว่าไฟล์เสียหาย และหากคุณพยายามซ่อมแซมไฟล์ แสดงว่ากระบวนการนั้นล้มเหลว ไฟล์ที่ดาวน์โหลดคือ 40k

เซิร์ฟเวอร์: ศูนย์ข้อมูล Windows Server 2016 (10.0.14393.4704); IIS 10.0.14393.0

ลูกค้า: Windows 10 (10.0.19041.1052); โครม 96.0.4664.45

ปิดการบีบอัดเนื้อหาแบบคงที่

ฉันพลาดอะไรไปที่นี่?

อัปเดต #1 การดาวน์โหลดไฟล์ .TXT นั้นใช้ได้ดี

อัปเดต #2 ความเสียหายยังล้มเหลวภายใต้ IE11 และ Edge

อัปเดต #3 ส่วนหัวของคำขอ:

รับ /content/exported_data/dataset_2021-12-12.xlsx HTTP/1.1
โฮสต์: site.company.com
การเชื่อมต่อ: มีชีวิตอยู่
คำขออัปเกรดที่ไม่ปลอดภัย: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML เช่น Gecko) Chrome/96.0.4664.45 Safari/537.36
ยอมรับ: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3; คิว=0.9
ยอมรับการเข้ารหัส: gzip, deflate
ภาษาที่ยอมรับ: en-US,en;q=0.9
คุกกี้: _ga=GA1.2.22470475.1602604311; คุกกี้อุปกรณ์ FWA=c44514ea-30ea-4579-969c-dfaad56002df; rxVisitor=1637946224265ID87N5ET43TH5SI86J0O7BJSLFDBSUIA; dtCookie=v_4_srv_2_sn_029F965CFA2AD25C362FEDB269BCC826_perc_100000_ol_0_mul_1_app-3Ae7bdf245ee5f8b62_1_app-3A65c25f0debc01cd8_1_rcs-3Acss_0; dtSa=-; dtLatC=26; FWA_Session_Cookie=b5427e92-983f-4b5d-82cc-83e2c2c468f7; ASP.NET_SessionId=zdpkziw4w1mtv3qt5bnj4tsi; dtPC=2$558067128_615h-vBVCARAAREUABLAKHWMVOAUUMAHVUUGV-0e0; rxvt=1638821269230|1638819469230
ถ้าไม่มีตรงกัน: "55388354cfead71:0"
If-Modified-Since: จันทร์ที่ 06 ธันวาคม 2021 18:30:22 GMT

ส่วนหัวของการตอบสนอง

HTTP/1.1 304 ไม่มีการแก้ไข
การควบคุมแคช: ส่วนตัว
ยอมรับช่วง: ไบต์
ETแท็ก: "55388354cfead71:0"
เซิร์ฟเวอร์: Microsoft-IIS/10.0
ตั้งค่าคุกกี้: คุกกี้อุปกรณ์ FWA=c44514ea-30ea-4579-969c-dfaad56002df; หมดอายุ=อาทิตย์ 06-มี.ค.-2022 19:45:26 GMT; เส้นทาง=/
ตั้งค่าคุกกี้: FWA_Session_Cookie=b5427e92-983f-4b5d-82cc-83e2c2c468f7; หมดอายุ=จันทร์ 06-ธ.ค.-2021 20:15:26 GMT; เส้นทาง=/
ถาวร-รับรองความถูกต้อง: จริง
X-ขับเคลื่อนโดย: ASP.NET
วันที่: จันทร์ 06 ธันวาคม 2021 19:45:26 GMT

อัปเดต #4 การจับภาพหน้าจอของ Beyond Compare 4 ความแตกต่างระหว่างเวอร์ชันที่ดาวน์โหลด (40kb) ทางด้านซ้ายและไฟล์เซิร์ฟเวอร์ (24kb) ทางด้านขวา

ด้านซ้ายคือไฟล์ที่ดาวน์โหลด (40kb) ด้านขวาคือไฟล์เซิร์ฟเวอร์ (24kb)

อัปเดต #5
ฉันได้แก้ไขปัญหาแม้ว่าจะไม่ใช่วิธีที่ฉันต้องการ (ฉันทำในโค้ดไม่ใช่ในระดับเซิร์ฟเวอร์ฉันจะอธิบายให้ละเอียด)

@BruceZhang-MSFT แนะนำให้ฉันลองใช้เซิร์ฟเวอร์อื่น ซึ่งให้ผลลัพธ์ที่แตกต่างกัน

เซิร์ฟเวอร์ที่แสดงพฤติกรรมส่งคืน "ไมโครซอฟท์ วินโดวส์ [เวอร์ชัน 10.0.14393]" เมื่อเรียกใช้ ver.exe จากบรรทัดคำสั่ง

บนเซิร์ฟเวอร์อื่นที่ไม่ได้ทำให้ไฟล์ Excel ที่ดาวน์โหลดเสียหาย การเรียกใช้ ver.exe จากบรรทัดคำสั่งจะส่งกลับ "ไมโครซอฟท์ วินโดวส์ [เวอร์ชัน 10.0.17763.2300]".

ถ้าฉันเปลี่ยนรหัสตัวควบคุมและตั้งค่าการเข้ารหัสอย่างชัดแจ้ง เช่น ด้านล่างนี้ ไฟล์ Excel จะดาวน์โหลดอย่างถูกต้อง

FilePathResult สาธารณะ XlsxDataTable (ตาราง DataTable ชื่อรายงานสตริง)
{
    var rootName = reportName + "_" + DateTime.Now.ToString("yyyy-MM-dd_HH.mm.ss");
    var ชื่อไฟล์ = rootName + ".xlsx";
    var filePath = Path.Combine (Request.MapPath ("~/Content/exported_data"), ชื่อไฟล์);

    ใช้ (สมุดงาน XLWorkbook = table.ToXlsx (rootName, filePath))
    {
        ผลลัพธ์ var = FilePathResult ใหม่ (เส้นทางไฟล์, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        result.FileDownloadName =ชื่อไฟล์;
        Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1"); // <-- นี่คือบรรทัดใหม่ที่แก้ไขปัญหา
        ส่งคืนผลลัพธ์
    }
}

ฉันจะส่งการเข้ารหัสนี้ไปยัง OS และ IIS ได้อย่างไร ดูเหมือนว่าค่อนข้างเฉพาะเจาะจงสำหรับ Windows Server รุ่นนี้ที่ฉันใช้อยู่

mfinni avatar
cn flag
ทำความแตกต่างของไฟล์ดิบและไฟล์ที่ดาวน์โหลด และโพสต์ผลลัพธ์เหล่านั้นด้วย
bd flag
@mfinni จับภาพหน้าจอของส่วนต่าง
mfinni avatar
cn flag
MIME ของคุณประเภทใดใน IIS สำหรับ XSLX สำหรับไซต์นี้ ตรวจสอบหนึ่งในเซิร์ฟเวอร์ IIS ของฉัน มันถูกกำหนดค่าสำหรับ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
cn flag
การบันทึกไฟล์เป็น ANSI อาจไม่ดี
bd flag
@mfinni นั่นคือหนึ่งในสิ่งแรกที่ฉันนึกถึง บางทีเซิร์ฟเวอร์อาจไม่ได้กำหนดค่าไว้ ฉันยืนยันว่ามีการกำหนดค่าเซิร์ฟเวอร์อย่างถูกต้อง
Score:0
ธง cn

คำตอบนี้ บอกวิธีตั้งค่าการเข้ารหัสเนื้อหาสำหรับแอป .NET

คัดลอกที่นี่เพื่อชีวิตที่ยืนยาว

การเข้ารหัสเนื้อหาถูกตั้งค่าในไฟล์ Machine.config เมื่อติดตั้ง .NET Framework คุณสามารถแก้ไขไฟล์นี้ซึ่งจะส่งผลต่อการเข้ารหัสการตอบสนองของไซต์ ASP.NET ทั้งหมด หรือคุณสามารถแทนที่ไฟล์นี้ในแต่ละไซต์ได้โดยใช้องค์ประกอบในไฟล์ Web.config ของแต่ละไซต์

ให้เครดิตกับ @มาร์คเบล

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา