【发布时间】:2013-03-27 02:15:18
【问题描述】:
我正在开发一个原型程序,它应该测试 ASP.NET 的不同(SessionState、Profile 等)提供程序,即 MySQL、Oracle 等。目前我正在使用 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 表时,里面什么都没有。
所以我想知道数据是在哪里写入的还是我做错了什么?
更新:
即使这个问题不再是一个障碍,我仍然很想知道,如果有人愿意尝试一下,这是我用过的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。
【问题讨论】:
-
您可以通过创建新的
.Invoke(new object[] { ssessionStateContainer });来清除这一行中的数据吗?当您单步执行代码时,您会看到任何数据吗? -
两个sn-ps在我的代码中的顺序相同。
sessionState实例化后的数据写入结果,看不出来怎么清除?单步执行代码时,我可以在相应的属性中看到键SomeKey和AnotherKey,但不仅如此 - 不是。
标签: c# mysql session-state