The Problem

Recently I was creating a Silverlight based app for one of our customers on my Silverlight 5 Hosting. The applications runs on the contact form embedded in an IFrame. It used OData to retrieve a defined set of columns for the contact. All was looking nice, until I noticed, that after changing some of the columns and saving the contact, my Silverlight application still used old data – even after refreshing the page.

Internally it used an HttpWebRequest object to retrieve data from CRM via a URL like /XrmServices/2011/OrganizationData.svc/ContactSet(GUID’{0}’)?$select=FullName. Unfortunately Silverlight aggressively caches Web-Requests. Since the URL for a contact never changes, Silverlight does not even really do a further request and pulls data from the cache instead. The HttpWebRequest class in the Silverlight Framework does not provide means to disable caching. There are a lot of posts and forum topics out there discussing that problem.

The solution
Obviously the problem is, that the URL does not change. To overcome the caching issue, we just have to make sure, the address changes on every request. The solution I came up with was simply adding a made up parameter to the URL. Fortunately the OData Endpoint simply ignores unknown parameters. I called it ignoreCache, but of course any name will do here. The value of that parameter will be set to basically the current time. Now the URL changes on every request and we can work with the actual data:

Dim urlRaw As String = String.Format(“/XrmServices/2011/OrganizationData.svc/ContactSet(GUID’{0}’)?$select=FullName&IgnoreCache={1}”, id, Date.Now.TimeOfDay.Ticks)