【问题标题】:Error in MVC redirect: Server cannot append header after HTTP headers have been sentMVC 重定向中的错误:发送 HTTP 标头后服务器无法附加标头
【发布时间】:2014-06-10 15:36:02
【问题描述】:

我想在用户首次加载网站时进行简单的重定向。 为此,我只访问 BaseController 的 BeginExecuteCore() 方法上的 RouteData,如果 URL 没有特定值,那么我将重定向到另一个 https route

  public class BaseController : Controller
  {
        protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
        {
            // access route data

            if (condition == true)
               Response.Redirect(string.Format("https://{0}/en/en", Request.Url.Authority), true);
            }
        }
  }

一些事实:

  1. 我达到了我想要的结果
  2. 我收到异常“服务器无法在发送 HTTP 标头后附加标头。”
  3. 我尝试了几种替代方法:使用其他方法进行重定向,例如 Initialize(RequestContext requestContext)
  4. 我尝试在重定向方法中使用参数EndResponse=true
  5. 我尝试在进行重定向之前清除标题
  6. 在之前的所有实验中,我都遇到了同样的异常
  7. 我正在使用MVC 5

我的问题是: 如果知道我需要访问 RouteData 并且不会抛出烦人的异常,如何以最有效的方式将用户重定向到另一条路由?

谢谢!

【问题讨论】:

    标签: asp.net-mvc https http-headers


    【解决方案1】:

    Response.Redirect(anyUrl) 导致302 状态码 而Html.AntiForgeryToken()302状态码正常冲突。

    您可以将以下代码放入Application_Start

    AntiForgeryConfig.SuppressXFrameOptionsHeader = true;
    

    安全警告:SuppressXFrameOptionsHeader =true 阻止您的 网站不会被加载到 iframe 中。

    read more

    【讨论】:

      【解决方案2】:

      我不熟悉 BeginExecuteCore() 方法,因为我仍在使用 mvc 3 和 4。

      在 mvc 4 中,我会使用操作过滤器在页面加载之前检查某些内容。

      您看到该错误的原因可能是因为页面已经被加载,您将延迟重定向用户。

       public class LogActionFilter : ActionFilterAttribute
         {
                public override void OnActionExecuting(ActionExecutingContext filterContext)
                {
                      if (condition == true)
                     filterContext.Response.Redirect(string.Format("https://{0}/en/en", Request.Url.Authority), true);
                }     
           }
      

      看看:http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs

      【讨论】:

      • 不幸的是它没有。我得到了同样的例外。这是我所做的(以确保我没有做任何我不应该做的事情) 1. 我调整了您的方法,因为 filterContext 公开请求和响应的方式发生了一些变化(它有效,我可以检索我需要的信息) 2. 使用 [LogActionFilter] 装饰 BaseController
      • 3.还尝试装饰 HomeController 而不是 BaseController 但没有成功。这段代码是在我之前的代码之后调用的,所以我认为在页面加载时尝试重定向用户的可能性更高
      猜你喜欢
      • 2012-01-20
      • 2011-09-13
      • 2011-02-21
      • 2023-03-08
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      相关资源
      最近更新 更多