实现“使用流上载大文件”(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>();
}我正在使用Razor和.NET控制器应用程序Razor和Mvc 5.0。
发布于 2022-11-16 16:34:26
今天有一段节目单。同样的方法也适用于我。关键是删除所有三个提供程序;在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)
{
//..
}https://stackoverflow.com/questions/72618797
复制相似问题