我正在使用.Net 4.7
,并通过HttpClient
将一些大文件上传到API。我遇到的问题是,当我使用ProgressMessageHandler
类处理程序时,在client.PostAsync()
调用实际完成之前,进度达到100%。即使我不再看到网络活动,应用程序仍然在“处理”请求。进度处理程序100%完成后的额外等待时间似乎与进度实际达到100%所用的时间成正比
编辑:除了状态码成功或失败之外,我实际上并不关心响应。我想知道所有文件何时完全上传到端点,请求何时完成。
public static async Task UploadFile(MyClass project)
{
using (var handler = new ProgressMessageHandler())
using (var client2 = HttpClientFactory.Create(handler))
using (var formData = new MultipartFormDataContent())
{
string jwtToken = User.JwtToken;
client2.Timeout = TimeSpan.FromMinutes(5);
client2.BaseAddress = new Uri("https://my-endpoint.com/api/");
client2.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", jwtToken);
client2.DefaultRequestHeaders.Accept.Clear();
FileStream fileToUpload = File.OpenRead(project.FilePath);
var multipartFormContent = new MultipartFormDataContent
{
{ new StringContent(project.ProjectMedia), "Name" },
{ new StreamContent(fileToUpload), "File", project.FilePath }
};
handler.HttpSendProgress += (s, e) =>
{
// This completes 100% in 5 seconds, for example
UpdateStatus(e.ProgressPercentage);
};
// This will take around another 5 seconds to complete..
var response = await client2.PostAsync("upload", multipartFormContent).Result.Content.ReadAsStringAsync();
Console.WriteLine("Complete");
}
}
1条答案
按热度按时间2uluyalo1#
这条线看起来很可疑:
1.您没有正确地等待
PostAsync()
任务-而是通过调用.Result
阻塞了线程1.同样的一行正在等待
ReadAsStringAsync()
。这是正在下载的数据,而您正在监听跟踪上传的HttpSendProgress
事件。HttpReceiveProgress
跟踪下载。忽略对响应的任何本地解析,
HttpSendProgress
和HttpReceiveProgress
达到100%所需的时间应该与ReadAsStringAsync()
完成的时间相对应。如果您没有下载太多数据,则可能是.Result
是您的主要问题。要修复上面的行,需要另一个
await
: