Using MySql as ASP.NET Session Store Provider

MySQL Connector/Net from version 6.1 has included a custom Session State Provider. This provider enables you to store session state in a MySQL database and is useful if you are running your site in a web farm and you don't want to use the build in MSSQL.

 

There is a article in the MySql documentation on how to get started, I did find that of course it wouldn't work correctly in Medium Trust. So I downloaded the source for the 6.6.5 version and started debugging. I had read there were some bugs in the earlier versions causing the session to lock.

First thing that needs to change is how the web.configuration file is accessed, in Medium Trust you will get a security error. This is due the

// Get configuration element.
Configuration webConfig = WebConfigurationManager.OpenWebConfiguration(HostingEnvironment.ApplicationVirtualPath);
sessionStateConfig = (SessionStateSection)webConfig.SectionGroups["system.web"].Sections["sessionState"];

To the following as the OpenWebConfiguration method  throws an exception, System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

// Get configuration element.
sessionStateConfig = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState");

I compiled my own version, if you have a Full Trust environment you could probably go with the original version.

You also need to configure the web.config file to uses the new provider.

connectionStrings>
        remove name="LocalMySqlServer"/>
        add name="LocalMySqlServer" connectionString="Server=10.211.55.2;Database=aspnet_state;password=mypassword;User ID=myuser"/>
connectionStrings>
 
....
 
sessionState cookieless="false" regenerateExpiredSessionId="true" mode="Custom" customProvider="MySqlSessionStateStore">
            providers>
                add name="MySqlSessionStateStore" type="MySql.Web.SessionState.MySqlSessionStateStore, MySql.Web" connectionStringName="LocalMySqlServer" writeExceptionsToEventLog="false" autogenerateschema="True" />
            providers>
sessionState>