ฉันมีแอปพลิเคชัน 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) ทางด้านขวา
อัปเดต #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 รุ่นนี้ที่ฉันใช้อยู่