c# - ASP.NET Core 中真正无缓冲的文件上传?

标签 c# http asp.net-core file-upload

ASP.NET Core documentation关于文件上传讨论了使用 MultipartReader 以无缓冲方式上传文件的选项,但是据我了解,这只会以无缓冲方式读取每个 MultipartSection - 它必须在调用代码之前读取整个 MultipartSection 并将整个部分缓冲在内存中(我已经通过日志记录确认了这一点,并且只有在 HTTP 请求完成发布后才会调用我的日志记录)。如果您将一个大文件作为一个 MultipartSection 上传,这不是很有用。

有没有一种方法可以在 ASP.NET Core 中进行真正的无缓冲上传(或者至少,让缓冲区小到 32kb)?当数据来自客户端时,我的代码可以使用它流式传输到磁盘或通过快速网络连接上传到其他地方?

最佳答案

it has to read a whole MultipartSection before your code gets called with the whole section being buffered in memory (I have confirmed this by logging, and my logging only gets called once the HTTP request has finished posting). If you're uploading a large file as one MultipartSection this isn't terribly helpful.

代码在 HTTP 请求完成发布后被调用一次。这是预料之中的,但这并不意味着 Asp.net Core 将缓冲数据。

正如文档中提到的,在 ASP.Net Core 中上传文件缓冲和流式传输有两种通用方法。对于缓冲方法,整个文件被读入一个IFormFile。而对于streaming,Asp.net core没有创建额外的对象,它直接从HttpContext.Request.Body中读取内容,而不是Asp.NET Core创建的IFormFile。

流媒体方法的目标是减少上传文件时对内存或磁盘空间的需求,如下所述:

文件从多部分请求中接收,并由应用程序直接处理或保存。流式传输不会显着提高性能。流式传输减少了上传文件时对内存或磁盘空间的需求。

关于c# - ASP.NET Core 中真正无缓冲的文件上传?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62309762/

相关文章:

c# - SemaphoreSlim 取消 token

ruby-on-rails - 在 Heroku 上使用 Postmark API 发送 Rails 电子邮件——连接被对等方重置

Java - 最快的 TCP/HTTP 通信流?

c# - 在 Docker 中运行 Blazor

c# - 如何为不同的子类实现接口(interface)的多个实例?

c# - 绑定(bind)到属性并传递自定义 StringFormat

c# - 在 C# 中将一个 byte[] 拆分为多个 byte[] 数组

c# - 如何删除 URL 中的占位符

angularjs - 如何全局配置 Laravel 的 Route::resource 以与 ng.resource(每个 ng 资源的 Laravel 路由)兼容?

c# - .Net Core 中的 DbContextTransaction 在哪里