使用HttpClient下载Web API大文件

paradoxx.net

我从网络api到Win Forms应用程序下载大文件时遇到问题。在胜利表单应用程序上,我正在使用HttpClient来获取数据。我在服务器端有以下代码:

[HttpPost]
[Route]
public async Task<HttpResponseMessage> GetBackup(BackupRequestModel request)
{
    HttpResponseMessage response;
    try
    {
        response = await Task.Run<HttpResponseMessage>(() =>
        {
            var directory = new DirectoryInfo(request.Path);
            var files = directory.GetFiles();
            var lastCreatedFile = files.OrderByDescending(f => f.CreationTime).FirstOrDefault();
            var filestream = lastCreatedFile.OpenRead();
            var fileResponse = new HttpResponseMessage(HttpStatusCode.OK);
            fileResponse.Content = new StreamContent(filestream);
            fileResponse.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            return fileResponse;
        });
    }
    catch (Exception e)
    {
        logger.Error(e);
        response = Request.CreateResponse(HttpStatusCode.InternalServerError);
    }
    return response;
}

在客户端:

private async void btnStart_Click(object sender, EventArgs e)
    {
        var requestModel = new BackupRequestModel();
        requestModel.Username = txtUsername.Text;
        requestModel.Password = txtPassword.Text;
        requestModel.Path = txtServerPath.Text;

        var client = new HttpClient();
        var result = await client.PostAsJsonAsync("http://localhost:50116/api/backup", requestModel);
        var stream = await result.Content.ReadAsStreamAsync();
        var localPath = @"d:\test\filenew.bak";
        var fileStream = File.Create(localPath);
        stream.CopyTo(fileStream);
        fileStream.Close();
        stream.Close();
        fileStream.Dispose();
        stream.Dispose();
        client.Dispose();
    }
}

这实际上是可行的,但是此程序的目的是获取3GB以上的大文件并将其保存到客户端。

我已经在大小为630MB的文件上尝试过此操作,但我注意到的是:当我使用http客户端调用Web api时,http客户端实际上在内存流中以及从内存流到文件流中加载了630MB,但是当我尝试加载另一个文件我得到了OutOfMemoryException。之所以发生这种情况,是因为该应用程序不会从先前加载的文件中释放内存。我可以在任务管理器中看到它容纳635MB的ram内存。

我的问题是如何在不使用内存流的情况下直接将数据从HttpClient写入文件,换句话说,如何在HttpClient下载数据时将数据写入文件?

犬儒

要发出请求,请使用SendAsync重载,该重载允许您指定HttpCompletionOption并使用ResponseHeadersRead但是,您必须手动构建请求,而无需使用PostAsJsonAsync便捷方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用HttpClient下载Web API大文件

来自分类Dev

如何使用Angular的httpClient下载大文件(> 1GB)?

来自分类Dev

使用PowerShell下载大文件

来自分类Dev

下载大文件

来自分类Dev

大文件下载cherrypy

来自分类Dev

下载大文件

来自分类Dev

大文件下载cherrypy

来自分类Dev

从HDFS下载大文件

来自分类Dev

Web API的哪种HTTP请求方法可接收大文件

来自分类Dev

使用内存流下载大文件

来自分类Dev

如何使用wget下载大文件?

来自分类Dev

使用ftp协议下载大文件

来自分类Dev

对大文件使用ddply

来自分类Dev

php下载大文件失败

来自分类Dev

下载Dartlang中的大文件

来自分类Dev

symfony巨大文件下载

来自分类Dev

下载大文件挂起系统

来自分类Dev

下载Dartlang中的大文件

来自分类Dev

如何分块下载大文件

来自分类Dev

IE下载大文件的问题

来自分类Dev

下载大文件或显示错误

来自分类Dev

QT下载大文件错误

来自分类Dev

使用FileReader(Web API)在浏览器中读取大文件

来自分类Dev

使用WEB API模拟文件下载

来自分类Dev

使用closedxml从web api下载excel文件

来自分类Dev

使用HttpClient进行异步文件下载

来自分类Dev

Google Drive API V3内存不足,无法下载大文件

来自分类Dev

WCF或Web API最适合使用Windows服务(自助主机,而不是IIS)中的流(大文件)上传文件吗?

来自分类Dev

在HttpWebRequest完成大文件流传输之前的Web API发布命中