.net C# HttpClient上传完成百分比在实际上传完成之前完成

krcsximq  于 2023-04-22  发布在  .NET
关注(0)|答案(1)|浏览(160)

我正在使用.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");
            }
        }
2uluyalo

2uluyalo1#

这条线看起来很可疑:

var response = await client2.PostAsync("upload", multipartFormContent).Result.Content.ReadAsStringAsync();

1.您没有正确地等待PostAsync()任务-而是通过调用.Result阻塞了线程
1.同样的一行正在等待ReadAsStringAsync()。这是正在下载的数据,而您正在监听跟踪上传的HttpSendProgress事件。HttpReceiveProgress跟踪下载。
忽略对响应的任何本地解析,HttpSendProgressHttpReceiveProgress达到100%所需的时间应该与ReadAsStringAsync()完成的时间相对应。如果您没有下载太多数据,则可能是.Result是您的主要问题。
要修复上面的行,需要另一个await

var response = await client2.PostAsync("upload", multipartFormContent);
var responseData = await response.Content.ReadAsStringAsync();

相关问题