c# - 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 规范吗?显然,有一条规则,到目前为止我找不到任何关于它的文档。
解决方案
上述 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 库只是挂钩到本地请求对象的进度事件,然后以更简洁的方式提供给您。
推荐阅读
- r - 在 geom_bar ggplot2 中操作 scale_y_log
- flutter - 根据 Flutter 中的索引,仅在一个文本跨度中进行字符着色
- graphql - 通过插件向 Gatsby 中的 MarkdownRemark 节点添加更多数据
- c# - System.Text.Json 反序列化有两个可能的属性名称
- laravel - Laravel - 查询未给出预期结果
- rust - 在宏中使用 Hashmap 作为 TokenTree
- sqlite - Sqlite 代码不显示任何调试日志?
- django - 页面 social_django.views.auth 在哪里?
- python - Pygame - blit 导致滞后
- google-apps-script - 显示表格的第一个非空白单元格