MySQL Session state provider crashes on expired sessions

I have a site running in IIS 7.5 ASP.NET 4 using MySQL Connector 6.7.4, I am trying to set it up to store session state in my database. It works fine to start with (I can store the state). But when I leave my browser open for a long time and then tries to refresh a page I get the following error:


Duplicate entry 'jouwlxjdufet2fyvf4cwefn2-1' for key 'PRIMARY'

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details:

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

Source Error:

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.

Stack Trace:

[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

My web.config contains the following

<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'

Also I can see that the my_aspnet_sessioncleanup table is updated regularly indicating that session cleanup is running (every 10 min).

Does anyone have any ideas on where to start the debugging? Thanks David


Fixed it!

I dug through the code for version 6.8.3.

In the file SessionProvider.cs: By always using an INSERT query, the code is assuming that no row for the session key already exists in the database -- which works fine for when the session is created, but throws an exception if the session key gets re-used.

I fixed it with some similar code already within the same file, and I'm no longer getting the exception. The modified code uses a REPLACE query instead of INSERT.

I've attached my updated file and a patch on a corresponding bug on the MySQL site (my base version is 6.8.3). You can download the 6.8.3 source, and patch it. You'll also have to comment out the AssemblyKeyName attribute (for strong assembly name) in AssemblyInfo.cs if you compile it yourself.

Hopefully the MySQL folks will push my little fix out into general circulation.

See my notes here:

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

And, a workaround until MySql updates the official release:

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

链接地址: http://www.djcxy.com/p/72706.html

上一篇: 在PC上部署WPF应用程序而不安装Sqlite .NET提供程序

下一篇: MySQL会话状态提供程序在过期会话上崩溃