title: Unexpected end of Stream, the content may have already been read by another component
body: <p>I have some weird problem which happens to only 1 user of let's say 50.
  AFAIK He's using Chrome</p>
  
  <p>When he uploads file there's <code>Unexpected end of Stream, the content may have already been read by another component.</code> being thrown</p>
  
  <p>Here's my endpoint:</p>
  
  <pre><code>[HttpPost]
  public async Task&lt;JsonResult&gt; UploadFile(IFormFile file, int type, string otherParam)
  </code></pre>
  
  <p>The thing is that I have middleware which logs every request, so it is reading requests and setting body position to 0</p>
  
  <pre><code>using Microsoft.AspNetCore.Http;
  using Microsoft.AspNetCore.Mvc;
  using Microsoft.AspNetCore.Mvc.Controllers;
  using Microsoft.AspNetCore.Mvc.Filters;
  using Services;
  using System;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;
  using Microsoft.AspNetCore.Http.Internal;
  using Serilog;
  using Newtonsoft.Json;
  using Common.Users;
  
  public class LoggerMiddleware
  {
      private readonly RequestDelegate next;
  
      public LoggerMiddleware(RequestDelegate next)
      {
          this.next = next;
      }
  
      public async Task Invoke(HttpContext ctx)
      {
          var request = await FormatRequest(ctx.Request, ctx);
          Log.Information(request);
          await next(ctx);
      }
  
      //hack
      private string[] endpoints_with_passwords = new string[] { "/Account/ChangePassword", "/Login" };
  
      private async Task&lt;string&gt; FormatRequest(HttpRequest request, HttpContext ctx)
      {
          Log.Information("Entering Logging Middleware");
  
          request.EnableRewind();
          var length = Convert.ToInt32(request.ContentLength);
  
          // in order to prevent having content of large files in logs...
          if (length &gt; 30000)
              return $"file with length: {length} sent by User: '{ctx?.User?.Identity?.Name}'";
  
          var buffer = new byte[length];
          await request.Body.ReadAsync(buffer, 0, buffer.Length);
          var bodyAsText = Encoding.UTF8.GetString(buffer);
  
          // "hack" in order to do not log passwords
          if (endpoints_with_passwords.Contains(request.Path.Value))
          {
              Log.Information("endpoints with password");
              try
              {
                  var data = JsonConvert.DeserializeObject&lt;LoginModel&gt;(bodyAsText);
                  var ip = request.HttpContext.Connection.RemoteIpAddress;
                  bodyAsText = $"IP: {ip} - UserName: {data?.UserName}";
              }
              catch (Exception ex)
              {
                  EmailService.SendExceptionEmail(ex);
                  Log.Error(ex.Message);
              }
          }
  
          Log.Information("Body Position = 0");
          request.Body.Position = 0;
  
          return $"User: '{ctx?.User?.Identity?.Name}' {Environment.NewLine} {request.Scheme} {request.Host}{request.Path} {Environment.NewLine} {request.QueryString} {Environment.NewLine} {bodyAsText}";
      }
  }
  </code></pre>
  
  <p>I thought that early return in </p>
  
  <pre><code>if (length &gt; 30000)
      return $"file with length: {length} sent by User: '{ctx?.User?.Identity?.Name}'";
  </code></pre>
  
  <p>may cause problems, but when file's too large, then I'm receiving <code>Request body too large.</code></p>
  
  <p>so that's different error</p>
  
  <p>Here's SeriLog which shows difference</p>
  
  <p>Logs:
  Working fine upload by other User:</p>
  
  <pre><code>2020-01-22 14:35:13.003 +01:00 [INF] User: 'A' 
   http localhost:5004/File/AddAttachment/1/attachment
   ?_=1579699970169 
   ------WebKitFormBoundarywlRNAu9AuOB6xBUD
  Content-Disposition: form-data; name="file"; filename="some.docx"
  Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
  2020-01-22 14:35:13.083 +01:00 [INF] Route matched with {action = "AddAttachment", controller = "File"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.JsonResult] AddAttachment(Microsoft.AspNetCore.Http.IFormFile, Int32, System.String) on controller Controllers.FileController (APP).
  2020-01-22 14:35:13.083 +01:00 [INF] Authorization was successful.
  </code></pre>
  
  <p>Broken, sent by this (above mentioned) one particular User:</p>
  
  <pre><code>2020-01-24 16:29:24.677 +01:00 [INF] User: 'B' 
   http localhost:5004/File/AddAttachment/1/attachment
   ?_=1579711474176 
  2020-01-24 16:29:24.677 +01:00 [INF] Route matched with {action = "AddAttachment", controller = "File"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.JsonResult] AddAttachment(Microsoft.AspNetCore.Http.IFormFile, Int32, System.String) on controller Controllers.FileController (APP).
  2020-01-24 16:29:24.677 +01:00 [INF] Authorization was successful.
  2020-01-24 16:29:27.381 +01:00 [ERR] 01/24/2020 16:29:25: Exception! (...) Unexpected end of Stream, the content may have already been read by another component.
  </code></pre>
  
  <p>anybody has an idea what may go wrong? or how to debug that?</p>
  
  <p>.NET Core 2.1</p>
  
  <p>We're posting those files via JS.</p>
  
  <p>Edit:
  Issue on GH <a href="https://github.com/dotnet/aspnetcore/issues/18087" rel="nofollow noreferrer">https://github.com/dotnet/aspnetcore/issues/18087</a></p>