title: .NET 4.5 HttpTaskAsyncHandler upload a file
body: <p>I am trying to work out how to use the new asp.net 4.5 async handlers as well as the Request.GetBufferlessInputStream to write a image upload out to disk. This code runs and it writes a file out but the image is corrupt and I am not sure why. Here is the code I am using</p>
  
  <pre><code>public class UploadHandler : HttpTaskAsyncHandler
  {
      public override Task ProcessRequestAsync(HttpContext context)
      {
          // Gets a Stream object that can be used to read the 
          // incoming HTTP entity body, optionally disabling the
          // request-length limit that is set in the MaxRequestLength property.
  
          // This method provides an alternative to using the 
          // InputStream property. The InputStream property waits until the
          // whole request has been received before it returns a Stream object. 
          // In contrast, the GetBufferlessInputStream method returns
          // the Stream object immediately. 
          // You can use the method to begin processing the 
          // entity body before the complete contents of the 
          // body have been received.
          // The entity body (or as much of it as you request and has
          // been received) is returned only when you use the object that 
          // is returned by this method to read the stream, by calling 
          // methods such as the Read method. You use parameters of the 
          // Read method to specify how much of the entity body to read.
  
          // This method can be useful if the request is uploading a 
          // large file and you want to begin accessing the file contents
          // before the upload is finished. 
          // However, you should only use this method for scenarios where
          // you want to take over all processing of the entity body. 
          // This means that you cannot use this method from an .aspx page, 
          // because by the time an .aspx page runs, the entity body 
          // has already been read.
  
          using (Stream input = context.Request.GetBufferlessInputStream(true))
          using (var file = new FileStream("C:\\myfile.jpg", FileMode.Create, 
              FileAccess.Write, FileShare.Write))
          {
              input.CopyTo(file);
          }
  
          context.Response.ContentType = "text/plain";
          return context.Response.Output.WriteAsync("Done");
      }
  }
  </code></pre>