Skip to main content
Version: 2.4.1

Azure Blob Storage

Overview

The RCommon.Azure.Blobs package wraps the official Azure Blob Storage SDK (Azure.Storage.Blobs) behind the IBlobStorageService interface. Your application code uses the provider-agnostic interface while the Azure implementation handles all SDK-specific details.

Multiple stores can be registered under different names, which is useful when different containers should use different credentials or service URIs (for example, a development emulator alongside a production account).

Installation

NuGet Package
dotnet add package RCommon.Azure.Blobs

This package depends on RCommon.Blobs and will bring it in automatically.

Configuration

Call WithBlobStorage<AzureBlobStorageBuilder> inside your AddRCommon() block. Use AddBlobStore to register each named store. Provide either a connection string or a service URI combined with a TokenCredential.

Using a connection string

A connection string is the simplest option for development and for environments where managed identity is not available.

using RCommon;
using RCommon.Azure.Blobs;

builder.Services.AddRCommon()
.WithBlobStorage<AzureBlobStorageBuilder>(azure =>
{
azure.AddBlobStore("primary", opts =>
{
opts.ConnectionString = builder.Configuration
.GetConnectionString("AzureStorage");
});
});

Typical appsettings.json:

{
"ConnectionStrings": {
"AzureStorage": "DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=...;EndpointSuffix=core.windows.net"
}
}

For local development with the Azurite emulator:

{
"ConnectionStrings": {
"AzureStorage": "UseDevelopmentStorage=true"
}
}

Using a service URI with managed identity

Managed identity avoids storing credentials in configuration. Pass the storage account endpoint URI and a DefaultAzureCredential (or any other TokenCredential from Azure.Identity).

using Azure.Identity;
using RCommon;
using RCommon.Azure.Blobs;

builder.Services.AddRCommon()
.WithBlobStorage<AzureBlobStorageBuilder>(azure =>
{
azure.AddBlobStore("primary", opts =>
{
opts.ServiceUri = new Uri(
"https://myaccount.blob.core.windows.net");
opts.Credential = new DefaultAzureCredential();
});
});

Registering multiple stores

builder.Services.AddRCommon()
.WithBlobStorage<AzureBlobStorageBuilder>(azure =>
{
azure.AddBlobStore("uploads", opts =>
opts.ConnectionString = uploadsConnectionString);

azure.AddBlobStore("backups", opts =>
{
opts.ServiceUri = new Uri(
"https://backupaccount.blob.core.windows.net");
opts.Credential = new DefaultAzureCredential();
});
});

Usage

Inject IBlobStoreFactory and resolve the store by name, or inject IBlobStorageService directly when only one store is registered.

public class FileUploadService
{
private readonly IBlobStorageService _storage;

public FileUploadService(IBlobStoreFactory factory)
{
_storage = factory.Resolve("uploads");
}

public async Task UploadAsync(string fileName, Stream content,
CancellationToken ct = default)
{
// Ensure the container exists before uploading.
if (!await _storage.ContainerExistsAsync("user-files", ct))
await _storage.CreateContainerAsync("user-files", ct);

await _storage.UploadAsync(
containerName: "user-files",
blobName: fileName,
content: content,
options: new BlobUploadOptions { ContentType = "application/octet-stream" },
token: ct);
}

public async Task<Stream> DownloadAsync(string fileName,
CancellationToken ct = default)
{
return await _storage.DownloadAsync("user-files", fileName, ct);
}
}

API Summary

AzureBlobStorageBuilder

Implements IBlobStorageBuilder and IAzureBlobStorageBuilder. Registered automatically by WithBlobStorage<AzureBlobStorageBuilder>.

MethodDescription
AddBlobStore(name, configure)Registers a named Azure Blob Storage store. The configure action receives an AzureBlobStoreOptions instance.

AzureBlobStoreOptions

PropertyDescription
ConnectionStringAzure Storage connection string. Use when not using managed identity.
ServiceUriURI of the Azure Blob Storage service (e.g., https://account.blob.core.windows.net). Required when using Credential.
CredentialA TokenCredential instance from Azure.Identity. Required when using ServiceUri.

Exactly one of the following must be provided:

  • ConnectionString
  • ServiceUri and Credential

If neither combination is supplied, the store throws an InvalidOperationException when first resolved.

RCommonRCommon