首页 > 解决方案 > ASP.NET 如何报告 UploadProgress?

问题描述

基于this question and answer ASP.NET Core 2.0 and Angular 4.3 File Upload with progress

ASP.NET 返回 HTTP 事件 - 上传进度和最终响应:

[HttpPost, DisableRequestSizeLimit, Route("api/files")]
public async Task UploadFiles()
{
    var files = Request.Form.Files; // now you have them
}

Angular 接受响应并处理:

this.http.request(req).subscribe(event => {
            if (event.type === HttpEventType.UploadProgress)
                this.uploadProgress = Math.round(100 * event.loaded / event.total);
            else if (event instanceof HttpResponse)
                console.log('Files uploaded!');
        });

我的问题:

1) 上述 ASP.NET 代码的哪一部分告诉它必须响应 UploadProgress 直到上传过程完成?它怎么知道是一个需要响应UploadProgress的请求呢?ASP.NET 源代码中返回 UploadProgress 的代码在哪里?(https://github.com/aspnet/AspNetCore

2) 整体流程,这是一个 HTTP 规范吗?显然,有一条规则,到目前为止我找不到任何关于它的文档。

标签: c#asp.netangularfile-upload

解决方案


上述 ASP.NET 代码的哪一部分告诉它必须响应 UploadProgress

没有。ASP.NET Core 不这样做。

  • HttpPost表示要接受 POST 请求形式的数据。
  • DisableRequestSizeLimit表示您不希望 ASP.NET Core 阻止文件上传超过预定义的限制(我相信是 30 MB)。
  • Route定义路由的 URL。

总体流程,这是一个 HTTP 规范吗?显然,有一条规则,到目前为止我找不到任何关于它的文档。

不,不是。这不是必需的。客户端知道它成功发送了多少数据,这就是进度的来源。

Angular HTTP 库是围绕 构建的XMLHttpRequest,它有一个Progress 事件

在此示例中由 updateProgress() 函数指定的进度事件处理程序接收要传输的总字节数以及事件的总和加载字段中到目前为止传输的字节数。但是,如果 lengthComputable 字段为 false,则总长度未知并且将为零。

下载和上传传输都存在进度事件。下载事件在 XMLHttpRequest 对象本身上触发,如上面的示例所示。上传事件在 XMLHttpRequest.upload 对象上触发...

因此,Angular HTTP 库只是挂钩到本地请求对象的进度事件,然后以更简洁的方式提供给您。


推荐阅读