diff --git a/NuGet.config b/NuGet.config
index 9fa908668f8f..e1e647dd1771 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -4,10 +4,10 @@
-
+
-
+
@@ -30,10 +30,10 @@
-
+
-
+
diff --git a/eng/Baseline.Designer.props b/eng/Baseline.Designer.props
index f566358b9acb..dfd9247704ed 100644
--- a/eng/Baseline.Designer.props
+++ b/eng/Baseline.Designer.props
@@ -2,117 +2,117 @@
$(MSBuildAllProjects);$(MSBuildThisFileFullPath)
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
-
-
+
+
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
@@ -120,279 +120,279 @@
- 9.0.0
+ 9.0.1
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
- 9.0.0
+ 9.0.1
-
-
-
+
+
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
-
-
+
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
-
+
+
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
-
-
+
+
- 9.0.0
+ 9.0.1
-
-
-
-
-
+
+
+
+
+
- 9.0.0
+ 9.0.1
-
-
-
-
-
+
+
+
+
+
- 9.0.0
+ 9.0.1
-
-
+
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
-
-
-
-
-
+
+
+
+
+
+
- 9.0.0
+ 9.0.1
-
-
-
+
+
+
- 9.0.0
+ 9.0.1
-
-
-
+
+
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
+
-
+
-
+
- 9.0.0
+ 9.0.1
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
-
+
+
- 9.0.0
+ 9.0.1
-
-
+
+
-
-
+
+
-
-
+
+
- 9.0.0
+ 9.0.1
-
+
-
+
-
+
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
@@ -401,83 +401,83 @@
- 9.0.0
+ 9.0.1
-
-
+
+
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
-
-
-
+
+
+
-
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
- 9.0.0
+ 9.0.1
-
-
+
+
-
+
-
-
+
+
- 9.0.0
+ 9.0.1
-
-
+
+
- 9.0.0
+ 9.0.1
-
-
+
+
- 9.0.0
+ 9.0.1
@@ -493,510 +493,510 @@
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
-
-
-
+
+
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
-
+
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
-
+
+
-
-
+
+
-
-
+
+
- 9.0.0
+ 9.0.1
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
- 9.0.0
+ 9.0.1
-
-
+
+
-
+
-
-
+
+
-
-
-
+
+
+
- 9.0.0
+ 9.0.1
-
+
-
+
-
+
- 9.0.0
+ 9.0.1
-
+
-
+
-
+
- 9.0.0
+ 9.0.1
-
+
-
+
-
+
- 9.0.0
+ 9.0.1
-
-
-
-
+
+
+
+
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
-
+
+
-
-
+
+
-
-
+
+
- 9.0.0
+ 9.0.1
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
- 9.0.0
+ 9.0.1
-
-
+
+
-
-
+
+
-
-
+
+
- 9.0.0
+ 9.0.1
-
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
-
-
+
+
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
+
-
+
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
- 9.0.0
+ 9.0.1
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
- 9.0.0
+ 9.0.1
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
- 9.0.0
+ 9.0.1
- 9.0.0
+ 9.0.1
-
+
- 9.0.0
+ 9.0.1
-
+
\ No newline at end of file
diff --git a/eng/Baseline.xml b/eng/Baseline.xml
index 1b4ce55e8e33..b081a19bb966 100644
--- a/eng/Baseline.xml
+++ b/eng/Baseline.xml
@@ -4,110 +4,110 @@ This file contains a list of all the packages and their versions which were rele
Update this list when preparing for a new patch.
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index b87535c6b679..206dc89ef3ad 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -9,334 +9,334 @@
-->
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8
+ 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8
+ 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8
+ 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8
+ 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8
+ 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8
+ 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8
+ 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8
+ 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://github.com/dotnet/xdt
- 1a54480f52703fb45fac2a6b955247d33758383e
+ 63ae81154c50a1cf9287cc47d8351d55b4289e6d
-
+
https://github.com/dotnet/xdt
- 1a54480f52703fb45fac2a6b955247d33758383e
+ 63ae81154c50a1cf9287cc47d8351d55b4289e6d
@@ -367,60 +367,60 @@
bc1c3011064a493b0ca527df6fb7215e2e5cfa96
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
-
+
https://github.com/dotnet/source-build-externals
- c65b1c1affed1f4847f9c3f81623dfa929d21e1a
+ ab469606a3e6b026dcac301e2dab96117c94faeb
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- c8acea22626efab11c13778c028975acdc34678f
+ 80aa709f5d919c6814726788dc6dabe23e79e672
https://github.com/dotnet/winforms
9b822fd70005bf5632d12fe76811b97b3dd044e4
-
+
https://github.com/dotnet/arcade
- b41381d5cd633471265e9cd72e933a7048e03062
+ 8cc6ecd76c24ef6665579a5c5e386a211a1e7c54
-
+
https://github.com/dotnet/arcade
- b41381d5cd633471265e9cd72e933a7048e03062
+ 8cc6ecd76c24ef6665579a5c5e386a211a1e7c54
-
+
https://github.com/dotnet/arcade
- b41381d5cd633471265e9cd72e933a7048e03062
+ 8cc6ecd76c24ef6665579a5c5e386a211a1e7c54
-
+
https://github.com/dotnet/arcade
- b41381d5cd633471265e9cd72e933a7048e03062
+ 8cc6ecd76c24ef6665579a5c5e386a211a1e7c54
-
+
https://github.com/dotnet/arcade
- b41381d5cd633471265e9cd72e933a7048e03062
+ 8cc6ecd76c24ef6665579a5c5e386a211a1e7c54
-
+
https://github.com/dotnet/arcade
- b41381d5cd633471265e9cd72e933a7048e03062
+ 8cc6ecd76c24ef6665579a5c5e386a211a1e7c54
-
+
https://github.com/dotnet/extensions
- cfed375f3161f2e553e946b4f968b818e8e858f1
+ 309f2b7f73a28ffd75dac15434d160e5bd765384
-
+
https://github.com/dotnet/extensions
- cfed375f3161f2e553e946b4f968b818e8e858f1
+ 309f2b7f73a28ffd75dac15434d160e5bd765384
https://github.com/nuget/nuget.client
diff --git a/eng/Versions.props b/eng/Versions.props
index 3d2831de877a..796893bce1e8 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -8,7 +8,7 @@
9
0
- 1
+ 2
true
@@ -68,92 +68,92 @@
-->
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1-servicing.24610.10
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1-servicing.24610.10
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1-servicing.24610.10
- 9.0.1-servicing.24610.10
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2-servicing.25066.10
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2-servicing.25066.10
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2-servicing.25066.10
+ 9.0.2-servicing.25066.10
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
- 9.0.1-servicing.24610.10
- 9.0.1
+ 9.0.2-servicing.25066.10
+ 9.0.2
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
- 9.1.0-preview.1.24575.1
- 9.1.0-preview.1.24575.1
+ 9.1.0-preview.1.25060.3
+ 9.1.0-preview.1.25060.3
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
- 9.0.1
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
+ 9.0.2
4.11.0-3.24554.2
4.11.0-3.24554.2
@@ -166,12 +166,12 @@
6.2.4
6.2.4
- 9.0.0-beta.24572.2
- 9.0.0-beta.24572.2
- 9.0.0-beta.24572.2
- 9.0.0-beta.24572.2
+ 9.0.0-beta.25058.5
+ 9.0.0-beta.25058.5
+ 9.0.0-beta.25058.5
+ 9.0.0-beta.25058.5
- 9.0.0-alpha.1.24568.2
+ 9.0.0-alpha.1.24575.1
9.0.0-alpha.1.24413.1
@@ -179,8 +179,8 @@
9.0.0-rtm.24512.2
- 9.0.0-preview.24522.2
- 9.0.0-preview.24522.2
+ 10.0.0-preview.24609.2
+ 10.0.0-preview.24609.2
-
+
-
+
diff --git a/eng/targets/Helix.targets b/eng/targets/Helix.targets
index 43bf0cb7f7f1..70e01877befa 100644
--- a/eng/targets/Helix.targets
+++ b/eng/targets/Helix.targets
@@ -19,7 +19,7 @@
$(HelixQueueAlmaLinux8);
$(HelixQueueAlpine318);
$(HelixQueueDebian12);
- $(HelixQueueFedora38);
+ $(HelixQueueFedora40);
$(HelixQueueMariner);
Ubuntu.2004.Amd64.Open;
diff --git a/global.json b/global.json
index e4674ed713f8..f0a083e23ce2 100644
--- a/global.json
+++ b/global.json
@@ -1,9 +1,9 @@
{
"sdk": {
- "version": "9.0.100"
+ "version": "9.0.101"
},
"tools": {
- "dotnet": "9.0.100",
+ "dotnet": "9.0.101",
"runtimes": {
"dotnet/x86": [
"$(MicrosoftNETCoreBrowserDebugHostTransportVersion)"
@@ -27,7 +27,7 @@
"jdk": "11.0.24"
},
"msbuild-sdks": {
- "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.24572.2",
- "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.24572.2"
+ "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.25058.5",
+ "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.25058.5"
}
}
diff --git a/src/Components/WebAssembly/DevServer/src/Server/Startup.cs b/src/Components/WebAssembly/DevServer/src/Server/Startup.cs
index 046031a29f79..a9870bf688fb 100644
--- a/src/Components/WebAssembly/DevServer/src/Server/Startup.cs
+++ b/src/Components/WebAssembly/DevServer/src/Server/Startup.cs
@@ -6,6 +6,7 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Components.WebAssembly.DevServer.Server;
@@ -69,6 +70,14 @@ public static void Configure(IApplicationBuilder app, IConfiguration configurati
{
OnPrepareResponse = fileContext =>
{
+ // Avoid caching index.html during development.
+ // When hot reload is enabled, a middleware injects a hot reload script into the response HTML.
+ // We don't want the browser to bypass this injection by using a cached response that doesn't
+ // contain the injected script. In the future, if script injection is removed in favor of a
+ // different mechanism, we can delete this comment and the line below it.
+ // See also: https://github.com/dotnet/aspnetcore/issues/45213
+ fileContext.Context.Response.Headers[HeaderNames.CacheControl] = "no-store";
+
if (applyCopHeaders)
{
// Browser multi-threaded runtime requires cross-origin policy headers to enable SharedArrayBuffer.
diff --git a/src/Http/WebUtilities/src/MultipartReaderStream.cs b/src/Http/WebUtilities/src/MultipartReaderStream.cs
index 208d1b38f0e0..9dd5ce6a76f8 100644
--- a/src/Http/WebUtilities/src/MultipartReaderStream.cs
+++ b/src/Http/WebUtilities/src/MultipartReaderStream.cs
@@ -174,7 +174,7 @@ public override int Read(byte[] buffer, int offset, int count)
if (index != 0)
{
// Sync, it's already buffered
- var slice = buffer.AsSpan(0, Math.Min(buffer.Length, index));
+ var slice = buffer.AsSpan(offset, Math.Min(count, index));
var readAmount = _innerStream.Read(slice);
return UpdatePosition(readAmount);
diff --git a/src/Http/WebUtilities/test/MultipartReaderTests.cs b/src/Http/WebUtilities/test/MultipartReaderTests.cs
index 8231ec472bc0..bc442b567dc0 100644
--- a/src/Http/WebUtilities/test/MultipartReaderTests.cs
+++ b/src/Http/WebUtilities/test/MultipartReaderTests.cs
@@ -389,4 +389,28 @@ public async Task MultipartReader_StripQuotesFromBoundary()
var section = await reader.ReadNextSectionAsync();
Assert.NotNull(section);
}
+
+ [Fact]
+ public async Task SyncReadWithOffsetWorks()
+ {
+ var stream = MakeStream(OnePartBody);
+ var reader = new MultipartReader(Boundary, stream);
+ var buffer = new byte[5];
+
+ var section = await reader.ReadNextSectionAsync();
+ Assert.NotNull(section);
+ Assert.Single(section.Headers);
+ Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]);
+
+ var read = section.Body.Read(buffer, 2, buffer.Length - 2);
+ Assert.Equal("\0\0tex", GetString(buffer, read + 2));
+
+ read = section.Body.Read(buffer, 1, buffer.Length - 1);
+ Assert.Equal("\0t de", GetString(buffer, read + 1));
+
+ read = section.Body.Read(buffer, 0, buffer.Length);
+ Assert.Equal("fault", GetString(buffer, read));
+
+ Assert.Null(await reader.ReadNextSectionAsync());
+ }
}
diff --git a/src/OpenApi/src/Comparers/OpenApiSchemaComparer.cs b/src/OpenApi/src/Comparers/OpenApiSchemaComparer.cs
index 0591035d2f47..2e69b10f213f 100644
--- a/src/OpenApi/src/Comparers/OpenApiSchemaComparer.cs
+++ b/src/OpenApi/src/Comparers/OpenApiSchemaComparer.cs
@@ -24,6 +24,15 @@ public bool Equals(OpenApiSchema? x, OpenApiSchema? y)
return true;
}
+ // If a local reference is present, we can't compare the schema directly
+ // and should instead use the schema ID as a type-check to assert if the schemas are
+ // equivalent.
+ if ((x.Reference != null && y.Reference == null)
+ || (x.Reference == null && y.Reference != null))
+ {
+ return SchemaIdEquals(x, y);
+ }
+
// Compare property equality in an order that should help us find inequality faster
return
x.Type == y.Type &&
diff --git a/src/OpenApi/src/Services/OpenApiDocumentService.cs b/src/OpenApi/src/Services/OpenApiDocumentService.cs
index a9a7ecf6a1a6..5d678e67c8c7 100644
--- a/src/OpenApi/src/Services/OpenApiDocumentService.cs
+++ b/src/OpenApi/src/Services/OpenApiDocumentService.cs
@@ -411,7 +411,7 @@ private async Task GetResponseAsync(
"Query" => ParameterLocation.Query,
"Header" => ParameterLocation.Header,
"Path" => ParameterLocation.Path,
- _ => throw new InvalidOperationException($"Unsupported parameter source: {parameter.Source.Id}")
+ _ => ParameterLocation.Query
},
Required = IsRequired(parameter),
Schema = await _componentService.GetOrCreateSchemaAsync(GetTargetType(description, parameter), scopedServiceProvider, schemaTransformers, parameter, cancellationToken: cancellationToken),
diff --git a/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs b/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs
index d7ea158b919a..537eb5d5db72 100644
--- a/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs
+++ b/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs
@@ -32,7 +32,7 @@ internal sealed class OpenApiSchemaService(
IOptionsMonitor optionsMonitor)
{
private readonly OpenApiSchemaStore _schemaStore = serviceProvider.GetRequiredKeyedService(documentName);
- private readonly OpenApiJsonSchemaContext _jsonSchemaContext = new OpenApiJsonSchemaContext(new(jsonOptions.Value.SerializerOptions));
+ private readonly OpenApiJsonSchemaContext _jsonSchemaContext = new(new(jsonOptions.Value.SerializerOptions));
private readonly JsonSerializerOptions _jsonSerializerOptions = new(jsonOptions.Value.SerializerOptions)
{
// In order to properly handle the `RequiredAttribute` on type properties, add a modifier to support
@@ -102,7 +102,7 @@ internal sealed class OpenApiSchemaService(
// "nested": "#/properties/nested" becomes "nested": "#/components/schemas/NestedType"
if (jsonPropertyInfo.PropertyType == jsonPropertyInfo.DeclaringType)
{
- return new JsonObject { [OpenApiSchemaKeywords.RefKeyword] = context.TypeInfo.GetSchemaReferenceId() };
+ return new JsonObject { [OpenApiSchemaKeywords.RefKeyword] = createSchemaReferenceId(context.TypeInfo) };
}
schema.ApplyNullabilityContextInfo(jsonPropertyInfo);
}
@@ -212,7 +212,13 @@ private async Task InnerApplySchemaTransformersAsync(OpenApiSchema schema,
}
}
}
- }
+
+ if (schema is { AdditionalPropertiesAllowed: true, AdditionalProperties: not null } && jsonTypeInfo.ElementType is not null)
+ {
+ var elementTypeInfo = _jsonSerializerOptions.GetTypeInfo(jsonTypeInfo.ElementType);
+ await InnerApplySchemaTransformersAsync(schema.AdditionalProperties, elementTypeInfo, null, context, transformer, cancellationToken);
+ }
+ }
private JsonNode CreateSchema(OpenApiSchemaKey key)
=> JsonSchemaExporter.GetJsonSchemaAsNode(_jsonSerializerOptions, key.Type, _configuration);
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs
index 10c65ae2787f..999283022706 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs
@@ -4,6 +4,7 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.OpenApi.Models;
public partial class OpenApiDocumentServiceTests : OpenApiDocumentServiceTestBase
@@ -190,4 +191,29 @@ await VerifyOpenApiDocument(builder, document =>
Assert.Null(document.Paths["/api/content-type-lower"].Operations[OperationType.Get].Parameters);
});
}
+
+ [Fact]
+ public async Task GetOpenApiParameters_ToleratesCustomBindingSource()
+ {
+ var action = CreateActionDescriptor(nameof(ActionWithCustomBinder));
+
+ await VerifyOpenApiDocument(action, document =>
+ {
+ var operation = document.Paths["/custom-binding"].Operations[OperationType.Get];
+ var parameter = Assert.Single(operation.Parameters);
+ Assert.Equal("model", parameter.Name);
+ Assert.Equal(ParameterLocation.Query, parameter.In);
+ });
+ }
+
+ [Route("/custom-binding")]
+ private void ActionWithCustomBinder([ModelBinder(BinderType = typeof(CustomBinder))] Todo model) { }
+
+ public class CustomBinder : IModelBinder
+ {
+ public Task BindModelAsync(ModelBindingContext bindingContext)
+ {
+ return Task.CompletedTask;
+ }
+ }
}
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/Implementations/OpenApiSchemaReferenceTransformerTests.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/Implementations/OpenApiSchemaReferenceTransformerTests.cs
index 4d16ff51d4e7..7209715e3516 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/Implementations/OpenApiSchemaReferenceTransformerTests.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/Implementations/OpenApiSchemaReferenceTransformerTests.cs
@@ -477,4 +477,126 @@ await VerifyOpenApiDocument(builder, options, document =>
Assert.Equal(ReferenceType.Link, responseSchema.Reference.Type);
});
}
+
+ [Fact]
+ public async Task SupportsNestedSchemasWithSelfReference()
+ {
+ // Arrange
+ var builder = CreateBuilder();
+
+ builder.MapPost("/", (LocationContainer item) => { });
+
+ await VerifyOpenApiDocument(builder, document =>
+ {
+ var operation = document.Paths["/"].Operations[OperationType.Post];
+ var requestSchema = operation.RequestBody.Content["application/json"].Schema;
+
+ // Assert $ref used for top-level
+ Assert.Equal("LocationContainer", requestSchema.Reference.Id);
+
+ // Assert that $ref is used for nested LocationDto
+ var locationContainerSchema = requestSchema.GetEffective(document);
+ Assert.Equal("LocationDto", locationContainerSchema.Properties["location"].Reference.Id);
+
+ // Assert that $ref is used for nested AddressDto
+ var locationSchema = locationContainerSchema.Properties["location"].GetEffective(document);
+ Assert.Equal("AddressDto", locationSchema.Properties["address"].Reference.Id);
+
+ // Assert that $ref is used for related LocationDto
+ var addressSchema = locationSchema.Properties["address"].GetEffective(document);
+ Assert.Equal("LocationDto", addressSchema.Properties["relatedLocation"].Reference.Id);
+ });
+ }
+
+ [Fact]
+ public async Task SupportsListNestedSchemasWithSelfReference()
+ {
+ // Arrange
+ var builder = CreateBuilder();
+
+ builder.MapPost("/", (ParentObject item) => { });
+
+ await VerifyOpenApiDocument(builder, document =>
+ {
+ var operation = document.Paths["/"].Operations[OperationType.Post];
+ var requestSchema = operation.RequestBody.Content["application/json"].Schema;
+
+ // Assert $ref used for top-level
+ Assert.Equal("ParentObject", requestSchema.Reference.Id);
+
+ // Assert that $ref is used for nested Children
+ var parentSchema = requestSchema.GetEffective(document);
+ Assert.Equal("ChildObject", parentSchema.Properties["children"].Items.Reference.Id);
+
+ // Assert that $ref is used for nested Parent
+ var childSchema = parentSchema.Properties["children"].Items.GetEffective(document);
+ Assert.Equal("ParentObject", childSchema.Properties["parent"].Reference.Id);
+ });
+ }
+
+ [Fact]
+ public async Task SupportsMultiplePropertiesWithSameType()
+ {
+ // Arrange
+ var builder = CreateBuilder();
+
+ builder.MapPost("/", (Root item) => { });
+
+ await VerifyOpenApiDocument(builder, document =>
+ {
+ var operation = document.Paths["/"].Operations[OperationType.Post];
+ var requestSchema = operation.RequestBody.Content["application/json"].Schema;
+
+ // Assert $ref used for top-level
+ Assert.Equal("Root", requestSchema.Reference.Id);
+
+ // Assert that $ref is used for nested Item1
+ var rootSchema = requestSchema.GetEffective(document);
+ Assert.Equal("Item", rootSchema.Properties["item1"].Reference.Id);
+
+ // Assert that $ref is used for nested Item2
+ Assert.Equal("Item", rootSchema.Properties["item2"].Reference.Id);
+ });
+ }
+
+ private class Root
+ {
+ public Item Item1 { get; set; } = null!;
+ public Item Item2 { get; set; } = null!;
+ }
+
+ private class Item
+ {
+ public string[] Name { get; set; } = null!;
+ public int value { get; set; }
+ }
+
+ private class LocationContainer
+ {
+ public LocationDto Location { get; set; }
+ }
+
+ private class LocationDto
+ {
+ public AddressDto Address { get; set; }
+ }
+
+ private class AddressDto
+ {
+ public LocationDto RelatedLocation { get; set; }
+ }
+
+#nullable enable
+ private class ParentObject
+ {
+ public int Id { get; set; }
+ public List Children { get; set; } = [];
+ }
+
+ private class ChildObject
+ {
+ public int Id { get; set; }
+ public required ParentObject Parent { get; set; }
+ }
}
+#nullable restore
diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/SchemaTransformerTests.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/SchemaTransformerTests.cs
index 5d20c810d6fa..565c3a2b48b1 100644
--- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/SchemaTransformerTests.cs
+++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/SchemaTransformerTests.cs
@@ -444,6 +444,7 @@ public async Task SchemaTransformer_CanModifyItemTypesInADocument()
builder.MapGet("/list", () => new List { 1, 2, 3, 4 });
builder.MapGet("/single", () => 1);
+ builder.MapGet("/dictionary", () => new Dictionary {{ "key", 1 }});
var options = new OpenApiOptions();
options.AddSchemaTransformer((schema, context, cancellationToken) =>
@@ -469,7 +470,13 @@ await VerifyOpenApiDocument(builder, options, document =>
getOperation = path.Operations[OperationType.Get];
responseSchema = getOperation.Responses["200"].Content["application/json"].Schema.GetEffective(document);
Assert.Equal("modified-number-format", responseSchema.Format);
- });
+
+ // Assert that the schema represent dictionary values has been modified
+ path = document.Paths["/dictionary"];
+ getOperation = path.Operations[OperationType.Get];
+ responseSchema = getOperation.Responses["200"].Content["application/json"].Schema.GetEffective(document);
+ Assert.Equal("modified-number-format", responseSchema.AdditionalProperties.Format);
+ });
}
[Fact]
diff --git a/src/Security/Authentication/JwtBearer/src/JwtBearerConfigureOptions.cs b/src/Security/Authentication/JwtBearer/src/JwtBearerConfigureOptions.cs
index 6ce4d6014bbb..1ec03cca626c 100644
--- a/src/Security/Authentication/JwtBearer/src/JwtBearerConfigureOptions.cs
+++ b/src/Security/Authentication/JwtBearer/src/JwtBearerConfigureOptions.cs
@@ -72,7 +72,7 @@ public void Configure(string? name, JwtBearerOptions options)
ValidAudiences = audiences,
ValidAudience = audience,
ValidateIssuerSigningKey = true,
- IssuerSigningKeys = GetIssuerSigningKeys(configSection, issuers),
+ IssuerSigningKeys = GetIssuerSigningKeys(configSection, [issuer, ..issuers]),
};
}
diff --git a/src/Security/Authentication/test/JwtBearerTests_Handler.cs b/src/Security/Authentication/test/JwtBearerTests_Handler.cs
index 1c24afe93cc0..dc5eb760a270 100644
--- a/src/Security/Authentication/test/JwtBearerTests_Handler.cs
+++ b/src/Security/Authentication/test/JwtBearerTests_Handler.cs
@@ -957,6 +957,7 @@ public async Task ExpirationAndIssuedWhenMinOrMaxValue()
public void CanReadJwtBearerOptionsFromConfig()
{
var services = new ServiceCollection();
+ var key = "qPG6tDtfxFYZifHW3sEueQ==";
var config = new ConfigurationBuilder().AddInMemoryCollection([
new("Authentication:Schemes:Bearer:ValidIssuer", "dotnet-user-jwts"),
new("Authentication:Schemes:Bearer:ValidIssuers:0", "dotnet-user-jwts-2"),
@@ -965,6 +966,9 @@ public void CanReadJwtBearerOptionsFromConfig()
new("Authentication:Schemes:Bearer:BackchannelTimeout", "00:01:00"),
new("Authentication:Schemes:Bearer:RequireHttpsMetadata", "false"),
new("Authentication:Schemes:Bearer:SaveToken", "True"),
+ new("Authentication:Schemes:Bearer:SigningKeys:0:Issuer", "dotnet-user-jwts"),
+ new("Authentication:Schemes:Bearer:SigningKeys:0:Value", key),
+ new("Authentication:Schemes:Bearer:SigningKeys:0:Length", "32"),
]).Build();
services.AddSingleton(config);
@@ -987,6 +991,10 @@ public void CanReadJwtBearerOptionsFromConfig()
Assert.True(jwtBearerOptions.MapInboundClaims);
Assert.True(jwtBearerOptions.TokenValidationParameters.ValidateIssuer);
Assert.True(jwtBearerOptions.TokenValidationParameters.ValidateAudience);
+
+ var securityKey = Assert.Single(jwtBearerOptions.TokenValidationParameters.IssuerSigningKeys);
+ var symmetricKey = Assert.IsType(securityKey);
+ Assert.Equal(key, Convert.ToBase64String(symmetricKey.Key));
}
[Fact]
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs b/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs
index b8714d601f9c..178007ec06ac 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs
@@ -3,7 +3,6 @@
using System.Buffers;
using System.Diagnostics;
-using System.Globalization;
using System.IO.Pipelines;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Connections.Features;
@@ -644,16 +643,24 @@ private void ValidateNonOriginHostHeader(string hostText)
// authority component, excluding any userinfo subcomponent and its "@"
// delimiter.
+ // Accessing authority always allocates, store it in a local to only allocate once
+ var authority = _absoluteRequestTarget!.Authority;
+
// System.Uri doesn't not tell us if the port was in the original string or not.
// When IsDefaultPort = true, we will allow Host: with or without the default port
- if (hostText != _absoluteRequestTarget!.Authority)
+ if (hostText != authority)
{
if (!_absoluteRequestTarget.IsDefaultPort
- || hostText != _absoluteRequestTarget.Authority + ":" + _absoluteRequestTarget.Port.ToString(CultureInfo.InvariantCulture))
+ || hostText != $"{authority}:{_absoluteRequestTarget.Port}")
{
if (_context.ServiceContext.ServerOptions.AllowHostHeaderOverride)
{
- hostText = _absoluteRequestTarget.Authority + ":" + _absoluteRequestTarget.Port.ToString(CultureInfo.InvariantCulture);
+ // No need to include the port here, it's either already in the Authority
+ // or it's the default port
+ // see: https://datatracker.ietf.org/doc/html/rfc2616/#section-14.23
+ // A "host" without any trailing port information implies the default
+ // port for the service requested (e.g., "80" for an HTTP URL).
+ hostText = authority;
HttpRequestHeaders.HeaderHost = hostText;
}
else
diff --git a/src/Servers/Kestrel/shared/test/HttpParsingData.cs b/src/Servers/Kestrel/shared/test/HttpParsingData.cs
index 6b240e18b5c8..a301e27e3877 100644
--- a/src/Servers/Kestrel/shared/test/HttpParsingData.cs
+++ b/src/Servers/Kestrel/shared/test/HttpParsingData.cs
@@ -497,8 +497,10 @@ public static TheoryData HostHeaderData
{ "GET /pub/WWW/", "www.example.org" },
{ "GET http://localhost/", "localhost" },
{ "GET http://localhost:80/", "localhost:80" },
+ { "GET http://localhost:80/", "localhost" },
{ "GET https://localhost/", "localhost" },
{ "GET https://localhost:443/", "localhost:443" },
+ { "GET https://localhost:443/", "localhost" },
{ "CONNECT asp.net:80", "asp.net:80" },
{ "CONNECT asp.net:443", "asp.net:443" },
{ "CONNECT user-images.githubusercontent.com:443", "user-images.githubusercontent.com:443" },
@@ -534,10 +536,13 @@ public static TheoryData HostHeaderInvalidData
data.Add("CONNECT contoso.com", host);
}
- // port mismatch when target contains port
+ // port mismatch when target contains default https port
data.Add("GET https://contoso.com:443/", "contoso.com:5000");
data.Add("CONNECT contoso.com:443", "contoso.com:5000");
+ // port mismatch when target contains default http port
+ data.Add("GET http://contoso.com:80/", "contoso.com:5000");
+
return data;
}
}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/BadHttpRequestTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/BadHttpRequestTests.cs
index d7076dacfd4c..af9d93aea3d6 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/BadHttpRequestTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/BadHttpRequestTests.cs
@@ -153,9 +153,12 @@ public Task BadRequestIfHostHeaderDoesNotMatchRequestTarget(string requestTarget
}
[Theory]
- [InlineData("Host: www.foo.comConnection: keep-alive")] // Corrupted - missing line-break
- [InlineData("Host: www.notfoo.com")] // Syntactically correct but not matching
- public async Task CanOptOutOfBadRequestIfHostHeaderDoesNotMatchRequestTarget(string hostHeader)
+ [InlineData("http://www.foo.com", "Host: www.foo.comConnection: keep-alive", "www.foo.com")] // Corrupted - missing line-break
+ [InlineData("http://www.foo.com/", "Host: www.notfoo.com", "www.foo.com")] // Syntactically correct but not matching
+ [InlineData("http://www.foo.com:80", "Host: www.notfoo.com", "www.foo.com")] // Explicit default port in request string
+ [InlineData("http://www.foo.com:5129", "Host: www.foo.com", "www.foo.com:5129")] // Non-default port in request string
+ [InlineData("http://www.foo.com:5129", "Host: www.foo.com:5128", "www.foo.com:5129")] // Different port in host header
+ public async Task CanOptOutOfBadRequestIfHostHeaderDoesNotMatchRequestTarget(string requestString, string hostHeader, string expectedHost)
{
var testMeterFactory = new TestMeterFactory();
using var connectionDuration = new MetricCollector(testMeterFactory, "Microsoft.AspNetCore.Server.Kestrel", "kestrel.connection.duration");
@@ -175,13 +178,13 @@ public async Task CanOptOutOfBadRequestIfHostHeaderDoesNotMatchRequestTarget(str
{
using (var client = server.CreateConnection())
{
- await client.SendAll($"GET http://www.foo.com/api/data HTTP/1.1\r\n{hostHeader}\r\n\r\n");
+ await client.SendAll($"GET {requestString} HTTP/1.1\r\n{hostHeader}\r\n\r\n");
await client.Receive("HTTP/1.1 200 OK");
}
}
- Assert.Equal("www.foo.com:80", receivedHost);
+ Assert.Equal(expectedHost, receivedHost);
Assert.Collection(connectionDuration.GetMeasurementSnapshot(), m => MetricsAssert.NoError(m.Tags));
}
diff --git a/src/StaticAssets/src/StaticAssetsInvoker.cs b/src/StaticAssets/src/StaticAssetsInvoker.cs
index 1d21cc2929ec..c7555c901b93 100644
--- a/src/StaticAssets/src/StaticAssetsInvoker.cs
+++ b/src/StaticAssets/src/StaticAssetsInvoker.cs
@@ -223,7 +223,7 @@ private async Task SendRangeAsync(StaticAssetInvocationContext requestContext, R
if (requestContext.Response.StatusCode == StatusCodes.Status200OK)
{
- requestContext.Response.StatusCode = StatusCodes.Status416RangeNotSatisfiable;
+ requestContext.Response.StatusCode = StatusCodes.Status206PartialContent;
}
await ApplyResponseHeadersAsync(requestContext, StatusCodes.Status206PartialContent);
diff --git a/src/StaticAssets/test/StaticAssetsIntegrationTests.cs b/src/StaticAssets/test/StaticAssetsIntegrationTests.cs
index 541a468a15a2..fda161ea055a 100644
--- a/src/StaticAssets/test/StaticAssetsIntegrationTests.cs
+++ b/src/StaticAssets/test/StaticAssetsIntegrationTests.cs
@@ -989,6 +989,33 @@ public async Task IfUnmodifiedSinceDateLessThanLastModifiedShouldReturn412(HttpM
Assert.Equal(HttpStatusCode.PreconditionFailed, res2.StatusCode);
}
+ // 14.35.2 Range Retrieval Requests
+ // The presence of a Range header in an unconditional GET modifies
+ // what is returned if the GET is otherwise successful. In other
+ // words, the response carries a status code of 206 (Partial
+ // Content) instead of 200 (OK).
+ [Fact]
+ public async Task RangeGivesMatchingRange()
+ {
+ var client = await CreateClient();
+
+ var req1 = new HttpRequestMessage(HttpMethod.Get, "http://localhost/sample.txt");
+ req1.Headers.Range = new RangeHeaderValue(0, 4);
+ var res1 = await client.SendAsync(req1);
+
+ var req2 = new HttpRequestMessage(HttpMethod.Get, "http://localhost/sample.txt");
+ req2.Headers.Range = new RangeHeaderValue(7, 11);
+ var res2 = await client.SendAsync(req2);
+
+ Assert.Equal(HttpStatusCode.PartialContent, res1.StatusCode);
+ Assert.Equal("Hello", await res1.Content.ReadAsStringAsync());
+ Assert.Equal(5, res1.Content.Headers.ContentLength);
+
+ Assert.Equal(HttpStatusCode.PartialContent, res2.StatusCode);
+ Assert.Equal("World", await res2.Content.ReadAsStringAsync());
+ Assert.Equal(5, res2.Content.Headers.ContentLength);
+ }
+
public static IEnumerable