关于ReadAsMultipartAsync是否使用预加载缓冲区及LoadIntoBufferAsync对其读取来源影响的技术问询
关于ReadAsMultipartAsync是否使用预加载缓冲区及LoadIntoBufferAsync对其读取来源影响的技术问询
问题描述:
If I use Request.Content.LoadIntoBufferAsync() to limit the buffer size, does Request.Content.ReadAsMultipartAsync() read the content from this preloaded buffer, or does it read the content fresh?
附上对应的代码实现:
[HttpPost] [Route("uploadFile")] public async Task<HttpResponseMessage> UploadFile() { if (!Request.Content.IsMimeMultipartContent()) return Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, "Content must be multipart/form-data."); try { try { await Request.Content.LoadIntoBufferAsync(MaxFileSizeBytes); } catch (HttpRequestException ex) { return Request.CreateErrorResponse(HttpStatusCode.BadRequest,ex.Message); } var provider = await Request.Content.ReadAsMultipartAsync(new MultipartMemoryStreamProvider()); // ... 后续处理逻辑 } catch (Exception ex) { // 异常处理 return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message); } }
解答:
嘿,这个问题抓得很准,我来给你讲明白其中的逻辑:
- 当你调用
Request.Content.LoadIntoBufferAsync(MaxFileSizeBytes)时,它会把整个请求内容加载到内存缓冲区中,如果请求内容的大小超过你设置的MaxFileSizeBytes,就会直接抛出HttpRequestException——这正是你代码里提前做大小拦截的逻辑。 - 一旦完成缓冲区加载,后续调用
ReadAsMultipartAsync时,它会直接从这个预加载好的缓冲区里读取内容,不会再去读取原始的请求流。这是因为LoadIntoBufferAsync会替换HttpContent内部的底层流为一个缓冲流,所有后续的读取操作都会复用这个缓冲。
换句话说,你现在的做法是完全合理的:先通过缓冲区做全局的大小限制,把超出阈值的请求直接挡在前面,之后再安全地解析多部分内容,不用担心后续解析过程中还会出现大小超限的问题。
如果不提前调用LoadIntoBufferAsync,ReadAsMultipartAsync会直接读取原始请求流,这时候要限制大小就得在自定义的MultipartProvider里做逐段检查,反而更繁琐。你当前的方案在前置拦截这一步更高效。
备注:内容来源于stack exchange,提问作者YMK
相关产品推荐
相关产品推荐

