Puncte:0

IIS 10 corupă fișierul Excel la descărcare

drapel bd

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.

Partea stângă este fișierul descărcat (40 kb). Partea dreaptă este fișierul server (24 kb).

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.

mfinni avatar
drapel cn
Faceți o diferență între fișierul brut și cel descărcat și postați și acele rezultate.
drapel bd
@mfinni Captură de ecran a difer.
mfinni avatar
drapel cn
Care este tipul dvs. MIME în IIS pentru XSLX, pentru acest site? Aruncând o privire la unul dintre serverele mele IIS, acesta este configurat pentru „application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”
drapel cn
Salvarea fișierului ca ANSI probabil nu este bună.
drapel bd
@mfinni Acesta a fost unul dintre primele lucruri la care m-am gândit, poate că serverul nu l-a configurat. Am confirmat că serverul este configurat corect.
Puncte:0
drapel cn

Acest răspuns vă spune cum să setați codificarea conținutului pentru o aplicație .NET

Copiere aici pentru longevitate

Codificarea conținutului este setată în fișierul Machine.config când este instalat .NET Framework. Puteți edita acest fișier care va afecta codificarea răspunsurilor tuturor site-urilor ASP.NET, sau îl puteți înlocui pe site folosind elementul din fișierul Web.config al fiecărui site.

Credit la @markbell

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.