Today I wanted to share with you my expierience in configuring ASP.NET MVC website running on 2 web servers.
Web servers are going to be configured on 2 servers running on Microsoft Windows Server 2008R2. The net balancing will make the website be served from either server A or server B.
The first of 3 parts will cover configuring the session to be available across two machines.
Because the user may be switched from webserver A to webserver B we need to make sure that the same session is available on both Webservers.
According to msdn source http://msdn.microsoft.com/en-us/library/ms178586.aspx there are few modes of session state:
· In-Process Mode – (default) the session is stored within the web server worker process. So for 2 werbserers we’d have 2 different places that the session would be stored at – won’t work
· State Server Mode – the session state in a process which is separate ASP.NET worker process. This mode ensures that the state is preserved if the Web application is restarted and also makes session state available to multiple Web servers in a Web farm
· Sql Server Mode – similar to State Serever Mode, but the data stored in session is stored in sql database.
I’ve chosen the State Server Mode, because as I found in some forum it’s quicker than Sql Server State storage.
The configuration that needs to be add
To start with I’ve decided to configure it locally to give it a quick test.
After setting this in web.config system.web section
<sessionState mode="StateServer"
stateConnectionString="tcpip=localhost:42424"
cookieless="false"
timeout="20"/>
In live environment you’ll have to replace localhost with the IP address of the server where the ASP.NET State Service is running.
I got following error:
Server Error in '/' Application.
Unable to make the session state request to the session state server. Please ensure that the ASP.NET State service is started and that the client and server ports are the same. If the server is on a remote machine, please ensure that it accepts remote requests by checking the value of HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection. If the server is on the local machine, and if the before mentioned registry value does not exist or is set to 0, then the state server connection string must use either 'localhost' or '127.0.0.1' as the server name.
This is because the State Server wasn’t enabled on my machine. To enable it you have to go to AdministrativeTools > Computer Management > Services and Applications >Services and start the ASP.NET State Service
Then following error came out:
Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.
This is because all the objects stored in State Server session must be serializable and in my case these weren’t.
After making objects stored in session serializable (adding attribute to the class definitions) it worked for me.
So in web farm configuration you only need to configure ASP.NET State Service on one server and use it from both applications on both web servers.
That’s all for the first part. In second part I’ll write about problem with keeping users signed in across two webservers.