.NET
This .NET SDK is designed to help you integrate with Unleash and evaluate feature flags inside your application.
You can use this client with Unleash Enterprise or Unleash Open Source.
Migrating to v5
If you use bootstrapping, custom strategies, or a custom JSON serializer, read the complete migration guide before upgrading to v5.
Features
Supported Frameworks (through binaries for net6.0 and netstandard2.0)
- .NET 6 and above
- NET Standard 2.0
- .NET Framework 4.7 and above
Extendable architecture
- Inject your own implementations of key components (background task scheduler, http client factory)
Getting Started
Install the Package
Install the latest version of Unleash.Client from nuget.org or use the dotnet cli:
Create a New Unleash Instance
Important: In almost every case, you only want a single, shared instance of the Unleash client (a singleton) in your application . You would typically use a dependency injection framework to inject it where you need it. Having multiple instances of the client in your application could lead to inconsistencies and performance degradation.
If you create more than 10 instances, Unleash will attempt to log warnings about your usage.
To create a new instance of Unleash you need to create and pass in an UnleashSettings object.
When creating an instance of the Unleash client, you can choose to do it either synchronously or asynchronously. The SDK will synchronize with the Unleash API on initialization, so it can take a moment for the it to reach the correct state. With an asynchronous startup, this would happen in the background while the rest of your code keeps executing. In most cases, this isn’t an issue. But if you want to wait until the SDK is fully synchronized, then you should use the configuration explained in the synchronous startup section. This is usually not an issue and Unleash will do this in the background as soon as you initialize it. However, if it’s important that you do not continue execution until the SDK has synchronized, then you should use the configuration explained in the synchronous startup section.
When your application shuts down, remember to dispose the unleash instance.
Synchronous Startup
This unleash client does not throw any exceptions if the unleash server is unreachable. Also, fetching features will return the default value if the feature toggle cache has not yet been populated. In many situations it is perferable to throw an error than allow an application to startup with incorrect feature toggle values. For these cases, we provide a client factory with the option for synchronous initialization.
The CreateClientAsync method was introduced in version 1.5.0, making the previous Generate method obsolete. There’s also a CreateClient method available if you don’t prefer the async version.
Project-scoped Unleash Client
If you’re organizing your feature toggles in projects in Unleash Enterprise, you can scope your API tokens to include only the specific projects needed for your client. Then use that token when configuring the Unleash client:
Check Feature Toggles
The IsEnabled method allows you to check whether a feature is enabled:
If the Unleash client can’t find the feature you’re trying to check, it will default to returning false. You can change this behavior on a per-invocation basis by providing a fallback value as a second argument.
For instance, unleash.IsEnabled("SuperAwesomeFeature") would return false if SuperAwesomeFeature doesn’t exist. But if you’d rather it returned true, then you could pass that as the second argument:
Providing Context
You can also provide an Unleash context to the IsEnabled method:
Refer to the Unleash context section for more information about using the Unleash context in the .NET SDK.
Handling Events
Currently supported events:
- Impression data events
- Error events
- Toggles updated event
Activation Strategies
The .NET client comes with implementations for the built-in activation strategies provided by unleash.
- DefaultStrategy
- UserWithIdStrategy
- GradualRolloutRandomStrategy
- GradualRolloutUserWithIdStrategy
- GradualRolloutSessionIdStrategy
- RemoteAddressStrategy
- ApplicationHostnameStrategy
- FlexibleRolloutStrategy
Read more about the strategies in the activation strategy reference docs.
Custom Strategies
You can also specify and implement your own custom strategies. The specification must be registered in the Unleash UI and you must register the strategy implementation when you wire up unleash.
Unleash Context
In order to use some of the common activation strategies you must provide an Unleash context.
If you have configured custom stickiness and want to use that with the FlexibleRolloutStrategy or Variants, add the custom stickiness parameters to the Properties dictionary on the Unleash Context:
UnleashContextProvider
The provider typically binds the context to the same thread as the request. If you are using Asp.Net the UnleashContextProvider will typically be a ‘request scoped’ instance.
Custom HTTP Headers
If you want the client to send custom HTTP Headers with all requests to the Unleash api you can define that by setting them via the UnleashSettings.
HttpMessageHandlers/Custom HttpClient Initialization
If you need to specify HttpMessageHandlers or to control the instantiation of the HttpClient, you can create a custom HttpClientFactory that inherits from DefaultHttpClientFactory, and override the method CreateHttpClientInstance. Then configure UnleashSettings to use your custom HttpClientFactory.
Dynamic Custom HTTP Headers
If you need custom http headers that change during the lifetime of the client, a provider can be defined via the UnleashSettings.
Logging
By default Unleash-client uses LibLog to integrate with the currently configured logger for your application. The supported loggers are:
- Serilog
- NLog
- Log4Net
- EntLib
- Loupe
Custom Logger Integration
To plug in your own logger you can implement the ILogProvider interface, and register it with Unleash:
The GetLogger method is responsible for returning a delegate to be used for logging, and your logging integration should be placed inside that delegate:
Local Backup
By default unleash-client fetches the feature toggles from unleash-server every 20s, and stores the result in temporary .json file which is located in System.IO.Path.GetTempPath() directory. This means that if the unleash-server becomes unavailable, the unleash-client will still be able to toggle the features based on the values stored in .json file. As a result of this, the second argument of IsEnabled will be returned in two cases:
- When .json file does not exists
- When the named feature toggle does not exist in .json file
The backup file name will follow this pattern: {fileNameWithoutExtension}-{AppName}-{InstanceTag}-{SdkVersion}.{extension}, where InstanceTag is either what you configure on UnleashSettings during startup, or a formatted string with a random component following this pattern: {Dns.GetHostName()}-generated-{Guid.NewGuid()}.
You can configure InstanceTag like this:
Bootstrapping
- Unleash supports bootstrapping from a JSON string.
- Configure your own custom provider implementing the
IToggleBootstrapProviderinterface’s single methodToggleCollection Read(). This should return aStringthat represents the API response from{unleash_url}/api/client/features - Example bootstrap files can be found in the json files located in tests/Unleash.Tests/App_Data
- Our assumption is this can be use for applications deployed to ephemeral containers or more locked down file systems where Unleash’s need to write the backup file is not desirable or possible.
- Loading with bootstrapping defaults to override feature toggles loaded from Local Backup, this override can be switched off by setting the
UnleashSettings.ToggleOverrideproperty tofalse
Configuring with the UnleashSettings:
Provided Bootstrappers
- Two ToggleBootstrapProviders are provided
- These are found in the
Unleash.Utilities:
ToggleBootstrapFileProvider
- Unleash comes with a
ToggleBootstrapFileProviderwhich implements theIToggleBootstrapProviderinterface. - Configure with
UnleashSettingshelper method:
ToggleBootstrapUrlProvider
-
Unleash also comes with a
ToggleBootstrapUrlProviderwhich implements theIToggleBootstrapProviderinterface. -
Fetches JSON from a webaddress using
HttpMethod.Get -
Configure with
UnleashSettingshelper method:
Run Unleash Server with Docker Locally
The Unleash team have made a separate project which runs unleash server inside docker. Please see unleash-docker for more details.
Unit Testing
You may want to mock the IUnleash interface in your unit tests. The SDK comes with a FakeUnleash implementation that you can use for this purpose.
Example usage:
SDK Development
Setup/Tool Suggestions/Requirements
Visual Studio Community / VS Code / JetBrains Rider Microsoft C# Dev Kit extension for VS Code .NET 6
Build/Test
Code lives in ./src/Unleash
Tests live in ./tests/Unleash.Tests
- Build:
dotnet build - Test:
dotnet test- This also executes spec tests
Formatting
We enforce formatting with dotnet format. This can be installed using the following command:
dotnet tool install -g dotnet-format.
Release Process
- Draft a new release in releases, target
main - Choose a new version (ie
4.1.9withoutv) - Input new version number as tag, choose
create new tag <x.x.x> on publish - Set the same version number as
Release title - The button
Generate release notesshould give a summary of new commits and contributors - Choose to
set as the latest release - Click
Publish release. This starts the release workflow which builds the new release and pushes the artifacts to NuGet
Other Information
- Check out our guide for more information on how to build and scale feature flag systems