c# – 手动实例化的SessionState提供程序的问题
我正在研究一个原型程序,它应该测试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,System.Web.HttpCookieMode.UseDeviceProfile,SessionStateMode.Custom,false ); Type sessionStateType = Type.GetType("System.Web.SessionState.HttpSessionState,System.Web,Version=4.0.0.0,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表时,那里什么都没有. 所以我想知道数据写在哪里或者我做错了什么? 更新: <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. 解决方法
您在数据库中看不到任何数据,因为
SessionStateModule等待请求结束以调用命令
SetAndReleaseItemExclusive.数据保存在内存中,直到调用此命令为止.的确,文件说明:
要深入了解详细信息,您可以查看relevant files from the mono codebase. 鉴于此,要在数据库中查看会话数据,您应执行以下操作: object storeLockId = new object(); sessionStateContainer.Add("SomeKey","SomeValue"); var test = sessionStateContainer["SomeKey"]; Console.WriteLine("var test: " + test.ToString()); sessionState.Add("AnotherKey","SomeOtherValue"); var test2 = sessionState["AnotherKey"]; Console.WriteLine("var test2: " + test2.ToString()); // End the request provider.SetAndReleaseItemExclusive (context,sessionStateContainer.SessionID,storeData,storeLockId,true); provider.EndRequest(context); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |