问题
I get an exception when I try to read multi part content from the request saying the content may have already been read by another component.
if (MultipartRequestHelper.IsMultipartContentType(Request.ContentType))
{
// Used to accumulate all the form url encoded key value pairs in the
// request.
var formAccumulator = new KeyValueAccumulator();
var boundary = Request.GetMultipartBoundary();
var reader = new MultipartReader(boundary, HttpContext.Request.Body);
var section = await reader.ReadNextSectionAsync();
while (section != null)
{
ContentDispositionHeaderValue contentDisposition;
var hasContentDispositionHeader =
ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out contentDisposition);
}
}
回答1:
It turns out that I had to disable form value model binding by using the attribute below.
[HttpPost]
[Route("")]
[DisableFormValueModelBinding]
public async Task<IActionResult> Post()
The attribute implementation is below
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class DisableFormValueModelBindingAttribute : Attribute, IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context)
{
var factories = context.ValueProviderFactories;
factories.RemoveType<FormValueProviderFactory>();
factories.RemoveType<JQueryFormValueProviderFactory>();
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
}
}
回答2:
In asp.net core 3, You have to add factories.RemoveType<FormFileValueProviderFactory>();
to your DisableFormValueModelBindingAttribute
attribute.
Code
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class DisableFormValueModelBindingAttribute : Attribute, IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context)
{
var factories = context.ValueProviderFactories;
factories.RemoveType<FormValueProviderFactory>();
factories.RemoveType<FormFileValueProviderFactory>();
factories.RemoveType<JQueryFormValueProviderFactory>();
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
}
}
Documentation
回答3:
I used [DisableFormValueModelBinding]
but still got error, then i also use:
if (Request.ContentLength == 0)
return BadRequest();
回答4:
There is bug about that in Microsoft.AspNetCore.App 2.1.4
. I updated this package to 2.1.12
version and it resolved.
回答5:
In my case it was "postman" issue. I sent the file to the REST endpoint. And at some point I started to get this error, but the code was not changed.
I re-selected this file again in "postman" and everything worked as before.
来源:https://stackoverflow.com/questions/49867343/unexpected-end-of-stream-the-content-may-have-already-been-read-by-another-comp