7

ASP.NET、つまり MySQL、Oracle などのさまざまな (SessionState、Profile など) プロバイダーをテストするプロトタイプ プログラムに取り組んでいます。現在、MySQL プロバイダーを使用しています。プロバイダー、SessionStateContainer、および SessionState 自体をインスタンス化することができました。

Type mySqlType = Type.GetType("MySql.Web.SessionState.MySqlSessionStateStore, MySql.Web, Version=6.6.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d", true, true);

SessionStateStoreProviderBase provider = (SessionStateStoreProviderBase)Activator.CreateInstance(mySqlType);
System.Collections.Specialized.NameValueCollection providerConfig = new System.Collections.Specialized.NameValueCollection();
providerConfig.Add("connectionStringName", "LocalMySqlServer");
providerConfig.Add("applicationName", "/");
providerConfig.Add("autogenerateschema", "True");
providerConfig.Add("enableExpireCallback", "False");

provider.Initialize("MySqlSessionStateProvider", providerConfig);

HttpContext context = new HttpContext(
                          new HttpRequest("fake", "http://localhost:14359", ""),
                          new HttpResponse(new StringWriter()));

SessionStateStoreData storeData = provider.CreateNewStoreData(context, 100);
System.Web.SessionState.HttpSessionStateContainer sessionStateContainer =
    new System.Web.SessionState.HttpSessionStateContainer(
            "mySession",
            storeData.Items,
            storeData.StaticObjects,
            100,
            true,
            System.Web.HttpCookieMode.UseDeviceProfile,
            SessionStateMode.Custom,
            false
    );

Type sessionStateType = Type.GetType("System.Web.SessionState.HttpSessionState, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
HttpSessionState sessionState =
    (HttpSessionState)sessionStateType
        .GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(IHttpSessionState) }, null)
        .Invoke(new object[] { ssessionStateContainer });

provider.InitializeRequest(context);

作成したセッションでいくつかの値を書き込むことができ、そこから値を読み取ることができるため、すべてが正常に機能しているようです。

sessionStateContainer.Add("SomeKey", "SomeValue");
var test = sessionStateContainer["SomeKey"];
Console.WriteLine("var test: " + test.ToString()); // outputs "var test: SomeValue"

sessionState.Add("AnotherKey", "SomeOtherValue");
var test2 = sessionState["AnotherKey"];
Console.WriteLine("var test2: " + test2.ToString()); // outputs "var test2: SomeOtherValue"

// End the request
provider.EndRequest(context);

ここで興味深い部分がmy_aspnet_sessionsあります。DB のテーブルを調べると、そこには何もありません。

それで、データがどこに書き込まれたのか、それとも何か間違っているのでしょうか?

更新:
この問題はもはやブロッカーではありませんが、私はまだ知りたいと思っconnectionStringています.

<connectionStrings>
  <remove name="LocalMySqlServer" />
  <add name="LocalMySqlServer" connectionString="server=localhost;database=session_test;User Id=user;password=pass" providerName="MySql.Data.MySqlClient" />
</connectionStrings>

MySQL Connector NETも必要です。

4

2 に答える 2