Ticomix.Attachments.Storage.AzureBlob 2026.10.8.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
UriplusTokenCredential(Entra ID / managed identity). This package does not referenceAzure.Identity; the host app passesDefaultAzureCredential.
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 barehttps://{account}.blob.core.windows.netURI is rejected; use the TokenCredential constructor instead.(db, blobServiceUri, credential, container, options)— Entra ID. PassDefaultAzureCredentialfrom the app. Keep Allow storage account key access disabled on the storage account.(db, blobServiceClient, container, options)— inject a pre-builtBlobServiceClient(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 StorageDownloadStreamingAsync: Downloads file content as a streamDeleteAsync: Removes an attachment from blob storageCopyAsync: Creates a copy of an existing attachmentGetContainerAsync: Retrieves or creates a blob containerGetBlobClient: Gets a reference to a specific blobDownloadBlob: 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/DeleteAsyncresolve the blob viaGetBlobName(attachment)(defaults toattachment.BlobId).CanHandleclaims"AzureBlobLegacy"rows and null-location rows that have aBlobId.- Read-only:
UploadAsync/CopyAsyncthrowNotSupportedException— write new attachments throughAzureBlobAttachments<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
- Ticomix.Attachments.Common (>= 2026.10.8.1)
- Azure.Storage.Blobs (>= 12.21.2)
.NET 8.0
- Ticomix.Attachments.Common (>= 2026.10.8.1)
- Azure.Storage.Blobs (>= 12.21.2)
| 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 |