我间歇性地犯了这个错误.
我发现此链接很好地总结了我在Google上能够找到的内容: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%的时间是下载页面.
我有!
在global.asax文件中,您执行以下操作:
void Session_Start(object sender, EventArgs e) { // Code that runs when a new session is started string sessionId = Session.SessionID; }
太简单.有用!
在以下情况下似乎出现此错误:
应用程序启动
即使你在Session_Start/End事件中做了某些事情,你也在使用Global.asax
您的应用程序过早强制刷新响应
你没有在冲洗之前使用Session
它在尝试在发布时保存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.
这就是为什么字符串sessionId = Session.SessionID; 诀窍避免问题.
我想它只会出现在应用程序启动时因为初始化行为.
解决方案/技巧:
如前所述,避免在Page_Load中刷新
在页面上停用会话状态(EnableSessionState)
在刷新之前使用SessionID技巧
如果您不关心刷新后可能发生的错误,请使用Response.End()代替.Flush()
我相信这里的问题可能正是你正在做的事情导致页面输出Page_Load
,根据ASP.NET页面生命周期概述早在渲染阶段之前.
确保在PreRender
阶段之后,您永远不会做任何可能触发页面输出的事情.