【问题标题】:ASP.NET MVC5 - Server cannot modify cookies after HTTP headers have been sentASP.NET MVC5 - 发送 HTTP 标头后服务器无法修改 cookie
【发布时间】:2015-01-23 15:24:49
【问题描述】:

我有一个 MVC 站点,它给出“发送 HTTP 标头后服务器无法修改 cookie”。错误。它发生在 _Layout.cshtml 中。在那一行,有一个@Html.Action("_LightBoxes"),它调用了一个_LightBoxes 局部视图。 _LightBoxes Partial View 的代码很简单:-

[ChildActionOnly]
public PartialViewResult _LightBoxes()
{
    return PartialView();
}

我读过其他线程出现此错误,但这些似乎都在执行重定向或类似操作,而在此控制器中它只是返回一个空的局部视图。

有人对造成这种情况的原因有任何建议吗?它可能是 PartialView 内部对另一个实际上导致此错误的控制器的引用吗?

编辑 - 2015 年 1 月 26 日 我认为这可能是问题所在。这是在从该行的 PartialView 中调用的 Partial View 中。下面的代码,用于 Facebook 登录按钮,其 cookie 设置为 true。

<script type="text/javascript">
    //Facebook Login Button
    window.fbAsyncInit = function () {
        FB.init({
            appId: "@(System.Configuration.ConfigurationManager.AppSettings["facebook_appid"].ToString())", // App ID
            //channelUrl : '//WWW.YOUR_DOMAIN.COM/channel.html', // Channel File
            status: true, // check login status
            cookie: false, // enable cookies to allow the server to access the session
            oauth: true, // enable OAuth 2.0
            xfbml: true  // parse XFBML
        });
        $("fblogin").show();
    };
    (function (d) {
        var js, id = 'facebook-jssdk'; if (d.getElementById(id)) { return; }
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";
        d.getElementsByTagName('head')[0].appendChild(js);
    }(document));
    //End Facebook
</script>

谢谢, 迈克。

【问题讨论】:

  • 当服务器已将标头完全发送到客户端浏览器时,您正在尝试修改 HttpCookie。看这个答案stackoverflow.com/questions/2383169/…
  • 你的 _LightBoxes.cshtml 中有什么?

标签: asp.net asp.net-mvc cookies


【解决方案1】:

在 MVC 应用程序中,这通常是由于在应用程序某处不当使用 Response.Write() 引起的(它甚至不需要出现在导致问题的代码中)。 MVC 旨在在控制器完成处理后呈现页面,并将这些页面呈现到输出缓冲区,最后在输出的最后将其写入响应。

如果您的管道中某处有执行Response.Write() 的代码,然后您尝试编写一个cookie,但在实际呈现视图之前您会遇到此问题。

因此,在您的代码中搜索不在视图中的Response.Write()

【讨论】:

  • 谢谢。我们有一个常用功能的实用程序项目,它作为 DLL 与网站一起发送。里面的Response.Write()可能会导致这个?
  • @MikeUpjohn - 因为我看不到你的代码,而且我不知道它是如何被调用的,所以我不知道.. 但是如果有 Response.Write() 被调用控制器方法(而不是在视图中)然后是的,它是可能的。因为,看起来您有一个视图,其中包含尝试编写 cookie 的代码(您的 _LightBox.cshtml)。一般来说,您不应该直接写入 MVC 中的响应,尤其是在视图之外。
  • 是的,我确实找到了一个,所以我改变了这个,看看这个问题是否会在周末停止。谢谢!
  • 我刚刚用一些我认为可能导致问题的新代码更新了上面的内容?
  • @MikeUpjohn - 这不太可能,因为这将是 facebook 提出的完全不同的请求。这与来自您的服务器的请求无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2012-03-06
  • 2012-01-07
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 2012-01-20
相关资源
最近更新 更多