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
相关产品推荐
相关产品推荐

