使用 Blazor 和 Aspnet Webapi 跟踪 HttpClient.PostAsync 进度

Posted

技术标签:

【中文标题】使用 Blazor 和 Aspnet Webapi 跟踪 HttpClient.PostAsync 进度【英文标题】:Tracking HttpClient.PostAsync progress using Blazor and Aspnet Webapi 【发布时间】:2021-10-02 11:13:58 【问题描述】:

我目前正在使用 Blazor 和 Asp.Net WebApi Controller 执行一些文件上传/下载。我在 Blazor 客户端中调用了一个 UploadFiles(),如下所示:

public async Task<bool> UploadFiles(Action<int> callback, IReadOnlyList<IBrowserFile> files, string subdir = "")

    if (files != null)
    
        var content = new MultipartFormDataContent();
        foreach (var file in files)
        
            var fileContent = new StreamContent(file.OpenReadStream(_allowedMaxFileSize));
            content.Add(fileContent, "\"files\"", file.Name);  
            hasItemsForUpload = true;
        

        if (content != null)
        
            var uri = $@"api/mycontroller/upload?subdir=" + subdir;
            var result = await _http.PostAsync(uri, content);

            if (result.IsSuccessStatusCode)
                                   
                return true;
            
        
        

    return false;

有没有办法让我轻松跟踪 httpclient.postasync() % 进度,我可以在回调中将 % 作为 int 传递?注意这里的_http是通过注册为startup.cs的AddScope()的依赖注入注入的

我见过使用自定义 http 内容的复杂示例,但我似乎无法理解它... :(

请帮忙..

【问题讨论】:

您是要跟踪单个http请求的进度还是整体批量上传? 嗨@MayurEkbote,为了简单起见,我可以跟踪整个http请求,不需要跟踪每个文件...... :) 对一个文件发出一个http请求有限制吗?它还将使报告进度简单明了。 @MayurEkbote 没有限制,如果每个http请求一个文件也可以...请教我如何使用进度跟踪来做到这一点? 【参考方案1】:

文件组件.razor

<div> Progress: @current </div>

@code

  int current = 0;
  
  void UpdateProgress()
  
    current++;
    StateHasChanged();
  
  void ResetBatch() current=0; 

  
  public async Task<bool> UploadFiles(Action<int> callback, IReadOnlyList<IBrowserFile> files, string subdir = "")

    ResetBatch();
    if (files != null)
    
        var content = new MultipartFormDataContent();
        foreach (var file in files)
        
            var fileContent = new StreamContent(file.OpenReadStream(_allowedMaxFileSize));
            content.Add(fileContent, "\"files\"", file.Name);  
            hasItemsForUpload = true;
        if (content != null)
        
            var uri = $@"api/mycontroller/upload?subdir=" + subdir;
            var result = await _http.PostAsync(uri, content);
        
         

         UpdateProgress();
        
        
    ResetBatch();
    return true;


请注意,您可以创建一个完整的上传批处理类,而不是“当前”,其中包含要更新的总文件、文件名、当前文件名、每次上传的状态等信息。

【讨论】:

以上是关于使用 Blazor 和 Aspnet Webapi 跟踪 HttpClient.PostAsync 进度的主要内容,如果未能解决你的问题,请参考以下文章

AspNet.Cors 和 AspNet.WebApi.Cors 有啥区别?

Microsoft.AspNet.WebApi.OData 与 Microsoft.Data.OData 和 Microsoft.AspNet.OData 有啥区别?

Blazor WebApi 身份信息

Microsoft.AspNet.WebApi.Core 和过时的库

使用通过 Blazor WASM 使用 Windows 身份验证的 WebAPI

Blazor Server Webapi 不适用于邮递员