2013-08-23 1 views
3

У меня есть сайт, работающий в IIS 7.5 ASP.NET 4 с использованием MySQL Connector 6.7.4, я пытаюсь настроить его для хранения состояния сеанса в моей базе данных. Он отлично работает для начала (я могу сохранить состояние). Но когда я оставляю свой браузер открытым в течение длительного времени, а затем пытается обновить страницу, я получаю следующую ошибку:Ошибка провайдера состояния сеанса MySQL на истекших сеансах


Дублировать запись «jouwlxjdufet2fyvf4cwefn2-1» для ключ «PRIMARY»

Описание: 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.

Сведения об исключении:

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

Я могу видеть в базе данных уже существующую запись:

Таблица: 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 регулярно обновляется, указывая, что сеансовая очистка работает (каждые 10 минут).

Есть ли у кого-нибудь идеи, с чего начать отладку? Thanks David

+0

вы узнали, что причиной этого? У меня такая же проблема ... – Ami

+1

no Я не узнал, это была моя полная пробка для использования соединителя MySQL в качестве агента состояния сеанса. Я направился в Amazon и нашел своего поставщика услуг сеанса DynamoDB, который работал как шарм. – DavKa

ответ

2

Исправлено!

Я выкопал код для версии 6.8.3.

В файле SessionProvider.cs: всегда используя запрос INSERT, код предполагает, что в базе данных уже нет строки для ключа сеанса, которая отлично работает при создании сеанса, но генерирует исключение если ключ сеанса повторно используется.

Я исправил его каким-то похожим кодом уже в том же файле, и я больше не получаю исключение. Измененный код использует запрос REPLACE вместо INSERT.

Я приложил обновленный файл и исправление на соответствующей ошибке на сайте MySQL (моя базовая версия - 6.8.3). Вы можете загрузить источник 6.8.3 и исправить его. Вы также должны будете прокомментировать атрибут AssemblyKeyName (для сильного имени сборки) в AssemblyInfo.cs, если вы его скомпилируете самостоятельно.

Надеемся, что люди из MySQL вытолкнут мое небольшое исправление в общий тираж.

Смотрите мои заметки здесь:

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

И, обходной путь до MySql обновляет официальный релиз:

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