Using Enterprise Transient fault handling block with Azure Cache
I mentioned in an earlier blog about the importance of having a retry mechanism in applications that use Azure Cache. An easy way to do this is by using the enterprise transient fault handling block.
I've noticed that an application using the Windows Azure SDK 1.8 (October 2012 release) and Transient Fault handling block (version 5.1.1209.0) can fail to start with the callstack below:
System.Reflection.TargetInvocationException occurred
HResult=-2146232828
Message=Exception has been thrown by the target of an invocation.
Source=mscorlib
StackTrace:
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance[T]()
at Microsoft.Practices.TransientFaultHandling.RetryPolicy`1..ctor(RetryStrategy retryStrategy)
at WebRole1._Default.Page_Load(Object sender, EventArgs e) in c:\Projects\WindowsAzure1\WebRole1\Default.aspx.cs:line 23
InnerException: System.IO.FileLoadException
HResult=-2146234304
Message=Could not load file or assembly 'Microsoft.ApplicationServer.Caching.Core, Version=101.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
Source=mscorlib
FileName=Microsoft.ApplicationServer.Caching.Core, Version=101.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
FusionLog==== Pre-bind state information ===
Here is a simple workaround to get past this issue - In your application config (app.config or web.config), add the following assembly redirection snippet:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.ApplicationServer.Caching.Core"
publicKeyToken="31bf3856ad364e35"
culture="neutral" />
<!-- Assembly versions can be redirected in application,
publisher policy, or machine configuration files. -->
<bindingRedirect oldVersion="101.0.0.0" newVersion="1.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>