Am o aplicație ASP.Net MVC care exportă date într-un registru de lucru Excel; un fișier .xlsx.
Registrul de lucru este generat corect pe server și Excel poate deschide și afișa fișierul dacă îl deschid din directorul de ieșire (adică d:\sites\app\content\exported_data\dataset_2021-12-12.xlsx). Acest fișier are o dimensiune de 24k.
Când registrul de lucru este descărcat prin HTTP (de ex. http://site.company.com/content/exported_data/dataset_2021-12-12.xlsx), nu poate fi deschis de Excel.Excel vă va spune că fișierul este deteriorat și dacă încercați să reparați fișierul, acest proces eșuează. Fișierul descărcat este de 40k.
Server: Centrul de date Windows Server 2016 (10.0.14393.4704); IIS 10.0.14393.0
Client: Windows 10 (10.0.19041.1052); Chrome 96.0.4664.45
Comprimarea conținutului static este dezactivată.
Ce îmi lipsește aici?
Actualizare #1
Descărcarea unui fișier .TXT funcționează bine.
Actualizare #2
Corupția eșuează și sub IE11 și Edge.
Actualizare #3
Antetele cererii:
GET /content/exported_data/dataset_2021-12-12.xlsx HTTP/1.1
Gazdă: site.company.com
Conexiune: păstrați-vă în viață
Solicitări de upgrade-nesigure: 1
Agent utilizator: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, ca Gecko) Chrome/96.0.4664.45 Safari/537.36
Accept: 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
Acceptare-Codificare: gzip, deflate
Limba de acceptare: en-US,en;q=0,9
Cookie: _ga=GA1.2.22470475.1602604311; FWA Device Cookie=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_1_RC dtSa=-; dtLatC=26; FWA_Session_Cookie=b5427e92-983f-4b5d-82cc-83e2c2c468f7; ASP.NET_SessionId=zdpkziw4w1mtv3qt5bnj4tsi; dtPC=2$558067128_615h-vBVCARAAREUABLAKKHWMVOAUUMAHVUUGV-0e0; rxvt=1638821269230|1638819469230
Dacă nu se potrivește: „55388354cfead71:0”
Dacă a fost modificat, de la: Luni, 06 Dec 2021 18:30:22 GMT
Antete de răspuns
HTTP/1.1 304 Nemodificat
Cache-Control: privat
Accept-Range: octeți
ETag: „55388354cfead71:0”
Server: Microsoft-IIS/10.0
Set-Cookie: FWA Device Cookie=c44514ea-30ea-4579-969c-dfaad56002df; expiră=Dum., 06-Mar-2022 19:45:26 GMT; cale=/
Set-Cookie: FWA_Session_Cookie=b5427e92-983f-4b5d-82cc-83e2c2c468f7; expiră=Lun, 06-Dec-2021 20:15:26 GMT; cale=/
Persistent-Auth: adevărat
X-Powered-By: ASP.NET
Data: Luni, 06 Dec 2021 19:45:26 GMT
Actualizare #4
Captură de ecran a Beyond Compare 4 diferențe între versiunea descărcată (40 kb) din stânga și fișierul server (24 kb) din dreapta.
Actualizare #5
Am rezolvat problema, deși nu așa cum mi-am dorit. (Am făcut-o în cod, nu la nivel de server, voi detalia asta)
@BruceZhang-MSFT mi-a sugerat să încerc un alt server. Ceea ce a dat un rezultat diferit.
Serverul care prezintă comportamentul revine „Microsoft Windows [Versiunea 10.0.14393]” când rulați ver.exe din linia de comandă.
Pe un alt server care nu corupă fișierele Excel la descărcare, rulează ver.exe din linia de comandă „Microsoft Windows [Versiunea 10.0.17763.2300]”.
Dacă schimb codul controlerului și setez în mod explicit codificarea, ca mai jos, fișierele Excel se descarcă corect.
public FilePathResult XlsxDataTable(tabel DataTable, șir reportName)
{
var rootName = reportName + "_" + DateTime.Now.ToString("aaaa-LL-zz_HH.mm.ss");
var fileName = rootName + ".xlsx";
var filePath = Path.Combine(Request.MapPath("~/Content/exported_data"), fileName);
folosind (XLWorkbook workbook = table.ToXlsx(rootName, filePath))
{
rezultat var = new FilePathResult(filePath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
result.FileDownloadName = fileName;
Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1"); // <-- Aceasta este noua linie care rezolvă problema
returnează rezultatul;
}
}
Cum împing această codificare în sistemul de operare și IIS? Pare destul de specific acestei versiuni specifice de Windows Server cu care mă ocup.