NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
NuGet · #1961 most downloaded on NuGet
Pluggable foundation blocks for building distributed apps.
Last release 1 months ago
28 Aug 2026
Ships fairly regularly
a new release about every 2 months
Rarely documented
notes for 5 of the last 60 stable releases
8 versions withdrawn
withdrawn after publishing
127 years old
483 releases · first in 1900
Security fix — pinned System.Security.Cryptography.Xml to 8.0.4 to resolve transitive vulnerability advisories
Maintenance and documentation release building on v13.0.2.
Foundatio.Xunit.v3 and the test harness packagesSystem.Security.Cryptography.Xml to 8.0.4 to resolve transitive vulnerability advisoriesRemoveIfEqualAsync / ReplaceIfEqualAsync when keys do not existIConnectionMultiplexer registration patterns in DI (factory-owned instances vs. pre-built singletons that are never disposed)xunit.v3.mtp-v2 4.0.0, xunit.runner.visualstudio 4.0.0)Foundatio.Xunit.v3 retry test execution to align with xUnit v4 APIsRemoveIfEqualAsync and ReplaceIfEqualAsync return false and do not create keys when the target key does not existNote for consumers: If you reference
Foundatio.TestHarness,Foundatio.Xunit.v3, or other Foundatio test packages, upgrade them together with your xUnit packages to 4.0.0 to avoid test discovery/runtime mismatches.
Microsoft.AspNetCore.DataProtection: 8.0.28 → 8.0.30MessagePack: 3.1.7 → 3.1.8Microsoft.Extensions.* / Microsoft.AspNetCore.TestHost: 10.0.11Microsoft.NET.Test.Sdk: 18.7.0 → 18.9.0Aspire.Hosting.Redis (sample): 13.4.6 → 13.5.3This release publishes the usual Foundatio packages, including:
FoundatioFoundatio.Extensions.HostingFoundatio.TestHarnessFoundatio.Xunit.v3Foundatio.MessagePackFoundatio.DataProtectionInstall via NuGet:
dotnet add package Foundatio --version 13.0.4One column per quarter.
chore(deps): bump uuid and mermaid in /docs by @dependabot [bot] in #513
Full Changelog: v13.0.1...v13.0.2
RabbitMQ delayed delivery and delayed-exchange plugin deprecation notes
This is a major release with 368 files changed across the entire Foundatio codebase. Here are the themes that define v13:
QueueException, MessageBusException, SerializerException) so consumers get predictable, catchable errors regardless of the underlying provider. These feature-specific exceptions are automatically excluded from resilience policy retries.null! suppressions across the codebase, fixing latent null bugs and adding proper nullable attributes. The API surface now accurately communicates nullability contracts.netstandard2.0 in favor of net8.0 + net10.0. Replaced DeepCloner with the actively-maintained FastCloner. ScheduledTimer now uses TimeProvider for testability.Foundatio v13 ships with a brand-new documentation site covering every subsystem with guides, configuration examples, and direct source code links. Key additions:
061bd763)8f6d37c1), queues (bb9af714), messaging (59cc2f57), locks (10241465), jobs (7df97b13), serialization (8819ba09), storage (bf2eb1b9)2fc124df, 0791b496)a6cfd75c)da2c6162)6860a0c1)98323dbe)456389ed)70a63d12)1853daee)7fdad859)3e003a86) and added sample projects + benchmarks to the solution (160dd74f)b8f0eba1)netstandard2.0 target: Foundatio now targets net8.0 and net10.0 only. Consumers on .NET Framework or older runtimes must stay on v12.x. by @niemyjski in 4c6aefed, a1089422ICacheClient.IncrementAsync TTL behavior: Increment operations now consistently apply the TTL parameter across all implementations. Removed ListRemoveAsync ExpiresIn argument to align with all other Remove methods. by @niemyjski in #434ICacheClient return values for expiration: GetExpirationAsync returns consistent values across implementations. by @niemyjski in #432ISerializer argument validation: All serializer implementations now consistently validate arguments and throw ArgumentException / ArgumentNullException. by @niemyjski in #440QueueException: Queue operations now throw QueueException for queue-specific errors. Guard added against reusing behavior instances. by @niemyjski in #448MessageBusId and QueueId changed to init-only properties: These properties can no longer be set after construction. by @niemyjski in b73bf128Set/SetAdd/SetRemove methods from cache extensions: These were renamed to List* in v9.0.0 (Nov 2019) and have been [Obsolete] for 6+ years. by @niemyjski in 150beed5GetFileStreamAsync overload: Deprecated in v10.7.0 (Jan 2024) when StreamMode was added. Use the overload accepting StreamMode and CancellationToken. by @niemyjski in 037baae5null! suppressions, fixed latent null bugs, and added nullable attributes across the codebase. Return types and parameters may have changed nullability. by @niemyjski in #484, #498Foundatio.Xunit.v3: Test infrastructure upgraded to xUnit v3. New Foundatio.Xunit.v3 package with retry test attributes (RetryFactAttribute, RetryTheoryAttribute) for automatic retry of flaky tests. The existing Foundatio.Xunit package continues to support xUnit v2. by @niemyjski in #431InMemoryCacheClient now supports MaxMemorySize with per-entry size limits and intelligent eviction when memory budgets are exceeded. by @niemyjski, @copilot in #400SerializerException: New exception type for serialization-specific errors, enabling targeted error handling. by @niemyjski in b314a052MessageBusException: Consistent error handling for messaging operations with improved delayed message delivery. by @niemyjski in #443QueueDeleted event on IQueue<T>: Consumers can now subscribe to queue deletion notifications. by @niemyjski in #447Activity.AddException polyfill for recording exceptions in distributed traces across all target frameworks. by @niemyjski in #446IResiliencePolicy methods: Added sync overloads (Execute, ExecuteAsync) alongside existing async methods. by @ejsmith in #445QueueException, MessageBusException, StorageException, SerializerException, and CacheException are no longer retried by resilience policies. by @niemyjski in 318fa1a0GetAllExpirationsAsync and SetAllExpirationsAsync on ICacheClient: Bulk expiration read/write support with improved test coverage. by @niemyjski in #426JobStatus now supports a Description property. by @ejsmith in fdcc1442net10.0 target framework: Added .NET 10 support alongside .NET 8. by @niemyjski in 4c6aefed, a1089422TestCancellationToken in test harness: Added to TestLoggerBase and TestWithLoggingBase (v2 and v3) for better test cancellation support. by @niemyjski in c37508ef, d24afcb7ScopedCacheClient constructor that defaults shouldDispose to false to prevent accidental disposal. by @niemyjski in f28463b9AsyncLazy to avoid sync-over-async in constructors. by @niemyjski in 7050c523ScheduledTimer uses TimeProvider: Scheduled jobs now use TimeProvider for delays, improving testability. by @niemyjski in 77727cdfc06fcdefIsDisposed consolidation, and proper CancellationTokenSource disposal across all base classes. by @niemyjski in 49eec83a, be62be11MessageOptions: Added XML documentation and support for custom properties. by @niemyjski in 692c644dDataDictionary: Uses TryGetValue, nullable returns, and switch expressions. by @niemyjski in 2b423514ICacheClient, IQueue, IMessageBus, IFileStorage, ILockProvider, and IJob interfaces. by @niemyjski in 7fdad859TimeProvider and IResiliencePolicyProvider: CacheLockProvider and ThrottlingLockProvider now receive dependencies via constructor injection for improved testability and resilience. by @niemyjski in e3e815c4AsyncCountdownEvent to use WaitAsync consistently; QueueTestBase now implements IAsyncDisposable. by @niemyjski in d78f220dInMemoryQueue.AbandonAsync: Fixed flaky RunUntilEmptyAsync caused by abandon race. by @niemyjski in #470InvalidCastException in InMemoryCacheClient.GetAsync<object>(): Fixed crash for non-IConvertible types. by @copilot in #468ScheduledTimer: Fixed timing issue in scheduled timer callbacks. by @niemyjski in 65e3116aHybridCacheClient invalidation tests: Fixed flaky test caused by invalidation timing. by @niemyjski in 5acce8bcInMemoryQueue retry entry isolation: Each retry attempt now creates a fresh queue entry, preventing state leakage between attempts. by @niemyjski in #454MessageBusBase: Fixed deadlock in CancellationToken.Register callback. by @niemyjski in fdc47d22ThrottlingLockProvider period boundary issues: Hardened spin-wait with String.Equals, iteration cap, and improved diagnostics. by @niemyjski in d619b7e3, bbca0e39IndexOutOfRangeException in FastCloner GenerateProcessSetMethod: Fixed array bounds issue in deep cloning. by @niemyjski in f1992944ArgumentOutOfRangeException in DoMaintenance: Prevented negative timespan in queue maintenance scheduling. by @niemyjski in ee00d141DateTime overflow in cache maintenance: Added SafeAdd extension methods to prevent overflow exceptions when adding to DateTime.MaxValue / DateTime.MinValue. by @niemyjski in 6df04edfReplaceIfEqualAsync: Now correctly removes the key instead of setting an invalid TTL. by @niemyjski in ffc8d352ConnectionStringParser: Now handled gracefully instead of throwing. by @niemyjski in df7c6898FaultInjectingSerializer missing ITextSerializer: Now implements ITextSerializer to prevent unexpected Base64 encoding in tests. by @niemyjski in 87fdf6e3DateTime.UtcNow. by @niemyjski in #4884744fc1bHuge shoutout to @lofcz (Matej Stagl) for his outstanding contributions to this release! Matej is the author of FastCloner, which replaces DeepCloner as Foundatio's deep cloning engine. He contributed the integration PRs (#469, #485), kept FastCloner in sync with upstream improvements, and fixed a queue metrics edge case -- all while being incredibly responsive and collaborative. Thank you, Matej!
v13 drops netstandard2.0 and targets net8.0;net10.0. If you are on .NET Framework, you must stay on Foundatio v12.x.
IncrementAsync TTL: The TTL parameter now behaves consistently across all cache implementations. Review any code that relied on implementation-specific TTL behavior during increment operations.ListRemoveAsync: The ExpiresIn parameter has been removed. If you were passing an expiration to ListRemoveAsync, remove that argument.GetExpirationAsync: Return values are now normalized. Test any code that compared expiration values across implementations.ISerializer implementations now validate arguments consistently. If your code was passing null to serializer methods, you will now get ArgumentNullException.SerializerException is now thrown for serialization-specific failures. Update any catch blocks that were catching general exceptions from serializers.QueueException for queue-specific errors. Update exception handling accordingly.IQueueBehavior<T>) can no longer be reused across multiple queue instances.MessageBusException is now thrown for messaging errors. Update exception handling.MessageBusId and QueueId are now init-only. Set them during construction only.CacheClientExtensions.Set / SetAdd / SetRemove (obsolete overloads) -- These were renamed to ListAdd / ListRemove back in v9.0.0 (November 2019) to avoid confusion between "set" as a verb and "set" as a data structure. The old names have been marked [Obsolete] for over 6 years across 4 major versions. Use the List* equivalents.IFileStorage.GetFileStreamAsync(string path) (single-parameter overload) -- Deprecated in v10.7.0 (January 2024) when write-capable file streams were added in #290, which introduced an overload accepting StreamMode and CancellationToken. The single-parameter version has been [Obsolete] for 2+ years. Use GetFileStreamAsync(path, StreamMode.Read, cancellationToken) instead.Full Changelog: v12.0.0...v13.0.1
RabbitMQ delayed delivery and delayed-exchange plugin deprecation notes
This is a major release with 368 files changed across the entire Foundatio codebase. Here are the themes that define v13:
QueueException, MessageBusException, SerializerException) so consumers get predictable, catchable errors regardless of the underlying provider. These feature-specific exceptions are automatically excluded from resilience policy retries.null! suppressions across the codebase, fixing latent null bugs and adding proper nullable attributes. The API surface now accurately communicates nullability contracts.netstandard2.0 in favor of net8.0 + net10.0. Replaced DeepCloner with the actively-maintained FastCloner. ScheduledTimer now uses TimeProvider for testability.Foundatio v13 ships with a brand-new documentation site covering every subsystem with guides, configuration examples, and direct source code links. Key additions:
061bd763)8f6d37c1), queues (bb9af714), messaging (59cc2f57), locks (10241465), jobs (7df97b13), serialization (8819ba09), storage (bf2eb1b9)2fc124df, 0791b496)a6cfd75c)da2c6162)6860a0c1)98323dbe)456389ed)70a63d12)1853daee)7fdad859)3e003a86) and added sample projects + benchmarks to the solution (160dd74f)b8f0eba1)netstandard2.0 target: Foundatio now targets net8.0 and net10.0 only. Consumers on .NET Framework or older runtimes must stay on v12.x. by @niemyjski in 4c6aefed, a1089422ICacheClient.IncrementAsync TTL behavior: Increment operations now consistently apply the TTL parameter across all implementations. Removed ListRemoveAsync ExpiresIn argument to align with all other Remove methods. by @niemyjski in #434ICacheClient return values for expiration: GetExpirationAsync returns consistent values across implementations. by @niemyjski in #432ISerializer argument validation: All serializer implementations now consistently validate arguments and throw ArgumentException / ArgumentNullException. by @niemyjski in #440QueueException: Queue operations now throw QueueException for queue-specific errors. Guard added against reusing behavior instances. by @niemyjski in #448MessageBusId and QueueId changed to init-only properties: These properties can no longer be set after construction. by @niemyjski in b73bf128Set/SetAdd/SetRemove methods from cache extensions: These were renamed to List* in v9.0.0 (Nov 2019) and have been [Obsolete] for 6+ years. by @niemyjski in 150beed5GetFileStreamAsync overload: Deprecated in v10.7.0 (Jan 2024) when StreamMode was added. Use the overload accepting StreamMode and CancellationToken. by @niemyjski in 037baae5null! suppressions, fixed latent null bugs, and added nullable attributes across the codebase. Return types and parameters may have changed nullability. by @niemyjski in #484, #498Foundatio.Xunit.v3: Test infrastructure upgraded to xUnit v3. New Foundatio.Xunit.v3 package with retry test attributes (RetryFactAttribute, RetryTheoryAttribute) for automatic retry of flaky tests. The existing Foundatio.Xunit package continues to support xUnit v2. by @niemyjski in #431InMemoryCacheClient now supports MaxMemorySize with per-entry size limits and intelligent eviction when memory budgets are exceeded. by @niemyjski, @copilot in #400SerializerException: New exception type for serialization-specific errors, enabling targeted error handling. by @niemyjski in b314a052MessageBusException: Consistent error handling for messaging operations with improved delayed message delivery. by @niemyjski in #443QueueDeleted event on IQueue<T>: Consumers can now subscribe to queue deletion notifications. by @niemyjski in #447Activity.AddException polyfill for recording exceptions in distributed traces across all target frameworks. by @niemyjski in #446IResiliencePolicy methods: Added sync overloads (Execute, ExecuteAsync) alongside existing async methods. by @ejsmith in #445QueueException, MessageBusException, StorageException, SerializerException, and CacheException are no longer retried by resilience policies. by @niemyjski in 318fa1a0GetAllExpirationsAsync and SetAllExpirationsAsync on ICacheClient: Bulk expiration read/write support with improved test coverage. by @niemyjski in #426JobStatus now supports a Description property. by @ejsmith in fdcc1442net10.0 target framework: Added .NET 10 support alongside .NET 8. by @niemyjski in 4c6aefed, a1089422TestCancellationToken in test harness: Added to TestLoggerBase and TestWithLoggingBase (v2 and v3) for better test cancellation support. by @niemyjski in c37508ef, d24afcb7ScopedCacheClient constructor that defaults shouldDispose to false to prevent accidental disposal. by @niemyjski in f28463b9AsyncLazy to avoid sync-over-async in constructors. by @niemyjski in 7050c523ScheduledTimer uses TimeProvider: Scheduled jobs now use TimeProvider for delays, improving testability. by @niemyjski in 77727cdfc06fcdefIsDisposed consolidation, and proper CancellationTokenSource disposal across all base classes. by @niemyjski in 49eec83a, be62be11MessageOptions: Added XML documentation and support for custom properties. by @niemyjski in 692c644dDataDictionary: Uses TryGetValue, nullable returns, and switch expressions. by @niemyjski in 2b423514ICacheClient, IQueue, IMessageBus, IFileStorage, ILockProvider, and IJob interfaces. by @niemyjski in 7fdad859TimeProvider and IResiliencePolicyProvider: CacheLockProvider and ThrottlingLockProvider now receive dependencies via constructor injection for improved testability and resilience. by @niemyjski in e3e815c4AsyncCountdownEvent to use WaitAsync consistently; QueueTestBase now implements IAsyncDisposable. by @niemyjski in d78f220dInMemoryQueue.AbandonAsync: Fixed flaky RunUntilEmptyAsync caused by abandon race. by @niemyjski in #470InvalidCastException in InMemoryCacheClient.GetAsync<object>(): Fixed crash for non-IConvertible types. by @copilot in #468ScheduledTimer: Fixed timing issue in scheduled timer callbacks. by @niemyjski in 65e3116aHybridCacheClient invalidation tests: Fixed flaky test caused by invalidation timing. by @niemyjski in 5acce8bcInMemoryQueue retry entry isolation: Each retry attempt now creates a fresh queue entry, preventing state leakage between attempts. by @niemyjski in #454MessageBusBase: Fixed deadlock in CancellationToken.Register callback. by @niemyjski in fdc47d22ThrottlingLockProvider period boundary issues: Hardened spin-wait with String.Equals, iteration cap, and improved diagnostics. by @niemyjski in d619b7e3, bbca0e39IndexOutOfRangeException in FastCloner GenerateProcessSetMethod: Fixed array bounds issue in deep cloning. by @niemyjski in f1992944ArgumentOutOfRangeException in DoMaintenance: Prevented negative timespan in queue maintenance scheduling. by @niemyjski in ee00d141DateTime overflow in cache maintenance: Added SafeAdd extension methods to prevent overflow exceptions when adding to DateTime.MaxValue / DateTime.MinValue. by @niemyjski in 6df04edfReplaceIfEqualAsync: Now correctly removes the key instead of setting an invalid TTL. by @niemyjski in ffc8d352ConnectionStringParser: Now handled gracefully instead of throwing. by @niemyjski in df7c6898FaultInjectingSerializer missing ITextSerializer: Now implements ITextSerializer to prevent unexpected Base64 encoding in tests. by @niemyjski in 87fdf6e3DateTime.UtcNow. by @niemyjski in #4884744fc1bHuge shoutout to @lofcz (Matej Stagl) for his outstanding contributions to this release! Matej is the author of FastCloner, which replaces DeepCloner as Foundatio's deep cloning engine. He contributed the integration PRs (#469, #485), kept FastCloner in sync with upstream improvements, and fixed a queue metrics edge case -- all while being incredibly responsive and collaborative. Thank you, Matej!
v13 drops netstandard2.0 and targets net8.0;net10.0. If you are on .NET Framework, you must stay on Foundatio v12.x.
IncrementAsync TTL: The TTL parameter now behaves consistently across all cache implementations. Review any code that relied on implementation-specific TTL behavior during increment operations.ListRemoveAsync: The ExpiresIn parameter has been removed. If you were passing an expiration to ListRemoveAsync, remove that argument.GetExpirationAsync: Return values are now normalized. Test any code that compared expiration values across implementations.ISerializer implementations now validate arguments consistently. If your code was passing null to serializer methods, you will now get ArgumentNullException.SerializerException is now thrown for serialization-specific failures. Update any catch blocks that were catching general exceptions from serializers.QueueException for queue-specific errors. Update exception handling accordingly.IQueueBehavior<T>) can no longer be reused across multiple queue instances.MessageBusException is now thrown for messaging errors. Update exception handling.MessageBusId and QueueId are now init-only. Set them during construction only.CacheClientExtensions.Set / SetAdd / SetRemove (obsolete overloads) -- These were renamed to ListAdd / ListRemove back in v9.0.0 (November 2019) to avoid confusion between "set" as a verb and "set" as a data structure. The old names have been marked [Obsolete] for over 6 years across 4 major versions. Use the List* equivalents.IFileStorage.GetFileStreamAsync(string path) (single-parameter overload) -- Deprecated in v10.7.0 (January 2024) when write-capable file streams were added in #290, which introduced an overload accepting StreamMode and CancellationToken. The single-parameter version has been [Obsolete] for 2+ years. Use GetFileStreamAsync(path, StreamMode.Read, cancellationToken) instead.Full Changelog: v12.0.0...v13.0.0
Document RabbitMQ delayed delivery and plugin deprecation by @niemyjski in #490
Full Changelog: v13.0.0-beta3...v13.0.0-beta6
Document RabbitMQ delayed delivery and plugin deprecation by @niemyjski in #490
Full Changelog: v13.0.0-beta3...v13.0.0-beta5
Document RabbitMQ delayed delivery and plugin deprecation by @niemyjski in #490
Full Changelog: v13.0.0-beta3...v13.0.0-beta4
Fix InMemoryQueue retry: create fresh entry per attempt (entry isolation) by @niemyjski in #454
Full Changelog: v13.0.0-beta2...v13.0.0-beta3
[Breaking]: Normalize ISerializer argument validation and enhance test coverage by @niemyjski in #440
Full Changelog: v13.0.0-beta1...v13.0.0-beta2
This is a beta release. The breaking changes in caching behavior ensure consistency across all implementations and providers.
ICacheClient.IncrementAsync TTL behavior to be consistent across all implementations. #434 by @niemyjskiExpiresIn argument from ListRemoveAsync to align with all other Remove methods. #434 by @niemyjskiExpiresIn across all cache operations. #432 by @niemyjskiSet methods from cache extensions. by @niemyjskiGetAllExpirationsAsync and SetAllExpirationsAsync methods to ICacheClient. #426 by @niemyjskiGetExpirationsAsync method to retrieve cache entry expiration information. by @niemyjskiFoundatio.Xunit.v3 package with support for xUnit v3. #431 by @niemyjskiMessageBusBase for better resource management. by @niemyjskiScheduledTimer disposal and scheduling. by @niemyjskiDateTimeOffset for queue stats update for better timezone handling. by @niemyjskiHostBuilder due to deprecations. by @niemyjskiStorage Exception + FileSpec Data Prop by @niemyjski in #385
Full Changelog: v11.1.0...v12.0.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →