PollyAzureTableStorage 1.0.0

dotnet add package PollyAzureTableStorage --version 1.0.0
                    
NuGet\Install-Package PollyAzureTableStorage -Version 1.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="PollyAzureTableStorage" Version="1.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="PollyAzureTableStorage" Version="1.0.0" />
                    
Directory.Packages.props
<PackageReference Include="PollyAzureTableStorage" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add PollyAzureTableStorage --version 1.0.0
                    
#r "nuget: PollyAzureTableStorage, 1.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package PollyAzureTableStorage@1.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=PollyAzureTableStorage&version=1.0.0
                    
Install as a Cake Addin
#tool nuget:?package=PollyAzureTableStorage&version=1.0.0
                    
Install as a Cake Tool

PollyAzureTableStorage

NuGet NuGet Downloads CI License: MIT

Polly v8 resilience for Azure.Data.Tables — add retry, timeout, and circuit-breaker to any Table Storage operation in two lines.

var tableClient = new TableClient(connectionString, "orders");

var resilient = tableClient.WithPolly(pipeline => pipeline
    .AddRetry(new RetryStrategyOptions
    {
        MaxRetryAttempts = 3,
        Delay = TimeSpan.FromSeconds(1),
        BackoffType = DelayBackoffType.Exponential,
        UseJitter = true,
        ShouldHandle = TableStorageTransientErrors.IsTransient,
    })
    .AddTimeout(TimeSpan.FromSeconds(10)));

await resilient.UpsertEntityAsync(entity);
var response = await resilient.GetEntityAsync<OrderEntity>("partitionKey", "rowKey");

Why PollyAzureTableStorage?

Azure Table Storage throttles aggressively at scale and returns 503 during maintenance windows. Without retry logic, a single throttle event causes data loss or visible errors. This library adds Polly v8 resilience with a predicate tuned for Table Storage:

Problem Solution
HTTP 429 throttling (storage account IOPS limit) Caught by TableStorageTransientErrors.IsTransient
HTTP 503 service unavailable during maintenance Caught by TableStorageTransientErrors.IsTransient
HTTP 504 gateway timeout Caught by TableStorageTransientErrors.IsTransient
HttpRequestException network failure Caught by TableStorageTransientErrors.IsTransient
TaskCanceledException timeout in transit Caught by TableStorageTransientErrors.IsTransient

Installation

dotnet add package PollyAzureTableStorage
dotnet add package Polly.Core

Quick-start

1. Manual wiring

var client = new TableClient(connectionString, "orders");

var resilient = client.WithPolly(p => p
    .AddRetry(new RetryStrategyOptions
    {
        MaxRetryAttempts = 3,
        Delay = TimeSpan.FromSeconds(1),
        BackoffType = DelayBackoffType.Exponential,
        UseJitter = true,
        ShouldHandle = TableStorageTransientErrors.IsTransient,
    }));

await resilient.UpsertEntityAsync(order);
var result = await resilient.GetEntityAsync<OrderEntity>("Orders", orderId);

2. Dependency injection

builder.Services.AddPollyAzureTableStorage(connectionString, "orders", pipeline => pipeline
    .AddRetry(new RetryStrategyOptions
    {
        MaxRetryAttempts = 3,
        Delay = TimeSpan.FromSeconds(1),
        BackoffType = DelayBackoffType.Exponential,
        UseJitter = true,
        ShouldHandle = TableStorageTransientErrors.IsTransient,
    })
    .AddTimeout(TimeSpan.FromSeconds(10)));

public class OrderRepository(ResilientTableClient client)
{
    public Task UpsertAsync(OrderEntity order, CancellationToken ct)
        => client.UpsertEntityAsync(order, cancellationToken: ct);

    public Task<Response<OrderEntity>> GetAsync(string pk, string rk, CancellationToken ct)
        => client.GetEntityAsync<OrderEntity>(pk, rk, cancellationToken: ct);
}

API reference

Member Description
ResilientTableClient.Inner The underlying TableClient
AddEntityAsync<T>(entity, ct) Adds an entity through the pipeline
UpsertEntityAsync<T>(entity, mode, ct) Upserts an entity through the pipeline
UpdateEntityAsync<T>(entity, ifMatch, mode, ct) Updates an entity through the pipeline
DeleteEntityAsync(pk, rk, ifMatch, ct) Deletes an entity through the pipeline
GetEntityAsync<T>(pk, rk, select?, ct) Gets a single entity through the pipeline
ExecuteAsync<T>(operation, ct) Runs any TableClient operation through the pipeline
TableStorageTransientErrors.IsTransient PredicateBuilder for 429/503/504, HttpRequestException, TaskCanceledException
TableStorageTransientErrors.StatusCodes IReadOnlySet<int>{429, 503, 504}
client.WithPolly(pipeline) Wraps TableClient with a pre-built pipeline
client.WithPolly(configure) Builds pipeline inline and wraps the client
services.AddPollyAzureTableStorage(configure) DI registration (requires TableClient in DI)
services.AddPollyAzureTableStorage(connStr, table, configure) DI with connection string shortcut

Target frameworks

.NET 6 ✅ · .NET 8 ✅ · .NET 9 ✅

Package Description
PollyAzureBlob Polly v8 for Azure Blob Storage
PollyAzureServiceBus Polly v8 for Azure Service Bus
PollyAzureKeyVault Polly v8 for Azure Key Vault
PollyAzureEventHub Polly v8 for Azure Event Hubs
PollyCosmosDb Polly v8 for Azure Cosmos DB
PollyElasticsearch Polly v8 for Elasticsearch
PollyRedis Polly v8 for StackExchange.Redis
PollyEFCore Polly v8 for Entity Framework Core
PollyDapper Polly v8 for Dapper
PollyMongo Polly v8 for MongoDB
PollyNpgsql Polly v8 for Npgsql (PostgreSQL)
PollySqlClient Polly v8 for Microsoft.Data.SqlClient
PollyGrpc Polly v8 for gRPC
PollyRabbitMQ Polly v8 for RabbitMQ
PollyKafka Polly v8 for Confluent.Kafka
PollyOpenAI Polly v8 for OpenAI .NET SDK
PollyMediatR Polly v8 for MediatR
PollyHealthChecks Polly v8 for ASP.NET Core Health Checks
PollyBackoff Polly v8 backoff helpers

License

MIT © Justin Bannister

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0 46 6/24/2026

1.0.0: Initial release. ResilientTableClient wraps Azure.Data.Tables TableClient in a Polly v8 ResiliencePipeline. Includes TableStorageTransientErrors predicate covering RequestFailedException (429, 503, 504), HttpRequestException, and TaskCanceledException. Supports net6.0, net8.0, and net9.0.