80

我间歇性地遇到这个故障。

我发现这个链接很好地总结了我在谷歌上找到的内容: http ://www.wacdesigns.com/2009/02/03/session-state-has-created-a-session-id-but-无法保存它,因为响应已被应用程序刷新/

基本上它说您可以尝试设置 Web 配置设置 DisplayWhenNewSession,或者尝试通过获取 Session_OnStart 中的 Session.SessionID 来激活会话状态。

但是有没有人:

a) 对此有解释

甚至更好,b)有一个久经考验的修复

我意识到在执行任何会影响 http 响应标头的操作后,我无法刷新响应。如果我这样做,每次都会导致错误,但这是间歇性的。SessionID 肯定应该由 ASP.NET 在页面响应开始时自动创建,在 ASPX 页面或 Page_Load(我的所有刷新被调用的地方)中的任何内容之前。

更新: 经过反思,我意识到这是在将文件流式传输到浏览器时发生的。大多数浏览器实际上是搜索引擎机器人。我可以通过开始下载然后关闭浏览器来重新创建此错误,因此大概浏览器在取消下载操作之前没有等待下载完成。我也在其他正常页面上看到过这种情况,但 99% 的时间是下载页面。

4

5 回答 5

89

我有!

在 global.asax 文件中,您可以这样做:

void Session_Start(object sender, EventArgs e) 
{
    // Code that runs when a new session is started
    string sessionId = Session.SessionID;
}

太简单。有用!

于 2009-12-27T17:56:17.540 回答
23

此错误似乎出现在以下情况:

  • 应用程序启动

  • 即使您在 Session_Start / End 事件中做某事,您也正在使用 Global.asax

  • 您的应用程序过早地强制刷新响应

  • 您没有在刷新之前使用 Session

当会话状态尝试在 release 上保存 sessionID 时,它会引发它:

System.Web.SessionState.SessionIDManager.SaveSessionID(HttpContext context, String id, Boolean& redirected, Boolean& cookieAdded)
System.Web.SessionState.SessionStateModule.CreateSessionId()
System.Web.SessionState.SessionStateModule.DelayedGetSessionId()
System.Web.SessionState.SessionStateModule.ReleaseStateGetSessionID()
System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs)
System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

我相信 Global.asax 的存在会导致会话 ID 在释放时由 SessionStateModule 保存(迟到?)即使在调用 SessionID 时没有使用会话而不是 HttpSessionState 也是如此。

这就是为什么string sessionId = Session.SessionID; 技巧避免问题。

我猜它只出现在应用程序启动时,因为初始化行为。

解决方案/技巧

  • 如前所述,避免在 Page_Load 中刷新

  • 停用页面上的会话状态 (EnableSessionState)

  • 在刷新之前使用 SessionID 技巧

  • 如果您不关心刷新后可能发生的错误,请使用 Response.End() 代替 .Flush()

于 2010-03-16T12:02:11.237 回答
6

我相信这里的问题可能正是你正在做一些事情来导致页面输出Page_Load,根据ASP.NET 页面生命周期概述,这在渲染阶段之前很久。

确保在PreRender舞台结束之前,您永远不会做任何可能触发页面输出的事情。

于 2009-05-25T01:16:05.977 回答
3

我自己刚刚遇到这个问题,我想我会分享我的发现。

web.config 设置 DisplayWhenNewSession 无关紧要,因为它仅适用于 Codeplex 上的一个特定自定义控件(对不起,我丢失了链接)。

另一个建议似乎可以通过尽早初始化 SessionId 来工作。我使用 Reflector 深入研究了代码,并不太明白这如何防止这里出现错误,但它确实对我们有用!

像大多数似乎遇到这个错误的人一样,我们没有在应用程序的任何地方显式调用 Response.Flush()。为了记录,我们也使用 MVC。

于 2009-10-15T15:30:35.743 回答
0

我知道这已经很老了,但我发现了另一个可能适用于其他人的错误原因。如果您使用的是 MVC(我使用的是带有 .Net 4.0 的 MVC 4)并且您使用 web.config 元素将页面设置为不缓冲

<pages buffer="false">    

然后,如果您在代码中尝试将数据推送到会话对象中,如果页面在您的子视图或执行会话状态访问的操作之前开始呈现,则可能会出现此错误。

在这种情况下,您可以通过将上面的缓冲区设置更改为 true 来修复错误。或者,将您的会话访问代码移动到主视图而不是子操作/子视图中。

于 2014-10-22T10:12:52.383 回答