【问题标题】:Server cannot set status after HTTP headers have been sent - ELMAH发送 HTTP 标头后服务器无法设置状态 - ELMAH
【发布时间】:2015-11-07 13:09:00
【问题描述】:

我一直通过 ELMAH 收到此错误。即使程序完成了它的预期操作,我仍然通过 ELMAH 收到此错误,我想知道原因并修复它。我已经浏览了其他线程并尝试使用这些建议,但到目前为止我读过的任何内容似乎都不起作用。

它的预期操作是创建一个 excel 文档,然后将用户重定向到他们刚才所在的页面。

动作结果:

 public ActionResult ExportClaimNumberReport(int ClientID, string ClaimNo) {
    ClaimNumberViewModel model = ClaimNumberReport(ClientID, ClaimNo);

    CreateExcelFile.CreateExcelDocument(
        model.ReportData.ToList(), 
        model.ReportDescription + (".xlsx"), 
        HttpContext.ApplicationInstance.Response);
    ViewBag.client = client;

    Response.Buffer = true;

    Response.Redirect(Request.UrlReferrer.ToString());
    if (!Response.IsRequestBeingRedirected) {
       Response.Redirect("/Error/ErrorHandler");
    }
    return RedirectToAction("ErrorHandler", "Error");
}

如果您需要更多信息,请告诉我

【问题讨论】:

    标签: c# asp.net-mvc error-handling


    【解决方案1】:

    您将收到错误消息,因为您正在进行 2 次重定向。

    曾经来过

    Response.Redirect(Request.UrlReferrer.ToString());
    

    然后在这里:

    return RedirectToAction("ErrorHandler", "Error");
    

    所以第一个重定向会将重定向标头写入响应流,然后第二个会尝试再次执行此操作,但显然您不能将 http 标头发送到浏览器两次,因此会引发异常。但是用户不会注意到,因为在抛出异常时浏览器已经被告知重定向到其他地方。

    您要做的只是调用 Redirect 方法作为控制器操作的返回语句。

    所以替换所有这些:

    Response.Redirect(Request.UrlReferrer.ToString());
    if (!Response.IsRequestBeingRedirected) // this would always be false anyway 
    {
       Response.Redirect("/Error/ErrorHandler");
    }
    return RedirectToAction("ErrorHandler", "Error");
    

    有了这个:

    return Redirect(Request.UrlReferrer.ToString())
    

    虽然您将浏览器重定向回引用页面的原因尚不清楚。

    【讨论】:

    • 嗨,我的原始代码是您建议的代码。我意识到我拥有的代码相当奇怪,但我拥有它是因为我正在尝试一些在线发布的解决方案。但是,我意识到我什至不需要返回任何东西,所以我将 ActionResult 设置为 void
    猜你喜欢
    • 2014-01-27
    • 2011-01-23
    • 1970-01-01
    • 2019-07-22
    • 2016-08-27
    • 2015-06-24
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    相关资源
    最近更新 更多