MultipartReader问题,内容已被另一个组件读取



实现"上载大文件"(https://learn.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-6.0)给了我这个错误:

流意外结束,内容可能已经被读取另一个组件。

在执行reader.ReadNextSectionAsync():

时发生
[HttpPost]
[DisableFormValueModelBinding]
[ValidateAntiForgeryToken]
public async Task<IActionResult> UploadPhysical()
{
if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType))
{
ModelState.AddModelError("File",
$"The request couldn't be processed (Error 1).");
return BadRequest(ModelState);
}
var boundary = MultipartRequestHelper.GetBoundary(
MediaTypeHeaderValue.Parse(Request.ContentType),
_defaultFormOptions.MultipartBoundaryLengthLimit);
var reader = new MultipartReader(boundary, HttpContext.Request.Body);
var section = await reader.ReadNextSectionAsync();

经过几个小时的努力寻找答案,我决定在这里发布这个问题。

DisableFormValueModelBinding过滤器不能解决这个问题。

public void OnResourceExecuting(ResourceExecutingContext context)
{            
var factories = context.ValueProviderFactories;
factories.RemoveType<FormValueProviderFactory>();
factories.RemoveType<FormFileValueProviderFactory>();
factories.RemoveType<JQueryFormValueProviderFactory>();            
}

我使用。net 5.0,带有Razor和Mvc控制器应用程序。

今天有这样的练习。同样的方法对我也有效。关键是要删除所有三个提供者;在MS样品中只有两个被去除。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class DisableFormValueModelBindingAttribute : Attribute, IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context)
{
var formValueProviderFactory = context.ValueProviderFactories
.OfType<FormValueProviderFactory>()
.FirstOrDefault();
if (formValueProviderFactory != null)
{
context.ValueProviderFactories.Remove(formValueProviderFactory);
}
var jqueryFormValueProviderFactory = context.ValueProviderFactories
.OfType<JQueryFormValueProviderFactory>()
.FirstOrDefault();
if (jqueryFormValueProviderFactory != null)
{
context.ValueProviderFactories.Remove(jqueryFormValueProviderFactory);
}
var formFileProviderFactory = context.ValueProviderFactories
.OfType<FormFileValueProviderFactory>()
.FirstOrDefault();
if (formFileProviderFactory != null)
{
context.ValueProviderFactories.Remove(formFileProviderFactory);
}
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
}
}

[DisableFormValueModelBinding]
public async Task<IActionResult> CreateOrUpdateResource(
[FromQuery] string session)
{
//..
}