0

Implementing "Upload large files with streaming" (https://learn.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-6.0) gives me this error:

Unexpected end of Stream, the content may have already been read by another component.

It happens when executing 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();

After hours of trying to find an answer i decided to post the issue here.

The DisableFormValueModelBinding filter won't solve this issue.

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

I am using .NET 5.0, with a Razor and Mvc Controller application.

Olof84
  • 919
  • 4
  • 14
  • 29

1 Answers1

0

Today had kind of this excersice. The same approach worked for me. The key was to remove all the three providers; in the MS sample only two removed.

[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)
    {
    }
}

and then

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