C# WEB API 响应下载 0 大小的文件

Posted

技术标签:

【中文标题】C# WEB API 响应下载 0 大小的文件【英文标题】:C# WEB API response downloads 0 size file 【发布时间】:2020-08-29 14:58:03 【问题描述】:

我下面的 API 操作应该会发送一个 zip 文件(最大 100mb)作为结果。代码中没有抛出错误,但是下载的文件大小为 0。我检查了内容长度,内容长度有值。可能是什么原因。

[HttpGet]
        [Route("AsyncDownloadFile")]
        public async Task<HttpResponseMessage> AsyncDownloadFile(int ModuleID, string LicenseKey, string Version)
        
            try
            
                ClientOutletsDAL co = new ClientOutletsDAL();
                //var localFilePath = "path/zz.zip"

                HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
                new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read));

                Stream streamToCopyTo= new MemoryStream();
                using (FileStream fs = new FileStream(localFilePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))
                
                     await fs.CopyToAsync(streamToCopyTo);
                
                response.Content = new StreamContent(streamToCopyTo);
                //Set the Response Content Length.
                response.Content.Headers.ContentLength = streamToCopyTo.Length;
                response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
                response.Content.Headers.ContentDisposition.FileName = Path.GetFileName(localFilePath);
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");

                return response;
            

            catch (Exception ex)
            
                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message );
                return response;
            
        

【问题讨论】:

我敢打赌,复制文件流后,您必须将流位置重置为 0 streamToCopyTo 【参考方案1】:

问题通过添加解决了

streamToCopyTo.Position = 0;

之后

response.Content = new StreamContent(streamToCopyTo);

【讨论】:

【参考方案2】:

我注意到您的代码中有以下内容

 new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read));

但它没有被使用,但它似乎试图打开同一个文件,所以我想知道你是否是文件共享问题。

另外,您是否确实拥有权限(只是检查),最后,您是否已通过此代码验证 streamToCopyTo 中是否有数据?

干杯

【讨论】:

HI 问题是因为 streamToCopyTo.Position = 0;失踪

以上是关于C# WEB API 响应下载 0 大小的文件的主要内容,如果未能解决你的问题,请参考以下文章

不可接受的响应 (406) 消息 Asp.NET 代码 Web API (C#) - .NET 5.0

C# API - 提供从 Azure Blob 存储下载的文件

如何使用 API 和 c# 从 azure DevOps 服务器下载文件到指定路径

从 .NET Core Web API 调用 SalesForce API 并将响应反序列化为 c# 对象?

如何在 C# 中使用 HttpClient 读取 Web api 响应

C# 中 WCF 和 MVC Web API 的通用请求响应拦截器