Release v24.1 | Summer-Autumn 2025 | Globality release#2349
Merged
raman-m merged 3 commits intorelease/24.1from Dec 25, 2025
Merged
Release v24.1 | Summer-Autumn 2025 | Globality release#2349raman-m merged 3 commits intorelease/24.1from
raman-m merged 3 commits intorelease/24.1from
Conversation
Member
Author
|
@TomPallister @RaynaldM @ggnaegi 🎄 Merry Christmas! 🎅 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summer-Autumn 2025 (version 24.1) aka Globality release
ℹ️ About
In this minor release, the Ocelot team put the spotlight on the Configuration feature as part of their semi-annual 2025 effort, with a particular focus on the Global Configuration Schema. This release enhances support for global configurations across both routing modes: the classic static Routing and the service discovery-based Dynamic Routing.
The updated documentation highlights the deprecation of certain options through multiple notes and warnings. This deprecation process will be completed in the upcoming .NET 10 release. With the
[Obsolete]attributes in place, C# developers will notice several warnings in the build logs during compilation.On top of that, this release brings a great enhancement to the Kubernetes provider, also known as the Ocelot.Provider.Kubernetes package.
🆕 What's New?
Configuration: The "Dynamic routing global configuration" feature has been redesigned by @raman-m and contributors.
This update brings changes to the Dynamic Route Schema and Global Configuration Schema, while the Route Schema stays the same apart from deprecation updates. All work was coordinated under issue Dynamic routing global configuration #585, which addressed the challenges of configuring Ocelot's most popular features globally before version 24.1, when dynamic routing gained global configuration partial support, but static routing mostly lacked it. A key outcome of Dynamic routing global configuration #585 is the ability to override global configuration options within the
DynamicRoutescollection. This ongoing issue will continue to require attention, as adapting static route global configurations for dynamic routing is complex and, in some cases, impossible. This will be a challenge for future Ocelot releases and the community.Kubernetes: The "Kubernetes provider based on watch requests" feature by @kick2nick in PR #2168 A brand-new
WatchKubeprovider for Kubernetes service discovery #2174. ⭐The Ocelot.Provider.Kubernetes package now features a new WatchKube provider for Kubernetes service discovery. This provider is a great fit for high-load environments where the older
KubeandPollKubeproviders struggle to handle heavy traffic, often leading to increased log errors, HTTP 500 issues, and potential Ocelot instance failures.WatchKubeis the next step in the evolution of these providers, leveraging the reactive capabilities of the KubeClient API. For guidance on choosing the right provider for your Kubernetes setup, check out the "Comparing providers" section in the documentation.Configuration: The "Routing default timeout" feature by @hogwartsdeveloper in PR #1314 #1869 #2072 Default timeout for all levels, including route, global, and QoS #2073.
In the past, the
Timeoutsetting in the Route Schema didn't actually stop requests, defaulting instead to a fixed 90 seconds. Custom timeouts were handled using the Quality of Service Timeout strategy, and this only applied if Polly and the Ocelot.Provider.Polly package were used. Now, theTimeoutoption (in seconds) can be set at the route, global, and QoS levels. The Global Configuration Schema and Dynamic Route Schema also include the newTimeoutsetting, making it possible to configure default timeouts for dynamic routing as well.Quality of Service: The "FailureRatio and SamplingDuration parameters of Polly V8 circuit-breaker" feature by @RaynaldM in PR #2080 Add new
FailureRatioandSamplingDurationV8 parameters to fine-tune Polly's circuit-breaker strategy via route-level and global QoS options #2081.Starting with version 24.1, two new parameters in QoSOptions,
FailureRatioandSamplingDuration, let you fine-tune the behavior of the Circuit Breaker strategy. Both can be configured globally, even with dynamic routing.Please note that
DurationOfBreak,ExceptionsAllowedBeforeBreaking, andTimeoutValueare now deprecated in 24.1, so check the QoSOptions Schema documentation for details.🆙 What's Updated?
Configuration: Several File-model options have been deprecated by @raman-m.
The updated docs now highlight these deprecated options with multiple notes and warnings. The v24.1 deprecation process will wrap up in the upcoming .NET 10 release. Due to the
Obsoleteattributes, C# developers will notice several build warnings during compilation.Testing: The Ocelot.Testing project was deprecated by @raman-m in PR Deprecate the Ocelot.Testing project in favor of its NuGet package #2295
The project was removed from the main repo and moved to its own Ocelot.Testing repository. This change allows the Ocelot.Testing package to be shared independently for extension package delivery. The Ocelot team also plans to deprecate more projects and move them to separate repos because: a) despite the fact that a monorepo enables faster builds and quicker delivery; b) but the release process can be delayed by missing versions of integrated libraries in extension packages. The goal is for the Ocelot repo to only contain essential projects, avoiding delays caused by integrated package release schedules. Legacy or abandoned integrated packages should be deprecated and maintained in their own repos with independent release cycles.
Headers Transformation: Added global configuration by @marklonquist in PR #1658 Add global configuration for Headers Transformation #1659.
The Global Configuration Schema now includes new
DownstreamHeaderTransformandUpstreamHeaderTransformoptions. These work only with static routes, meaning theRoutescollection (see Route Schema). They aren't supported for dynamic routes because they're not part of the Dynamic Route Schema, and Ocelot Core doesn't read global configuration of this feature in dynamic routing mode. This is noted in the Roadmap documentation.Authentication: Added global configuration by @jlukawska in PR #842 #1414 Introduce
AllowAnonymousauthentication option with globalAuthenticationOptionsconfiguration #2114.The Global Configuration Schema now includes a new
AuthenticationOptionsproperty for setting up static routes globally. This also introduces theAllowAnonymousboolean option withinAuthenticationOptionsto control static route authentication. Later, PR #585 #2316 Authentication global configuration #2336 extended global authentication support to dynamic routes.Note: The
AuthenticationProviderKeyoption is deprecated in version 24.1—see theAuthenticationOptionsSchema documentation for details.Rate Limiting: Re-designed global configuration by @MiladRv and @raman-m in PR #585 #1229 #1598 #1915 Rate limiting global configuration #2294.
The Global Configuration Schema now includes a new
RateLimitOptionsproperty for both static and dynamic routes. Previously, global configuration was available throughRateLimitOptionsin dynamic routing mode, while route overriding used the now-deprecatedRateLimitRulefrom the Dynamic Route Schema.This marks the second major overhaul of the Rate Limiting feature since the first update in PR #1590 Use correct interval for request counting #1592. A new
Waitoption has been added, replacing the deprecatedPeriodTimespan, to enhance the Fixed Window algorithm. The full list of deprecated options can be found in the Deprecated Options documentation.Load Balancer: Added global configuration by @raman-m in PR #585 #2319 Load Balancer global configuration #2324.
The Global Configuration Schema now includes a new
LoadBalancerOptionsproperty for both static and dynamic routes. Previously, global configuration was available throughLoadBalancerOptionsin dynamic routing mode without dynamic route overrides. Starting with version 24.1, the Dynamic Route Schema also supportsLoadBalancerOptionsfor overriding, and global configuration for static routes is now supported as well.Caching: Added global configuration by @raman-m in PR #585 #2330 Caching global configuration #2331.
The Global Configuration Schema now includes a new
CacheOptionsproperty for both static and dynamic routes. Global configuration has been available for static routes since version 23.3, but starting with version 24.1, the Dynamic Route Schema also supportsCacheOptionsfor overriding.Note that the
FileCacheOptionsproperty in the Route Schema (static routes) is deprecated in version 24.1. For more details, see the caching Configuration documentation.Http Handler: Added global configuration by @raman-m in PR #585 #2320 Http handler global configuration #2332.
The Global Configuration Schema now includes a new
HttpHandlerOptionsproperty for both static and dynamic routes. Previously, global configuration was available throughHttpHandlerOptionsin dynamic routing mode without dynamic route overriding. Starting with version 24.1, the Dynamic Route Schema also supportsHttpHandlerOptionsfor overriding, and global configuration is now available for static routes as well.Authentication: Added global configuration by @raman-m in PR #585 #2316 Authentication global configuration #2336.
The Global Configuration Schema now includes a new
AuthenticationOptionsproperty for both static and dynamic routes. Starting with version 24.1, the Dynamic Route Schema also supportsAuthenticationOptionsto override global settings.Note that the
AuthenticationProviderKeyoption is deprecated in version 24.1, so check theAuthenticationOptionsSchema documentation for details.Quality of Service: Added global configuration by @raman-m in PR #585 #2338 Quality of Service global configuration #2339.
The Global Configuration Schema now includes a new
QoSOptionsproperty for both static and dynamic routes. Previously, global configuration was available throughQoSOptionsin dynamic routing mode without the option for dynamic route overrides. Starting with version 24.1, the Dynamic Route Schema supportsQoSOptionsfor overriding, and global configuration support is now available for static routes as well.Note that the
DurationOfBreak,ExceptionsAllowedBeforeBreaking, andTimeoutValueoptions are deprecated in version 24.1. For details, see theQoSOptionsSchema documentation.DevOps: Stabilized tests and reviewed GH-Actions workflows by @raman-m in PRs Follow-up on #2335 and #2339: Stabilize flaky tests in the CI/CD environment #2342 and Pre-release 24.1 | +semver: patch #2345.
These efforts kept the CI/CD builds in GitHub Actions stable, targeting the alpha release of version 24.1. The CI/CD environment was set up and tested GH-Actions workflows in advance for the beta release, which is the goal of PR #2343 Release 24.1 Beta | +semver: minor #2347.
📦 Patches
Websockets: Issue The WebSocket is in an invalid state (
Aborted) for this operation. Valid states are:Open,CloseReceived#930 patch by @hogwartsdeveloper in PR #930 Try to close WebSocket destination when state is Open or CloseReceived #2091.This update removes the troublesome
System.Net.WebSockets.WebSocketExceptionfrom logs, preventing Ocelot from running into 500 status disasters. The issue stemmed from client-side or network events that Ocelot'sWebSocketsProxyMiddlewarecouldn't anticipate on the server side. The patch now checks for incorrect connection statuses, attempting to close the connection and end server-side tasks gracefully without errors.Kubernetes: Issue PollKube doesn't work at first request #2304 patch by @raman-m in PR #2304 Utilize
ConcurrentQueue<T>for managing service versions during polling by thePollKubediscovery provider #2335.This update fixes the
PollKubeprovider to address a bug with the first cold request, where the winning thread got an empty collection before the initial callback was triggered. The solution is to call the integrated discovery provider for the first cold request when the queue is empty.Authorization: Issue AllowedScopes does not match string array in JWT scope claim #913 patch by @mehyaa in PR #913 Support RFC 8693 (OAuth 2.0 Token Exchange) for the "scope" claim in ScopesAuthorizer #1478.
Starting with version 24.1, Ocelot now supports RFC 8693 (OAuth 2.0 Token Exchange) for the
scopeclaim in theScopesAuthorizerservice, also referred to as theIScopesAuthorizerservice in the DI container.Features
WatchKubeprovider for Kubernetes service discovery #2174FailureRatioandSamplingDurationV8 parameters to fine-tune Polly's circuit-breaker strategy via route-level and global QoS options #2081AllowAnonymousauthentication option with globalAuthenticationOptionsconfiguration #2114ConcurrentQueue<T>for managing service versions during polling by thePollKubediscovery provider #2335Comparing changes 24.0.1...24.1.0-beta.1
Predecessors
net9.0TFM | .NET 9 release | +semver: breaking #2286Successor