我从网络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] 删除。
我来说两句