diff --git a/src/Microsoft.Azure.AppConfiguration.AspNetCore/Microsoft.Azure.AppConfiguration.AspNetCore.csproj b/src/Microsoft.Azure.AppConfiguration.AspNetCore/Microsoft.Azure.AppConfiguration.AspNetCore.csproj
index 3392fea8..4cd6bf4e 100644
--- a/src/Microsoft.Azure.AppConfiguration.AspNetCore/Microsoft.Azure.AppConfiguration.AspNetCore.csproj
+++ b/src/Microsoft.Azure.AppConfiguration.AspNetCore/Microsoft.Azure.AppConfiguration.AspNetCore.csproj
@@ -21,7 +21,7 @@
- 8.1.0
+ 8.1.1
diff --git a/src/Microsoft.Azure.AppConfiguration.Functions.Worker/Microsoft.Azure.AppConfiguration.Functions.Worker.csproj b/src/Microsoft.Azure.AppConfiguration.Functions.Worker/Microsoft.Azure.AppConfiguration.Functions.Worker.csproj
index d9659c5f..e327421b 100644
--- a/src/Microsoft.Azure.AppConfiguration.Functions.Worker/Microsoft.Azure.AppConfiguration.Functions.Worker.csproj
+++ b/src/Microsoft.Azure.AppConfiguration.Functions.Worker/Microsoft.Azure.AppConfiguration.Functions.Worker.csproj
@@ -24,7 +24,7 @@
- 8.1.0
+ 8.1.1
diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationOptions.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationOptions.cs
index 9391f21b..a3dbfa05 100644
--- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationOptions.cs
+++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationOptions.cs
@@ -22,6 +22,7 @@ public class AzureAppConfigurationOptions
{
private const int MaxRetries = 2;
private static readonly TimeSpan MaxRetryDelay = TimeSpan.FromMinutes(1);
+ private static readonly KeyValueSelector DefaultQuery = new KeyValueSelector { KeyFilter = KeyFilter.Any, LabelFilter = LabelFilter.Null };
private List _individualKvWatchers = new List();
private List _ffWatchers = new List();
@@ -159,7 +160,7 @@ public AzureAppConfigurationOptions()
};
// Adds the default query to App Configuration if and are never called.
- _selectors = new List { new KeyValueSelector { KeyFilter = KeyFilter.Any, LabelFilter = LabelFilter.Null } };
+ _selectors = new List { DefaultQuery };
}
///
@@ -201,7 +202,7 @@ public AzureAppConfigurationOptions Select(string keyFilter, string labelFilter
if (!_selectCalled)
{
- _selectors.Clear();
+ _selectors.Remove(DefaultQuery);
_selectCalled = true;
}
@@ -229,7 +230,7 @@ public AzureAppConfigurationOptions SelectSnapshot(string name)
if (!_selectCalled)
{
- _selectors.Clear();
+ _selectors.Remove(DefaultQuery);
_selectCalled = true;
}
diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationProvider.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationProvider.cs
index b509bd12..d7d629f8 100644
--- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationProvider.cs
+++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationProvider.cs
@@ -548,6 +548,11 @@ public void ProcessPushNotification(PushNotification pushNotification, TimeSpan?
if (_configClientManager.UpdateSyncToken(pushNotification.ResourceUri, pushNotification.SyncToken))
{
+ if (_requestTracingEnabled && _requestTracingOptions != null)
+ {
+ _requestTracingOptions.IsPushRefreshUsed = true;
+ }
+
SetDirty(maxDelay);
}
else
diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/Constants/RequestTracingConstants.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/Constants/RequestTracingConstants.cs
index 1084c274..f732ab95 100644
--- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/Constants/RequestTracingConstants.cs
+++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/Constants/RequestTracingConstants.cs
@@ -33,6 +33,7 @@ internal class RequestTracingConstants
public const string LoadBalancingEnabledTag = "LB";
public const string SignalRUsedTag = "SignalR";
public const string FailoverRequestTag = "Failover";
+ public const string PushRefreshTag = "PushRefresh";
public const string FeatureFlagFilterTypeKey = "Filter";
public const string CustomFilter = "CSTM";
diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/Microsoft.Extensions.Configuration.AzureAppConfiguration.csproj b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/Microsoft.Extensions.Configuration.AzureAppConfiguration.csproj
index 9cac9155..91b90bb1 100644
--- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/Microsoft.Extensions.Configuration.AzureAppConfiguration.csproj
+++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/Microsoft.Extensions.Configuration.AzureAppConfiguration.csproj
@@ -35,7 +35,7 @@
- 8.1.0
+ 8.1.1
diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/RequestTracingOptions.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/RequestTracingOptions.cs
index 3838ee95..bd8b7582 100644
--- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/RequestTracingOptions.cs
+++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/RequestTracingOptions.cs
@@ -63,6 +63,11 @@ internal class RequestTracingOptions
///
public bool IsFailoverRequest { get; set; } = false;
+ ///
+ /// Flag to indicate whether push refresh is used.
+ ///
+ public bool IsPushRefreshUsed { get; set; } = false;
+
///
/// Checks whether any tracing feature is used.
///
diff --git a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/TracingUtils.cs b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/TracingUtils.cs
index b1b2b196..b3e12913 100644
--- a/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/TracingUtils.cs
+++ b/src/Microsoft.Extensions.Configuration.AzureAppConfiguration/TracingUtils.cs
@@ -201,6 +201,11 @@ private static string CreateCorrelationContextHeader(RequestType requestType, Re
correlationContextTags.Add(RequestTracingConstants.FailoverRequestTag);
}
+ if (requestTracingOptions.IsPushRefreshUsed)
+ {
+ correlationContextTags.Add(RequestTracingConstants.PushRefreshTag);
+ }
+
var sb = new StringBuilder();
foreach (KeyValuePair kvp in correlationContextKeyValues)
diff --git a/tests/Tests.AzureAppConfiguration/FeatureManagementTests.cs b/tests/Tests.AzureAppConfiguration/FeatureManagementTests.cs
index c374e2c3..d96e9e39 100644
--- a/tests/Tests.AzureAppConfiguration/FeatureManagementTests.cs
+++ b/tests/Tests.AzureAppConfiguration/FeatureManagementTests.cs
@@ -1066,6 +1066,63 @@ public void SelectFeatureFlags()
Assert.Null(config["FeatureManagement:App2_Feature2"]);
}
+ [Fact]
+ public void SelectOrderDoesNotAffectLoad()
+ {
+ var mockResponse = new Mock();
+ var mockClient = new Mock(MockBehavior.Strict);
+
+ List kvCollection = new List
+ {
+ ConfigurationModelFactory.ConfigurationSetting("TestKey1", "TestValue1", "label",
+ eTag: new ETag("0a76e3d7-7ec1-4e37-883c-9ea6d0d89e63")),
+ ConfigurationModelFactory.ConfigurationSetting("TestKey2", "TestValue2", "label",
+ eTag: new ETag("31c38369-831f-4bf1-b9ad-79db56c8b989"))
+ };
+
+ MockAsyncPageable GetTestKeys(SettingSelector selector, CancellationToken ct)
+ {
+ List settingCollection;
+
+ if (selector.KeyFilter.StartsWith(FeatureManagementConstants.FeatureFlagMarker))
+ {
+ settingCollection = _featureFlagCollection;
+ }
+ else
+ {
+ settingCollection = kvCollection;
+ }
+
+ var copy = new List();
+ var newSetting = settingCollection.FirstOrDefault(s => (s.Key == selector.KeyFilter && s.Label == selector.LabelFilter));
+ if (newSetting != null)
+ copy.Add(TestHelpers.CloneSetting(newSetting));
+ return new MockAsyncPageable(copy);
+ }
+
+ mockClient.Setup(c => c.GetConfigurationSettingsAsync(It.IsAny(), It.IsAny()))
+ .Returns((Func)GetTestKeys);
+
+ var config = new ConfigurationBuilder()
+ .AddAzureAppConfiguration(options =>
+ {
+ options.ClientManager = TestHelpers.CreateMockedConfigurationClientManager(mockClient.Object);
+ options.UseFeatureFlags(ff =>
+ {
+ ff.Select("App1_Feature1", "App1_Label");
+ ff.Select("App2_Feature1", "App2_Label");
+ });
+ options.Select("TestKey1", "label");
+ options.Select("TestKey2", "label");
+ })
+ .Build();
+
+ Assert.Equal("True", config["FeatureManagement:App1_Feature1"]);
+ Assert.Equal("False", config["FeatureManagement:App2_Feature1"]);
+ Assert.Equal("TestValue1", config["TestKey1"]);
+ Assert.Equal("TestValue2", config["TestKey2"]);
+ }
+
[Fact]
public void TestNullAndMissingValuesForConditions()
{