3

MySQL Connector 6.7.4 を使用して IIS 7.5 ASP.NET 4 で実行しているサイトがあり、データベースにセッション状態を保存するように設定しようとしています。最初は問題なく動作します(状態を保存できます)。しかし、ブラウザを長時間開いたままにしてからページを更新しようとすると、次のエラーが表示されます。


キー「PRIMARY」の重複エントリ「jouwlxjdufet2fyvf4cwefn2-1」

説明: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">
    <プロバイダー>
      <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" />
    </プロバイダー>
  </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 分ごと)。

デバッグを開始する場所について何か考えがある人はいますか? ありがとうデビッド

4

1 に答える 1

2

修正しました!

バージョン 6.8.3 のコードを掘り下げました。

ファイル SessionProvider.cs: 常に INSERT クエリを使用することにより、コードはセッション キーの行がデータベースにまだ存在しないことを前提としています。再利用されます。

同じファイル内に既にある同様のコードで修正しましたが、例外が発生しなくなりました。変更されたコードは、INSERT の代わりに REPLACE クエリを使用します。

更新したファイルと、MySQL サイトの対応するバグのパッチを添付しました (私のベース バージョンは 6.8.3 です)。6.8.3 のソースをダウンロードしてパッチを当てることができます。AssemblyInfo.cs を自分でコンパイルする場合は、AssemblyInfo.cs の AssemblyKeyName 属性 (厳密なアセンブリ名の場合) もコメント アウトする必要があります。

うまくいけば、My​​SQL 関係者が私の小さな修正を一般に公開してくれることを願っています。

ここで私のメモを参照してください:

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

そして、MySql が公式リリースを更新するまでの回避策:

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

于 2014-01-07T04:43:43.133 に答える