Silverlight and Session variables

I have seen numerous postings about how to access Session data from the current HttpContext using WCF. A simple example can be found here. Whilst looking for a solution to another Silverlight problem I came across this post about passing large text to SL using initParams and it got me thinking. Could I use the same concept to read my Session variables?

The short answer is Yes, with a few small changes. My initial problem was that my session variable contained a class of complex types. In order to serialize this I just need to mark the class as [Serializable]. I then set my initParams value:

<param name="InitParams" value="<%=InitParams%>" />

In the code behind for the page hosting the SL control I added:

protected string InitParams { get; private set; }

Then I just needed to convert my Session variable to a Base64 string during the Page_Load event.

MemoryStream stream = new MemoryStream();
XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
serializer.Serialize(stream, <my session variable> );       // Of type MyClass
stream.Position = 0;
string data = Convert.ToBase64String(stream.ToArray());
InitParams = "SessionDetails=" + data;

In my Silverlight Page, I just had to do the reverse to get my class back from the Base64 string.

if (App.Current.Host.InitParams.ContainsKey("SessionDetails"))
{
    MemoryStream ms = new MemoryStream(Convert.FromBase64String(App.Current.Host.InitParams["SessionDetails"]));
    StreamReader sr = new StreamReader(ms);
    string s = sr.ReadToEnd();

    sr.Close();
    sr.Dispose();

    ms.Close();
    ms.Dispose();

    // Parse the string so we can determine the contents of the Session variable
    XElement xElement = XElement.Parse(s);
}

And that is about it. The only other thing that is required is a bit a LINQ to get to the necessary values within the Session variable. Obviously this only works if you need to read in the Session variables one time when the SL control loads, but for me this was perfectly suitable.

Silverlight, Firefox and initParams

My ASPX page hosting my Silverlight 4 control was working perfectly well within IE8 but when I load the same page in FF (3.6…) I just kept getting the nice MS logo asking me to download and install Silverlight. I knew the SL add-on worked in FF because I had tried other applications.

As it turned out the problem was my initParams value which was initially blank and was to be configured in the code behind. The solution came from this post in the MS SL forum. For some reason, in all other browsers except IE, the initParams value must contain a value. I followed Eric’s solution and my problem was solved.