title: ASP.NET Web API 2 - StreamContent is extremely slow
body: <p>We've ported a project from WCF to Web API (SelfHost) and during the process we noticed a huge slowdown when serving out a web application. Now 40-50 seconds vs 3 seconds previously.</p>
  
  <p>I've reproduce the issue in a simple console application by adding the various Nuget pacakges for AspNet.WebApi and OwinSelfHost with the following controller:</p>
  
  <pre><code>var stream = new MemoryStream();
  using (var file = File.OpenRead(filename))
  {
      file.CopyTo(stream);
  }
  stream.Position = 0;
  
  var response = Request.CreateResponse(System.Net.HttpStatusCode.OK);
  
  /// THIS IS FAST
  response.Content = new ByteArrayContent(stream.ToArray());
  /// THIS IS SLOW
  response.Content = new StreamContent(stream);
  
  response.Content.Headers.ContentType = new MediaTypeHeaderValue(System.Web.MimeMapping.GetMimeMapping(filename));            
  response.Content.Headers.ContentLength = stream.Length;
  </code></pre>
  
  <p>As you can see from the code the only difference is the usage of StreamContent (slooooow) vs ByteArrayContent.</p>
  
  <p>The application is hosted on a Win10 machine and accessed from my laptop.
  Fiddler shows that it takes 14 seconds to get a single 1MB file from the server to my laptop using StreamContent while ByteArrayContent is less than 1s.</p>
  
  <p>Also note that the complete file is read into memory to show that the only difference is the Content class used.</p>
  
  <p>The strange thing is that it seems that its the transfer itself that is slow. The server responds with the headers quickly/immediately, but the data takes a long time to arrive as shown by the Fiddler timing info:</p>
  
  <pre><code>GotResponseHeaders: 07:50:52.800
  ServerDoneResponse: 07:51:08.471
  </code></pre>
  
  <p>Complete Timing Info:</p>
  
  <pre><code>== TIMING INFO ============
  ClientConnected:    07:50:52.238
  ClientBeginRequest: 07:50:52.238
  GotRequestHeaders:  07:50:52.238
  ClientDoneRequest:  07:50:52.238
  Determine Gateway:  0ms
  DNS Lookup:         0ms
  TCP/IP Connect:     15ms
  HTTPS Handshake:    0ms
  ServerConnected:    07:50:52.253
  FiddlerBeginRequest:07:50:52.253
  ServerGotRequest:   07:50:52.253
  ServerBeginResponse:07:50:52.800
  GotResponseHeaders: 07:50:52.800
  ServerDoneResponse: 07:51:08.471
  ClientBeginResponse:07:51:08.471
  ClientDoneResponse: 07:51:08.471
  
  Overall Elapsed:    0:00:16.233
  </code></pre>
  
  <p>Does anyone know what's going on under the hood that could explain the difference in behavior?</p>