上传大文件异步而不处理它

Upload large file async without disposing it

我正在构建一个 .NET Core 3.1 WEB API,它将接收一个大文件(最大 500MB),如果有效,return 对客户端的 200 响应,并且仅在然后,将上传的文件上传到 Azure Blob 容器。

我遇到的问题是 Request/Stream 在我 return 对客户端的响应后被处理(我相信),它没有给我任何错误,也没有已上传。

我尝试了一些替代方案但没有成功:

成功上传文件的唯一方法是我在本地保留文件或强制用户等待,但如果可以的话我宁愿不这样做。

有没有人知道我如何才能做到这一点?


编辑:

我使用文件上传操作(和 return 带有文件上传操作 ID 的 202)在数据库上创建一个资源,并根据上传到 Azure Blob 存储的成功更新它的状态.

用户可以在不同的 API 端点上检查上传状态。

我只想知道是否有一种方法可以在响应 returned 后真正持久化文件流或任何对象。

你的问题涉及到根本问题....

if it's valid, return a 200 response to the client and only after that, upload the uploaded file to an Azure Blob Container.

在很多情况下,这会导致客户端获得 200 而您没有将其上传到博客容器,因此 200 是一个谎言。因此,您不应该那样做。所以,这个问题没有实际意义。

最重要的是,您不能真正做到这一点,因为 asp.net 将处置您获得的文件,因为这就是 asp.net 的工作方式 - 变量是请求上下文的一部分,因此会被处置在最后。

如果浏览器提供 Expect: Continue header。然后,在客户端发送任何文件数据之前,您可以根据提供的请求 headers 使请求失败。或者用 100 继续响应并读取文件数据。

但是,如果您想保留该文件数据,则必须先将其复制到某处,然后才能 return 向客户端发送状态代码。进入内存,进入本地磁盘,或将其一直流式传输到后端 blob 容器。这就是 HTTP 的工作原理。

The only way the file is successfully uploaded is if either I persist the file locally or force the user to wait

您可以将流复制到 MemoryStream,然后将其传递给后台进程进行上传。但它会占用大量内存,并且无法在应用程序重启后继续存在。

将流复制到本地文件,并将其传递给后台进程至少不会为每个请求占用 500MB 的内存,并且可以在应用程序重新启动后继续存在。