You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Web API 2.0下载Excel文件被识别为文本而非二进制的问题

问题解决步骤

1. 移除错误的ResponseType特性

你的控制器方法上标注了[ResponseType(typeof(string))],这会让Web API误以为要返回字符串类型响应,从而将二进制Excel流按文本编码(如UTF-8)处理,导致二进制数据被篡改,出现换行符转换、字节数增加的问题。直接删除该特性即可。

2. 重置MemoryStream的位置

将流复制到本地文件后,stream的Position已移动到流末尾,创建StreamContent前必须再次将Position重置为0,否则读取的是空内容(或后续中间件会进行错误填充)。

3. 优化文件资源管理(可选)

使用using语句管理FileStream,确保文件资源正确释放,避免句柄泄漏。

修正后的完整代码

[HttpPost]
[IsAjaxRequest]
[Route("{eventId}/Session/{sessionId}/Participants/spreadsheet")]
public async Task<HttpResponseMessage> GetParticipantsSpreadsheet(int eventId, int sessionId)
{
    var stream = new MemoryStream();
    {
        var result = await ApiClubEventManage.GetParticipantsSpreadsheetAsync(stream, eventId, sessionId, GetCurrentUser(), IsUserSiteAdmin(), SystemClock.Instance, getDb());
        stream.Position = 0;
        
        // 本地保存测试(可保留或删除)
        using (FileStream fs = new FileStream("/file.xlsx", FileMode.Create, FileAccess.Write))
        {
            stream.CopyTo(fs);
        }
        stream.Position = 0; // 重置位置用于响应输出

        var response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StreamContent(stream) };

        response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.Content.Headers.ContentLength = stream.Length;
        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
        { 
            FileName = Uri.EscapeDataString(result.Data), 
            Size = stream.Length 
        };
        response.Headers.CacheControl = new CacheControlHeaderValue { NoCache = true, NoStore = true, MustRevalidate = true };

        return response;
    }
}

额外说明

  • 关于Accept请求头:浏览器发送的application/json, text/plain, */*不会直接导致二进制转换问题,只要Web API正确返回application/vnd.openxmlformats-officedocument.spreadsheetml.sheet类型响应,浏览器会按二进制文件处理。问题核心是ResponseType特性引发的错误序列化逻辑。
  • 若文件名包含非ASCII字符,用Uri.EscapeDataString编码可避免浏览器解析错误。

内容的提问来源于stack exchange,提问作者Greg Veres

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:56:24