首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IIS 10在下载时损坏Excel文件

IIS 10在下载时损坏Excel文件
EN

Server Fault用户
提问于 2021-12-06 19:24:45
回答 1查看 425关注 0票数 0

我有一个Excel应用程序,它将数据导出到一个ASP.Net工作簿;一个.xlsx文件。

工作簿是在服务器上正确生成的,如果我从输出目录(即d:\sites\app\content\exported_data\dataset_2021-12-12.xlsx). )打开该文件,Excel就能够打开和显示它。这个文件的大小是24k。

当通过HTTP (即http://site.company.com/content/exported_数据/数据集_2021-12-12.xlsx)下载工作簿时,它不能被Excel打开。Excel将告诉您该文件已损坏,如果您试图修复该文件,则该进程将失败。下载的文件是40k。

服务器: Windows Server 2016数据中心(10.0.14393.4704);IIS 10.0.14393.0

客户端: Windows 10 (10.0.19041.1052);Chrome 96.0.4664.45

静态内容压缩被关闭。

我在这里错过了什么?

下载.TXT文件的更新#1工作得很好。

更新#2腐败也在IE11和边缘下失败。

更新#3请求头:

代码语言:javascript
运行
复制
GET /content/exported_data/dataset_2021-12-12.xlsx HTTP/1.1
Host: site.company.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like 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
Accept-Encoding: gzip, deflate
Accept-Language: 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_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
If-None-Match: "55388354cfead71:0"
If-Modified-Since: Mon, 06 Dec 2021 18:30:22 GMT

响应标头

代码语言:javascript
运行
复制
HTTP/1.1 304 Not Modified
Cache-Control: private
Accept-Ranges: bytes
ETag: "55388354cfead71:0"
Server: Microsoft-IIS/10.0
Set-Cookie: FWA Device Cookie=c44514ea-30ea-4579-969c-dfaad56002df; expires=Sun, 06-Mar-2022 19:45:26 GMT; path=/
Set-Cookie: FWA_Session_Cookie=b5427e92-983f-4b5d-82cc-83e2c2c468f7; expires=Mon, 06-Dec-2021 20:15:26 GMT; path=/
Persistent-Auth: true
X-Powered-By: ASP.NET
Date: Mon, 06 Dec 2021 19:45:26 GMT

更新#4屏幕截图:左侧下载的版本(40 of )和右边的服务器文件(24 Of)之间的差异。

更新#5

我解决了这个问题,虽然不是我想要的方式。(我是在代码中完成的,而不是在服务器级别,我将详细说明)

@BruceZhang-MSFT建议我尝试另一台服务器。结果就不同了。

显示此行为的服务器在从命令行运行版本10.0.14393时返回"Microsoft ver.exe“。

在另一台没有损坏下载时的Excel文件的服务器上,从命令行运行ver.exe返回"Microsoft 版本10.0.17763.2300“。

如果我更改控制器代码并显式设置编码,如下所示,Excel文件将正确下载。

代码语言:javascript
运行
复制
public FilePathResult XlsxDataTable(DataTable table, string 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);

    using (XLWorkbook workbook = table.ToXlsx(rootName, filePath))
    {
        var result = new FilePathResult(filePath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        result.FileDownloadName = fileName;
        Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1"); // <-- This the new line that fixes the problem
        return result;
    }
}

如何将此编码插入到操作系统和IIS中?对于我所使用的这个特定版本的Windows Server,它似乎非常具体。

EN

回答 1

Server Fault用户

发布于 2021-12-10 06:12:11

这个答案告诉您如何设置.NET应用程序的内容编码。

为了长寿而抄袭这里

内容编码是在安装Machine.config框架时在.NET文件中设置的。您可以编辑此文件,这将影响所有ASP.NET站点的响应编码,或者可以在每个站点的基础上使用每个站点的Web.config文件中的元素覆盖它。

贷给@马克贝尔

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1085567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档