gpt4 book ai didi

asp.net - MySQL session 状态提供程序在过期的 session 上崩溃

转载 作者:可可西里 更新时间:2023-11-01 08:34:05 24 4
gpt4 key购买 nike

我有一个使用 MySQL 连接器 6.7.4 在 IIS 7.5 ASP.NET 4 中运行的站点,我正在尝试将其设置为在我的数据库中存储 session 状态。开始时效果很好(我可以存储状态)。但是,当我长时间打开浏览器然后尝试刷新页面时,出现以下错误:


键“PRIMARY”的重复条目“jouwlxjdufet2fyvf4cwefn2-1”

描述:在执行当前网络请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。

异常详情:

MySql.Data.MySqlClient.MySqlException: Duplicate entry 'jouwlxjdufet2fyvf4cwefn2-1' for key 'PRIMARY'

来源错误:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

堆栈跟踪:

[MySqlException (0x80004005): Duplicate entry 'jouwlxjdufet2fyvf4cwefn2-1' for key 'PRIMARY']
MySql.Data.MySqlClient.MySqlStream.ReadPacket() +492
MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId) +450
MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force) +136
MySql.Data.MySqlClient.MySqlDataReader.NextResult() +1121
MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) +2648
MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() +140
MySql.Web.SessionState.MySqlSessionStateStore.CreateUninitializedItem(HttpContext context, String id, Int32 timeout) +553

[ProviderException: An exception occurred. Please check the event log.]
MySql.Web.SessionState.MySqlSessionStateStore.HandleMySqlException(MySqlException e, String action) +281
MySql.Web.SessionState.MySqlSessionStateStore.CreateUninitializedItem(HttpContext context, String id, Int32 timeout) +709
System.Web.SessionState.SessionStateModule.GetSessionStateItem() +304
System.Web.SessionState.SessionStateModule.BeginAcquireState(Object source, EventArgs e, AsyncCallback cb, Object extraData) +1076
System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +115
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +375

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.1008

我的 web.config 包含以下内容

<system.web>  <sessionState mode="Custom" cookieless="false" regenerateExpiredSessionId="false" customProvider="MySqlSessionStateProvider" timeout="20">    <providers>      <add name="MySqlSessionStateProvider" type="MySql.Web.SessionState.MySqlSessionStateStore, MySql.Web, Version=6.7.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" applicationName="/skygdadmin" description="" connectionStringName="MySqlServer" writeExceptionsToEventLog="False" autogenerateschema="True" enableExpireCallback="True" />    </providers>  </sessionState>...

I can see in the database the already existing entry:

Table:my_aspnet_sessions

SessionId: 'jouwlxjdufet2fyvf4cwefn2'
ApplicationId: '1'
Created: '2013-08-22 08:29:34'
Expires: '2013-08-22 09:49:39'
LockDate: '2013-08-22 09:29:39'
LockId: '419'
Timeout: '20'
Locked: '0'
SessionItems: [lots of stuff]
Flats: '0'

我还可以看到 my_aspnet_sessioncleanup 表定期更新,表明 session 清理正在运行(每 10 分钟)。

有人知道从哪里开始调试吗?谢谢大卫

最佳答案

已修复!

我研究了 6.8.3 版的代码。

在文件 SessionProvider.cs 中:通过始终使用 INSERT 查询,代码假定数据库中不存在 session key 的行——这在创建 session 时工作正常,但如果出现以下情况则抛出异常 session key 被重新使用。

我用同一个文件中已有的一些类似代码修复了它,我不再遇到异常。修改后的代码使用 REPLACE 查询而不是 INSERT。

我已附上我的更新文件和 MySQL 站点上相应错误的补丁(我的基本版本是 6.8.3)。你可以下载 6.8.3 源码,打补丁。如果您自己编译它,您还必须在 AssemblyInfo.cs 中注释掉 AssemblyKeyName 属性(用于强大的程序集名称)。

希望 MySQL 的人们能将我的小修复程序推广到一般流通中。

在这里查看我的笔记:

http://bugs.mysql.com/bug.php?id=70409

并且,在 MySql 更新正式版本之前的解决方法:

https://github.com/xavierjefferson/mysql-web-fixed

关于asp.net - MySQL session 状态提供程序在过期的 session 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18397376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com