Điểm:0

IIS 10 làm hỏng tệp Excel khi tải xuống

lá cờ bd

Tôi có ứng dụng ASP.Net MVC xuất dữ liệu sang sổ làm việc Excel; một tệp .xlsx.

Sổ làm việc được tạo chính xác trên máy chủ và Excel có thể mở và hiển thị tệp nếu tôi mở tệp đó từ thư mục đầu ra (tức là d:\sites\app\content\exported_data\dataset_2021-12-12.xlsx). Tệp này có kích thước 24k.

Khi sổ làm việc được tải xuống qua HTTP (tức là http://site.company.com/content/exported_data/dataset_2021-12-12.xlsx), nó không thể mở bằng Excel.Excel sẽ cho bạn biết tệp bị hỏng và nếu bạn cố gắng sửa tệp, quá trình đó sẽ không thành công. File tải về là 40k.

Máy chủ: Trung tâm dữ liệu Windows Server 2016 (10.0.14393.4704); IIS10.0.14393.0

Máy khách: Windows 10 (10.0.19041.1052); Chrome 96.0.4664.45

Nén nội dung tĩnh bị tắt.

Tôi đang thiếu gì ở đây?

Cập nhật số 1 Tải xuống tệp .TXT hoạt động tốt.

Cập nhật #2 Tham nhũng cũng không thành công trong IE11 và Edge.

Cập nhật #3 Tiêu đề yêu cầu:

NHẬN /content/exported_data/dataset_2021-12-12.xlsx HTTP/1.1
Máy chủ: site.company.com
Kết nối: giữ nguyên
Nâng cấp-Không an toàn-Yêu cầu: 1
Tác nhân người dùng: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, như Gecko) Chrome/96.0.4664.45 Safari/537.36
Chấp nhận: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3; q=0,9
Chấp nhận mã hóa: gzip, giảm phát
Ngôn ngữ chấp nhận: en-US,en;q=0.9
Cookie: _ga=GA1.2.22470475.1602604311; Cookie thiết bị 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-vBVCARAAREUABLAKKHWMVOAUUMAHVUUGV-0e0; rxvt=1638821269230|1638819469230
Nếu-Không-Khớp: "55388354cfead71:0"
Nếu-Đã sửa đổi-Kể từ: Thứ Hai, ngày 06 tháng 12 năm 2021 18:30:22 GMT

tiêu đề phản hồi

HTTP/1.1 304 Không được sửa đổi
Kiểm soát bộ đệm: riêng tư
Phạm vi chấp nhận: byte
Thẻ: "55388354cfead71:0"
Máy chủ: Microsoft-IIS/10.0
Đặt cookie: Cookie thiết bị FWA=c44514ea-30ea-4579-969c-dfaad56002df; hết hạn=CN, 06-Mar-2022 19:45:26 GMT; đường dẫn =/
Đặt cookie: FWA_Session_Cookie=b5427e92-983f-4b5d-82cc-83e2c2c468f7; hết hạn=Thứ Hai, 06-Dec-2021 20:15:26 GMT; đường dẫn =/
Xác thực liên tục: đúng
X-Powered-By: ASP.NET
Ngày: Thứ Hai, ngày 06 tháng 12 năm 2021 19:45:26 GMT

Cập nhật #4 Ảnh chụp màn hình của Beyond So sánh 4 khác biệt giữa phiên bản đã tải xuống (40kb) ở bên trái và tệp máy chủ (24kb) ở bên phải.

Bên trái là file tải về (40kb). Bên phải là tệp máy chủ (24kb).

Cập nhật #5
Tôi đã giải quyết vấn đề, mặc dù không phải theo cách tôi muốn. (Tôi đã làm điều đó bằng mã, không phải ở cấp độ máy chủ, tôi sẽ trình bày chi tiết điều đó)

@BruceZhang-MSFT đề nghị tôi thử một máy chủ khác. Mà đã cho một kết quả khác nhau.

Máy chủ thể hiện hành vi trả về "Microsoft Windows [Phiên bản 10.0.14393]" khi chạy ver.exe từ dòng lệnh.

Trên một máy chủ khác không làm hỏng các tệp Excel khi tải xuống, chạy ver.exe từ dòng lệnh sẽ trả về "Microsoft Windows [Phiên bản 10.0.17763.2300]".

Nếu tôi thay đổi mã bộ điều khiển và đặt mã hóa rõ ràng, như bên dưới, thì các tệp Excel sẽ tải xuống chính xác.

public FilePathResult XlsxDataTable(bảng DataTable, chuỗi reportName)
{
    var rootName = reportName + "_" + DateTime.Now.ToString("yyyy-MM-dd_HH.mm.ss");
    var fileName = rootName + ".xlsx";
    var filePath = Path.Combine(Request.MapPath("~/Content/exported_data"), fileName);

    sử dụng (bảng tính XLWorkbook = table.ToXlsx(rootName, filePath))
    {
        var result = new FilePathResult(filePath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        kết quả.FileDownloadName = fileName;
        Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1"); // <- Đây là dòng mới khắc phục sự cố
        trả về kết quả;
    }
}

Làm cách nào để đẩy mã hóa này vào HĐH và IIS? Nó có vẻ khá cụ thể đối với bản dựng Windows Server cụ thể này mà tôi đang sử dụng.

mfinni avatar
lá cờ cn
Thực hiện khác biệt giữa tệp thô và tệp đã tải xuống, đồng thời đăng các kết quả đó.
lá cờ bd
@mfinni Chụp màn hình khác biệt.
mfinni avatar
lá cờ cn
Loại MIME của bạn trong IIS cho XSLX, cho trang web này là gì? Hãy xem một trong các máy chủ IIS của tôi, nó được định cấu hình cho "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
lá cờ cn
Lưu tệp dưới dạng ANSI có lẽ không tốt.
lá cờ bd
@mfinni Đó là một trong những điều đầu tiên tôi nghĩ đến, có thể máy chủ chưa được cấu hình. Tôi đã xác nhận máy chủ được cấu hình đúng.
Điểm:0
lá cờ cn

câu trả lời này cho bạn biết cách đặt mã hóa nội dung cho ứng dụng .NET

Chép vào đây cho trường tồn

Mã hóa nội dung được đặt trong tệp Machine.config khi .NET Framework được cài đặt. Bạn có thể chỉnh sửa tệp này sẽ ảnh hưởng đến mã hóa phản hồi của tất cả các trang ASP.NET hoặc bạn có thể ghi đè lên nó trên cơ sở từng trang bằng cách sử dụng phần tử trong tệp Web.config của mỗi trang.

Tín dụng để @markbell

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.