Ticomix.Attachments.Storage.AzureBlob 2026.10.16.1

Ticomix.Attachments.Storage.AzureBlob

Purpose Statement

A .NET library that provides Azure Blob Storage implementation for the Ticomix attachments system, enabling secure and scalable cloud storage for application file attachments.

Technical Context

  • Implements the IAttachments<TKey> interface from the Ticomix.Attachments.Common library
  • Built on Azure.Storage.Blobs SDK version 12.21.2
  • Supports .NET 8.0 and .NET 10.0 frameworks.
  • Uses generics to support multiple key types for attachment identification
  • Authenticates with a storage connection string (Shared Key / Azurite / SAS) or with a blob-service Uri plus TokenCredential (Entra ID / managed identity). This package does not reference Azure.Identity; the host app passes DefaultAzureCredential.

Key Capabilities

  • Blob Container Management: Automatically creates and manages Azure Blob Storage containers with customizable access policies
  • Hierarchical File Organization: Supports directory-like organization through virtual folder paths within blob storage
  • Streaming Content Delivery: Provides optimized streaming download capabilities for efficient file retrieval
  • Attachment Lifecycle Management: Implements complete attachment operations including upload, download, copy, and deletion

Integration Points

  • Seamlessly integrates with the Ticomix attachments ecosystem via the standard IAttachments<TKey> interface
  • Compatible with Entity Framework Core for database storage of attachment metadata
  • Works alongside other storage providers in the Ticomix.Attachments namespace

Use Case Scenarios

  • Enterprise applications requiring secure cloud storage for user-uploaded files
  • Systems needing scalable attachment storage with metadata tracking
  • Applications migrating from on-premises storage to cloud-based solutions
  • Multi-tenant applications requiring isolation of attachment data

Database Models Used

  • Attachment: Represents attachment metadata including file name, directory path, and other attributes stored in a database context that implements IAttachmentsDbContext<TKey>

Classes and Functions

AzureBlobAttachments

Main implementation class that provides Azure Blob Storage functionality for the attachment system.

Constructors:

  • (db, connectionString, container, options) — Shared Key, account SAS connection string, or Azurite (UseDevelopmentStorage=true). A bare https://{account}.blob.core.windows.net URI is rejected; use the TokenCredential constructor instead.
  • (db, blobServiceUri, credential, container, options) — Entra ID. Pass DefaultAzureCredential from the app. Keep Allow storage account key access disabled on the storage account.
  • (db, blobServiceClient, container, options) — inject a pre-built BlobServiceClient (tests / advanced hosts).

Entra registration (app code):

services.AddScoped<IAttachments<int>>(sp =>
    new AzureBlobAttachments<int>(
        sp.GetRequiredService<ApplicationDbContext>(),
        new Uri("https://{account}.blob.core.windows.net"),
        new DefaultAzureCredential(),
        containerName,
        options));

RBAC: grant the App Service managed identity (and local az login / Visual Studio identity) Storage Blob Data Contributor on the storage account. CreateIfNotExists needs permission to create the container, or create attachmentsdev (or your container name) ahead of time.

CopyAsync streams through the authenticated clients (download + upload) and reapplies the source blob's HTTP headers and metadata via BlobUploadOptions, matching server-side copy for content-type and related properties. It does not use StartCopyFromUriAsync on a bare blob URI, which is anonymous and fails when Shared Key is disabled.

Key Functions:

  • UploadAsync: Uploads a file stream to Azure Blob Storage
  • DownloadStreamingAsync: Downloads file content as a stream
  • DeleteAsync: Removes an attachment from blob storage
  • CopyAsync: Creates a copy of an existing attachment
  • GetContainerAsync: Retrieves or creates a blob container
  • GetBlobClient: Gets a reference to a specific blob
  • DownloadBlob: Retrieves blob content and metadata

AzureBlobLegacy provider (read-by-BlobId)

AzureBlobAttachments<TKey> resolves a blob by Directory+FileName. Applications that previously stored a GUID blob name in Attachment.BlobId (and never set AttachmentLocation) need AzureBlobLegacyAttachments<TKey> to read those blobs.

  • AttachmentLocation = "AzureBlobLegacy".
  • DownloadStreamingAsync/DeleteAsync resolve the blob via GetBlobName(attachment) (defaults to attachment.BlobId).
  • CanHandle claims "AzureBlobLegacy" rows and null-location rows that have a BlobId.
  • Read-only: UploadAsync/CopyAsync throw NotSupportedException — write new attachments through AzureBlobAttachments<TKey>.

Register it alongside the canonical provider (see the Common package README).

IAttachmentBlobStore (path-addressed blobs)

AzureBlobAttachments also implements IAttachmentBlobStore for low-level, row-less blob access (path download/upload/exists, bulk prefix delete) -- used by image thumbnail caches and container maintenance. The FileSystem provider deliberately does NOT implement it: the only consumers are Azure-blob-backed thumbnail caches; the FileSystem provider is the local-dev/ offline staging backend and maintains no such cache.

No packages depend on Ticomix.Attachments.Storage.AzureBlob.

.NET 10.0

.NET 8.0

Version Downloads Last updated
2026.10.19.1 22 10/19/2026
2026.10.16.1 4 10/16/2026
2026.10.9.1 12 10/9/2026
2026.10.8.1 45 10/8/2026
2026.9.30.1 28 9/30/2026
2026.9.24.1 3 9/24/2026
2026.9.23.1 3 9/23/2026
2026.9.17.1 6 9/17/2026
2026.9.16.3 4 9/16/2026
2026.9.16.2 4 9/16/2026
2026.9.16.1 4 9/16/2026
2026.9.11.1 6 9/11/2026
2026.9.1.1 6 9/1/2026
2026.7.21.1 152 7/21/2026
2026.6.16.1 40 6/16/2026
2026.6.15.2 13 6/15/2026
2026.6.15.1 13 6/15/2026
2026.6.12.2 10 6/12/2026
2026.6.12.1 223 6/12/2026
2026.6.9.1 10 6/9/2026
2026.5.29.3 17 5/30/2026
2026.5.8.4 22 5/8/2026
2026.4.15.1 9 4/15/2026
2026.4.13.2 9 4/13/2026
2026.4.2.2 97 4/2/2026
2026.2.3.1 217 2/3/2026
2026.1.20.1 77 1/20/2026
2026.1.19.1 23 1/19/2026
2026.1.5.1 10 1/5/2026
2025.12.19.3 23 12/19/2025
2025.12.12.1 11 12/12/2025
2025.12.11.2 13 12/11/2025
2025.12.11.1 10 12/11/2025
2025.12.10.2 10 12/10/2025
2025.12.10.1 10 12/10/2025
2025.12.9.3 10 12/9/2025
2025.12.9.2 12 12/9/2025
2025.12.8.2 12 12/8/2025
2025.12.7.1 10 12/7/2025
2025.12.5.2 12 12/5/2025
2025.12.5.1 8 12/5/2025
2025.11.18.2 9 11/18/2025
2025.11.18.1 12 11/18/2025
2025.10.31.1 23 10/31/2025
2025.10.29.1 38 10/29/2025
2025.10.23.2 14 10/23/2025
2025.10.23.1 13 10/23/2025
2025.10.22.1 13 10/22/2025
2025.10.15.1 175 10/15/2025
2025.10.9.1 26 10/10/2025
2025.10.3.2 32 10/3/2025
2025.10.3.1 14 10/3/2025
2025.10.1.4 34 10/1/2025
2025.10.1.3 13 10/1/2025
2025.10.1.2 14 10/1/2025
2025.9.24.1 42 9/24/2025
2025.9.2.3 79 9/2/2025
2025.7.25.1 106 7/25/2025
2025.7.16.1 56 7/16/2025
2025.7.15.1 29 7/15/2025
2025.7.11.2 34 7/11/2025
2025.6.4.1 89 6/4/2025
2025.5.22.1 38 5/22/2025
2025.5.1.1 87 5/1/2025
2025.4.18.12 45 4/18/2025
2025.4.10.1 42 4/10/2025
2025.3.28.1 42 3/28/2025
2025.3.25.2 33 3/25/2025
2025.3.20.1 27 3/20/2025
2025.3.19.5 28 3/19/2025
2025.3.19.3 21 3/19/2025
2025.3.18.5 25 3/18/2025
2025.3.18.4 20 3/18/2025
2025.3.18.3 18 3/18/2025
2025.3.18.2 17 3/18/2025
2025.3.12.1 26 3/12/2025
2025.3.7.1 35 3/7/2025
2025.2.14.2 70 2/14/2025
2025.1.30.1 15 1/30/2025
2025.1.29.2 18 1/29/2025
2025.1.29.1 18 1/29/2025
2025.1.28.2 18 1/28/2025
2025.1.28.1 54 1/28/2025
2025.1.27.4 22 1/27/2025
2025.1.27.3 25 1/27/2025
2025.1.27.2 20 1/27/2025
2025.1.27.1 19 1/27/2025
2025.1.6.1 19 1/6/2025
2024.12.31.2 53 12/31/2024
2024.12.31.1 19 12/31/2024
2024.12.30.1 22 12/30/2024
2024.12.20.2 31 12/20/2024
2024.12.17.18 32 12/17/2024
2024.12.17.2 24 12/17/2024
2024.12.11.3 36 12/11/2024
2024.12.10.1 26 12/10/2024
2024.12.5.3 29 12/5/2024
2024.12.5.2 22 12/5/2024
2024.12.4.10 19 12/4/2024
2024.12.4.9 20 12/4/2024
2024.11.15.4 57 11/16/2024
2024.11.15.1 21 11/15/2024
2024.11.6.3 41 11/6/2024
2024.11.6.1 24 11/6/2024
2024.11.5.6 24 11/5/2024
2024.11.5.4 23 11/5/2024
2024.10.28.3 40 10/28/2024
2024.10.28.2 21 10/28/2024
2024.10.28.1 23 10/28/2024
2024.10.24.1 25 10/24/2024
2024.10.23.1 27 10/23/2024
2024.10.17.2 30 10/17/2024
2024.10.8.1 33 10/8/2024
2024.8.20.1 76 8/20/2024
2024.8.6.1 49 8/6/2024
2024.7.17.1 63 7/17/2024
2024.7.15.1 27 7/15/2024
2024.7.9.4 32 7/9/2024
2024.7.9.3 23 7/9/2024
2024.7.9.2 25 7/9/2024
2024.7.2.1 34 7/2/2024
2024.7.1.4 30 7/1/2024
2024.6.14.1 36 6/14/2024
2024.6.12.2 50 6/12/2024
2024.6.10.1 26 6/10/2024
2024.5.31.2 38 5/31/2024
2024.5.22.2 41 5/22/2024
2024.4.25.1 50 4/25/2024
2024.4.17.1 33 4/17/2024
2024.4.12.3 25 4/12/2024
2024.4.9.1 38 4/9/2024