title: Server cannot set status after HTTP headers have been sent in my C# .NET MVC Application while exporting datatable to spreadsheet
body: <p>I am trying to Export datatable to spreadsheet.
  I am getting this exception </p>
  
  <p><code>Server cannot set status after HTTP headers have been sent.</code></p>
  
  <p>on this line </p>
  
  <p><code>httpContext.Response.StatusCode = ex is HttpException ? ((HttpException)ex).GetHttpCode() : 500;</code></p>
  
  <p>Please help what can I do for solving this...</p>
  
  <p>For Reference I am adding full code here::::
  The code of export function is  </p>
  
  <pre><code>   public static void ExportToSpreadsheet(DataTable table, string name)
              {
                  HttpContext context = HttpContext.Current;
                  context.Response.Clear();
  
                  foreach (DataColumn column in table.Columns)
                  {
                      context.Response.Write(column.ColumnName + ";");
                  }
  
                  context.Response.Write(Environment.NewLine);
  
                  foreach (DataRow row in table.Rows)
                  {
                      for (int i = 0; i &lt; table.Columns.Count; i++)
                      {
                          context.Response.Write(row[i].ToString().Replace(";", string.Empty) + ";");
                      }
                      context.Response.Write(Environment.NewLine);
                  }
  
                  string saveAsFileName = string.Format("Results-{0:d}.xls", DateTime.Now);
  
                  context.Response.ContentType = "application/vnd.ms-excel";
                  context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", saveAsFileName));
                  context.Response.End();
              }
  </code></pre>
  
  <p>the exception got catched in <code>global.asax.cs</code> in <code>Application_Error</code> function</p>
  
  <pre><code>protected void Application_Error(object sender, EventArgs e)
          {
              var httpContext = ((MvcApplication)sender).Context;
              //var currentController = " ";
              //var currentAction = " ";
              string currentController;
              string currentAction;
              var currentRouteData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
              currentController = "";
              currentAction = "";
              if (currentRouteData != null)
              {
                  if (currentRouteData.Values["controller"] != null &amp;&amp; !String.IsNullOrEmpty(currentRouteData.Values["controller"].ToString()))
                  {
                      currentController = currentRouteData.Values["controller"].ToString();
                  }
  
                  if (currentRouteData.Values["action"] != null &amp;&amp; !String.IsNullOrEmpty(currentRouteData.Values["action"].ToString()))
                  {
                      currentAction = currentRouteData.Values["action"].ToString();
                  }
              }
              else
              {
                  currentController = "Home";
                  currentAction = "Index";
              }
  
              var ex = Server.GetLastError();
              var controller = new ErrorController();
              var routeData = new RouteData();
              var action = "Error";
  
              if (ex is HttpException)
              {
                  var httpEx = ex as HttpException;
  
                  switch (httpEx.GetHttpCode())
                  {
                      case 400:
                          action = "BadRequest";
                          break;
  
                      case 401:
                          action = "Unauthorized";
                          break;
  
                      case 403:
                          action = "Forbidden";
                          break;
  
                      case 404:
                          action = "NotFound";
                          break;
  
                      case 408:
                          action = "RequestTimeout";
                          break;
  
                      case 500:
                          action = "InternalServerError";
                          break;
  
                      case 502:
                          action = "BadGateway";
                          break;
  
                      case 503:
                          action = "ServiceUnavailable";
                          break;
  
                      case 504:
                          action = "GatewayTimeout";
                          break;
                  }
              }
  
              httpContext.ClearError();
              httpContext.Response.Clear();
              // on this below line exception occurs
              httpContext.Response.StatusCode = ex is HttpException ? ((HttpException)ex).GetHttpCode() : 500;
              httpContext.Response.TrySkipIisCustomErrors = true;
  
              routeData.Values["controller"] = "Error";
              routeData.Values["action"] = action;
  
              controller.ViewData.Model = new HandleErrorInfo(ex, currentController, currentAction); 
              ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData));
  
              // to set error details in HandleErrorInfo model to send email notification
              ErrorController.setHandleErrorInfoModel(new HandleErrorInfo(ex, currentController, currentAction));                
          }
  </code></pre>