Transient Fault Handling Application Block ("Topaz")

Change Log

This change log describes updates to Topaz in reverse-chronollogical order.


  • Included support for:
    • Windows Azure Caching 1.8
    • Windows Azure Storage 2.0
Note: Windows Azure Storage 1.7 and Windows Azure Shared Caching 1.7 are still supported.
  • Added additional Web Exception Status codes to be treated as transient in Windows Azure Storage.
  • Removed the substatus code check in Windows Azure Caching as redundant.


  • Included support for the Task-based Asynchronous Pattern (TAP) using the Task Parallel Library (TPL).
    • Added the ExecuteAsync method that takes a delegate that creates and retries a Task.
  • TransientFaultHandling.Core.dll targets .NET 4.0 in order to support TPL (the Core assembly was previously targeting .NET 3.5).
    • Nevertheless, you can also use it with .NET 4.5 and get the benefits of the new async/await C# keywords.
  • Marked old ExecuteAction method overloads used for doing asynchronous retries as Obsolete.
    • Going forward, if you need to retry calls that use the old APM (asynchronous programing model), you can wrap those into a TaskFactory.FromAsync call and use the new RetryPolicy.ExecuteAsync method instead (see example #3 below).
  • Removed the AllowPartiallyTrustedCallers attribute due to a temporary limitation. If you need to run this code in a partially trusted environment that requires the attribute to be defined, please do not update to this version.
  • For usage samples, see this.


  • Removed the hard dependency on the Windows Azure Shared Caching core assembly (Microsoft.ApplicationServer.Caching.Core, Version= This was causing build/deployment issues for users who wanted to use the Windows Azure Caching Preview (Microsoft.ApplicationServer.Caching.Core, Version= even when not using Topaz to handle transient faults accessing the Caching service, as the preview is not yet supported by Topaz.


Note: To make the update experience as simple as possible for users and to avoid the need for assembly binding redirects, we chose to only increment the assembly file and NuGet package versions, not the .NET assembly version. The assembly version is still 5.0.1118.0.


  • Fixes to the Service Bus transient error detection strategy:
    1. Critical bug fix: The previous version of Topaz incorrectly treated every WebException (many of which are wrapped in higher level exceptions) as transient and retried them. Now WebExceptions are only treated as transient if they contain a status code of InternalServerError, GatewayTimeout, ServiceUnavailable, or RequestTimeout.
    2. Edge case fix: The block treats UnauthorizedAccessException only with a specific status code (HttpStatusCode.Unauthorized) as transient.
  • Fixes to the Azure Storage transient error detection strategy:
    1. High impact bug fix: When a WebException with a protocol error occurred, Topaz treated it as transient, which was causing some non-transient exceptions to be treated as transient (for example, a NotFound HTTP status). Now WebExceptions are only treated as transient if they contain a status code of InternalServerError, GatewayTimeout, ServiceUnavailable, RequestTimeout. The issue reported here is now fixed.
    2. Edge case fix: In addition to the previously handled codes for the DataServiceRequestException, StorageServerException, and StorageClientException, the block now treats the following codes as transient also: TableErrorCodeStrings.TableServerOutOfMemory or TableErrorCodeStrings.TableBeingDeleted
    3. Edge case fix: The block treats IOException as transient. IOExceptions could manifest themselves under extremely high load ("Unable to read data from the transport connection: The connection was closed").
  • More info Release Notes

Last edited Dec 17, 2012 at 10:30 PM by gmelnik, version 11


No comments yet.