title: Sending file over HttpContext causes browser to hang
body: <p>I am sending a file to the user using a HttpHandler. On all browsers, after viewing/downloading the file at least once, the browser/application on subsequent views/downloads hangs. Here is the code:</p>
  
  <pre><code>    private void TransmitFile(HttpContext context, string filePath, string downloadName, bool forceDownload)
      {
          if (File.Exists(filePath))
          {
              string fileName = System.IO.Path.GetFileName(filePath);
              string extension = Path.GetExtension(filePath);
              FileInfo fileInfo = new FileInfo(filePath);
  
              // set the response info/headers
              context.Response.ClearContent();
              context.Response.ClearHeaders();
              context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
              if (forceDownload)
              {
                  context.Response.AddHeader("Content-Disposition", "attachment; filename=" + downloadName.Replace(" ", "_") + extension);
                  context.Response.BufferOutput = false;
              }
  
              string type = "";
              // set known types based on file extension  
              if (extension != null)
              {
                  switch (extension.ToLower())
                  {
                      case ".tif":
                      case ".tiff":
                          type = "image/tiff";
                          break;
                      case ".jpg":
                      case ".jpeg":
                          type = "image/jpeg";
                          break;
                      case ".gif":
                          type = "image/gif";
                          break;
                      case ".doc":
                      case ".rtf":
                          type = "Application/msword";
                          break;
                      case "pdf":
                          type = "Application/pdf";
                          break;
                      case "png":
                          type = "image/png";
                          break;
                      case "bmp":
                          type = "image/bmp";
                          break;
                      default:
                          type = "application/octet-stream";
                          break;
                  }
              }
  
              context.Response.ContentType = type;
              context.Response.TransmitFile(filePath);
              context.Response.Flush();
          }
          else
          {
              Immersive.Diagnostics.Log.Warn("Requested file does not exist: " + filePath, this);
              Immersive.Diagnostics.Log.Warn("", this);
          }
      }
  </code></pre>
  
  <p>I have read that calling Response.Close() and Response.End() is not a good idea? Have tried both leaving in, and removing, and it still happens.</p>
  
  <p><strong>EDIT:</strong></p>
  
  <p>It seems that TransmitFile has known issues. A more thorough explanation can be found at:
  <a href="http://www.improve.dk/blog/2008/03/29/response-transmitfile-close-will-kill-your-application" rel="nofollow noreferrer">http://www.improve.dk/blog/2008/03/29/response-transmitfile-close-will-kill-your-application</a></p>
  
  <p>I removed TransmitFile and changed to WriteFile, and it now works perfectly.</p>
  
  <pre><code>context.Response.WriteFile(filePath);
  context.Response.Flush();
  context.Response.Close();
  </code></pre>