Merge branch 'master' into johluo/migrate-logging-testing

This commit is contained in:
John Luo 2020-03-04 22:17:06 -08:00 committed by GitHub
commit f05e019271
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
164 changed files with 3814 additions and 1950 deletions

View File

@ -499,15 +499,15 @@ stages:
- powershell: "& ./src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/Servers/IIS/tools/update_schema.ps1"
displayName: Setup IISExpress test certificates and schema
afterBuild:
- powershell: "& ./build.ps1 -CI -NoBuild -Test /p:RunFlakyTests=true"
displayName: Run Flaky Tests
- powershell: "& ./build.ps1 -CI -NoBuild -Test /p:RunQuarantinedTests=true"
displayName: Run Quarantined Tests
continueOnError: true
- task: PublishTestResults@2
displayName: Publish Flaky Test Results
displayName: Publish Quarantined Test Results
inputs:
testResultsFormat: 'xUnit'
testResultsFiles: '*.xml'
searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)/Flaky'
searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)/Quarantined'
artifacts:
- name: Windows_Test_Dumps
path: artifacts/dumps/
@ -574,15 +574,15 @@ stages:
displayName: Pack Packages (for Template tests)
- bash: ./src/ProjectTemplates/build.sh --ci --pack --no-restore --no-build-deps "/bl:artifacts/log/template.pack.binlog"
displayName: Pack Templates (for Template tests)
- bash: ./build.sh --no-build --ci --test -p:RunFlakyTests=true
displayName: Run Flaky Tests
- bash: ./build.sh --no-build --ci --test -p:RunQuarantinedTests=true
displayName: Run Quarantined Tests
continueOnError: true
- task: PublishTestResults@2
displayName: Publish Flaky Test Results
displayName: Publish Quarantined Test Results
inputs:
testResultsFormat: 'xUnit'
testResultsFiles: '*.xml'
searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)/Flaky'
searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)/Quarantined'
artifacts:
- name: MacOS_Test_Logs
path: artifacts/log/
@ -611,15 +611,15 @@ stages:
displayName: Pack Packages (for Template tests)
- bash: ./src/ProjectTemplates/build.sh --ci --pack --no-restore --no-build-deps "/bl:artifacts/log/template.pack.binlog"
displayName: Pack Templates (for Template tests)
- bash: ./build.sh --no-build --ci --test -p:RunFlakyTests=true
displayName: Run Flaky Tests
- bash: ./build.sh --no-build --ci --test -p:RunQuarantinedTests=true
displayName: Run Quarantined Tests
continueOnError: true
- task: PublishTestResults@2
displayName: Publish Flaky Test Results
displayName: Publish Quarantined Test Results
inputs:
testResultsFormat: 'xUnit'
testResultsFiles: '*.xml'
searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)/Flaky'
searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)/Quarantined'
artifacts:
- name: Linux_Test_Logs
path: artifacts/log/

View File

@ -35,9 +35,9 @@
<DisableImplicitComponentsAnalyzers>true</DisableImplicitComponentsAnalyzers>
</PropertyGroup>
<Import Project="eng\FlakyTests.BeforeArcade.props" />
<Import Project="eng\QuarantinedTests.BeforeArcade.props" />
<Import Project="Sdk.props" Sdk="Microsoft.DotNet.Arcade.Sdk" />
<Import Project="eng\FlakyTests.AfterArcade.props" />
<Import Project="eng\QuarantinedTests.AfterArcade.props" />
<PropertyGroup>
<Product>Microsoft ASP.NET Core</Product>

View File

@ -139,6 +139,11 @@ source activate.sh
code .
```
Note that if you are using the "Remote-WSL" extension in VSCode, the environment is not supplied
to the process in WSL. You can workaround this by explicitly setting the environment variables
in `~/.vscode-server/server-env-setup`.
See https://code.visualstudio.com/docs/remote/wsl#_advanced-environment-setup-script for details.
## Building on command-line
You can also build the entire project on command line with the `build.cmd`/`.sh` scripts.

View File

@ -1,7 +0,0 @@
<Project>
<!-- Override where xUnit logs and results go if we're doing the flaky run -->
<PropertyGroup Condition="'$(RunFlakyTests)' == 'true'">
<ArtifactsLogDir>$(ArtifactsDir)log\$(Configuration)\Flaky\</ArtifactsLogDir>
<ArtifactsTestResultsDir>$(ArtifactsDir)TestResults\$(Configuration)\Flaky\</ArtifactsTestResultsDir>
</PropertyGroup>
</Project>

View File

@ -1,18 +0,0 @@
<Project>
<!-- Local Dev Flakiness -->
<PropertyGroup>
<_FlakyRunAdditionalArgs>-trait "Flaky:All=true"</_FlakyRunAdditionalArgs>
<_NonFlakyRunAdditionalArgs>-notrait "Flaky:All=true"</_NonFlakyRunAdditionalArgs>
</PropertyGroup>
<!-- Azure Pipelines Flakiness -->
<PropertyGroup Condition="'$(TF_BUILD)' != ''">
<_FlakyRunAdditionalArgs>$(_FlakyRunAdditionalArgs) -trait "Flaky:AzP:All=true" -trait "Flaky:AzP:OS:$(AGENT_OS)=true"</_FlakyRunAdditionalArgs>
<_NonFlakyRunAdditionalArgs>$(_NonFlakyRunAdditionalArgs) -notrait "Flaky:AzP:All=true" -notrait "Flaky:AzP:OS:$(AGENT_OS)=true"</_NonFlakyRunAdditionalArgs>
</PropertyGroup>
<PropertyGroup>
<TestRunnerAdditionalArguments Condition="'$(RunFlakyTests)' == ''">$(_NonFlakyRunAdditionalArgs) $(TestRunnerAdditionalArguments)</TestRunnerAdditionalArguments>
<TestRunnerAdditionalArguments Condition="'$(RunFlakyTests)' == 'true'">$(_FlakyRunAdditionalArgs) $(TestRunnerAdditionalArguments)</TestRunnerAdditionalArguments>
</PropertyGroup>
</Project>

View File

@ -49,10 +49,12 @@
<!-- Do not push .nupkg files from Linux and macOS builds. They'll be packed up separately and signed on Windows. -->
<ItemsToPushToBlobFeed Remove="@(ItemsToPushToBlobFeed)" Condition="'$(OS)' != 'Windows_NT'" />
<!-- Skip publishing checksums for now - the checksums for the .zip files don't match (https://github.com/dotnet/aspnetcore/issues/18792)
<ItemsToPushToBlobFeed Include="@(_ChecksumsToPublish)">
<PublishFlatContainer>true</PublishFlatContainer>
<RelativeBlobPath>$(_UploadPathRoot)/Runtime/$(_PackageVersion)/%(Filename)%(Extension)</RelativeBlobPath>
</ItemsToPushToBlobFeed>
-->
<ItemsToPushToBlobFeed Include="@(_InstallersToPublish)">
<IsShipping>true</IsShipping>

View File

@ -0,0 +1,7 @@
<Project>
<!-- Override where xUnit logs and results go if we're doing the Quarantined run -->
<PropertyGroup Condition="'$(RunQuarantinedTests)' == 'true'">
<ArtifactsLogDir>$(ArtifactsDir)log\$(Configuration)\Quarantined\</ArtifactsLogDir>
<ArtifactsTestResultsDir>$(ArtifactsDir)TestResults\$(Configuration)\Quarantined\</ArtifactsTestResultsDir>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,11 @@
<Project>
<PropertyGroup>
<_QuarantinedTestRunAdditionalArgs>-trait "Quarantined=true"</_QuarantinedTestRunAdditionalArgs>
<_NonQuarantinedTestRunAdditionalArgs>-notrait "Quarantined=true"</_NonQuarantinedTestRunAdditionalArgs>
</PropertyGroup>
<PropertyGroup>
<TestRunnerAdditionalArguments Condition="'$(RunQuarantinedTests)' == ''">$(_NonQuarantinedTestRunAdditionalArgs) $(TestRunnerAdditionalArguments)</TestRunnerAdditionalArguments>
<TestRunnerAdditionalArguments Condition="'$(RunQuarantinedTests)' == 'true'">$(_QuarantinedTestRunAdditionalArgs) $(TestRunnerAdditionalArguments)</TestRunnerAdditionalArguments>
</PropertyGroup>
</Project>

View File

@ -13,348 +13,344 @@
<Uri>https://github.com/dotnet/blazor</Uri>
<Sha>dd7fb4d3931d556458f62642c2edfc59f6295bfb</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="5.0.0-preview.2.20126.1">
<Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="5.0.0-preview.2.20154.1">
<Uri>https://github.com/dotnet/aspnetcore-tooling</Uri>
<Sha>151c6a416f147c687c61dcb9b8cf3f6bd0c1a79f</Sha>
<Sha>33a9f3ca20e57e7fb69fd90b9aa9b2278f377a54</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="5.0.0-preview.2.20126.1">
<Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="5.0.0-preview.2.20154.1">
<Uri>https://github.com/dotnet/aspnetcore-tooling</Uri>
<Sha>151c6a416f147c687c61dcb9b8cf3f6bd0c1a79f</Sha>
<Sha>33a9f3ca20e57e7fb69fd90b9aa9b2278f377a54</Sha>
</Dependency>
<Dependency Name="Microsoft.CodeAnalysis.Razor" Version="5.0.0-preview.2.20126.1">
<Dependency Name="Microsoft.CodeAnalysis.Razor" Version="5.0.0-preview.2.20154.1">
<Uri>https://github.com/dotnet/aspnetcore-tooling</Uri>
<Sha>151c6a416f147c687c61dcb9b8cf3f6bd0c1a79f</Sha>
<Sha>33a9f3ca20e57e7fb69fd90b9aa9b2278f377a54</Sha>
</Dependency>
<Dependency Name="Microsoft.NET.Sdk.Razor" Version="5.0.0-preview.2.20126.1">
<Dependency Name="Microsoft.NET.Sdk.Razor" Version="5.0.0-preview.2.20154.1">
<Uri>https://github.com/dotnet/aspnetcore-tooling</Uri>
<Sha>151c6a416f147c687c61dcb9b8cf3f6bd0c1a79f</Sha>
<Sha>33a9f3ca20e57e7fb69fd90b9aa9b2278f377a54</Sha>
</Dependency>
<Dependency Name="dotnet-ef" Version="5.0.0-preview.2.20126.1">
<Dependency Name="dotnet-ef" Version="5.0.0-preview.2.20154.4">
<Uri>https://github.com/dotnet/efcore</Uri>
<Sha>ca43ad17d612518231cc6b8a359e7168de1f76f1</Sha>
<Sha>39633487003879903958dc09be5bb4ec6d6034df</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="5.0.0-preview.2.20126.1">
<Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="5.0.0-preview.2.20154.4">
<Uri>https://github.com/dotnet/efcore</Uri>
<Sha>ca43ad17d612518231cc6b8a359e7168de1f76f1</Sha>
<Sha>39633487003879903958dc09be5bb4ec6d6034df</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="5.0.0-preview.2.20126.1">
<Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="5.0.0-preview.2.20154.4">
<Uri>https://github.com/dotnet/efcore</Uri>
<Sha>ca43ad17d612518231cc6b8a359e7168de1f76f1</Sha>
<Sha>39633487003879903958dc09be5bb4ec6d6034df</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="5.0.0-preview.2.20126.1">
<Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="5.0.0-preview.2.20154.4">
<Uri>https://github.com/dotnet/efcore</Uri>
<Sha>ca43ad17d612518231cc6b8a359e7168de1f76f1</Sha>
<Sha>39633487003879903958dc09be5bb4ec6d6034df</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0-preview.2.20126.1">
<Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0-preview.2.20154.4">
<Uri>https://github.com/dotnet/efcore</Uri>
<Sha>ca43ad17d612518231cc6b8a359e7168de1f76f1</Sha>
<Sha>39633487003879903958dc09be5bb4ec6d6034df</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="5.0.0-preview.2.20126.1">
<Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="5.0.0-preview.2.20154.4">
<Uri>https://github.com/dotnet/efcore</Uri>
<Sha>ca43ad17d612518231cc6b8a359e7168de1f76f1</Sha>
<Sha>39633487003879903958dc09be5bb4ec6d6034df</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore" Version="5.0.0-preview.2.20126.1">
<Dependency Name="Microsoft.EntityFrameworkCore" Version="5.0.0-preview.2.20154.4">
<Uri>https://github.com/dotnet/efcore</Uri>
<Sha>ca43ad17d612518231cc6b8a359e7168de1f76f1</Sha>
<Sha>39633487003879903958dc09be5bb4ec6d6034df</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.Memory" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Caching.Memory" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Json" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Configuration.Json" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Configuration" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DependencyInjection" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.DependencyInjection" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Hosting" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Hosting" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Http" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Http" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Console" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Logging.Console" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Debug" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Logging.Debug" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Testing" Version="5.0.0-dev" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Logging.Testing" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Logging" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Options" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Options" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Primitives" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Extensions.Primitives" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Internal.Extensions.Refs" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Microsoft.Internal.Extensions.Refs" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.Win32.Registry" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="Microsoft.Win32.Registry" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="Microsoft.Win32.SystemEvents" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="Microsoft.Win32.SystemEvents" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.ComponentModel.Annotations" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.ComponentModel.Annotations" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Diagnostics.EventLog" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Diagnostics.EventLog" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Drawing.Common" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Drawing.Common" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.IO.Pipelines" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.IO.Pipelines" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Net.Http.WinHttpHandler" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Net.Http.WinHttpHandler" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Reflection.Metadata" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Reflection.Metadata" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Security.Cryptography.Cng" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Security.Cryptography.Cng" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Security.Cryptography.Pkcs" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Security.Cryptography.Pkcs" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Security.Cryptography.Xml" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Security.Cryptography.Xml" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Security.Permissions" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Security.Permissions" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Security.Principal.Windows" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Security.Principal.Windows" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.ServiceProcess.ServiceController" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.ServiceProcess.ServiceController" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Text.Encodings.Web" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Text.Encodings.Web" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Text.Json" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Text.Json" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Threading.Channels" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Threading.Channels" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="System.Windows.Extensions" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="System.Windows.Extensions" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DependencyModel" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.Extensions.Logging">
<Dependency Name="Microsoft.Extensions.DependencyModel" Version="5.0.0-preview.2-runtime.20154.1" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="Microsoft.NETCore.App.Ref" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.Extensions.Logging">
<Dependency Name="Microsoft.NETCore.App.Ref" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<!--
Win-x64 is used here because we have picked an arbitrary runtime identifier to flow the version of the latest NETCore.App runtime.
All Runtime.$rid packages should have the same version.
-->
<Dependency Name="Microsoft.NETCore.App.Runtime.win-x64" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.Extensions.Logging">
<Dependency Name="Microsoft.NETCore.App.Runtime.win-x64" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="Microsoft.NETCore.App.Internal" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.Extensions.Logging">
<Dependency Name="Microsoft.NETCore.App.Internal" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="NETStandard.Library.Ref" Version="2.1.0-preview.2.20125.16" CoherentParentDependency="Microsoft.Extensions.Logging">
<Dependency Name="NETStandard.Library.Ref" Version="2.1.0-preview.2.20154.1" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
</ProductDependencies>
<ToolsetDependencies>
<!-- Listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
<Dependency Name="Microsoft.NETCore.Platforms" Version="5.0.0-preview.2.20125.16" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Dependency Name="Microsoft.NETCore.Platforms" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/runtime</Uri>
<Sha>4807684b13d473c19121fbe757296e7607f3cabf</Sha>
<Sha>9bcf3b12f4e7ad2667ca00afc804877d78b81a46</Sha>
</Dependency>
<Dependency Name="Internal.AspNetCore.Analyzers" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Dependency Name="Internal.AspNetCore.Analyzers" Version="5.0.0-preview.2.20154.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
<Sha>a1c36119ce1b3ff9a7a69f7b088b9601962e58e2</Sha>
</Dependency>
<Dependency Name="Microsoft.DotNet.GenAPI" Version="5.0.0-beta.20123.1">
<Dependency Name="Microsoft.DotNet.GenAPI" Version="5.0.0-beta.20151.1">
<Uri>https://github.com/dotnet/arcade</Uri>
<Sha>85d76351b1f0245c9f331f72219d12e8e2d48e72</Sha>
<Sha>8ccad075bbb0db445e03eed0a6073d27bdd4f31a</Sha>
</Dependency>
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="5.0.0-beta.20123.1">
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="5.0.0-beta.20151.1">
<Uri>https://github.com/dotnet/arcade</Uri>
<Sha>85d76351b1f0245c9f331f72219d12e8e2d48e72</Sha>
<Sha>8ccad075bbb0db445e03eed0a6073d27bdd4f31a</Sha>
</Dependency>
<Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="5.0.0-beta.20123.1">
<Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="5.0.0-beta.20151.1">
<Uri>https://github.com/dotnet/arcade</Uri>
<Sha>85d76351b1f0245c9f331f72219d12e8e2d48e72</Sha>
<Sha>8ccad075bbb0db445e03eed0a6073d27bdd4f31a</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Testing" Version="5.0.0-preview.2.20126.1" CoherentParentDependency="Microsoft.AspNetCore.Razor.Language">
<Uri>https://github.com/dotnet/extensions</Uri>
<Sha>8fb38ab52b8f873109b6e87b4f04226d6a892ee4</Sha>
</Dependency>
<Dependency Name="Microsoft.Net.Compilers.Toolset" Version="3.5.0-beta4-20125-04" CoherentParentDependency="Microsoft.Extensions.Logging">
<Dependency Name="Microsoft.Net.Compilers.Toolset" Version="3.5.0-beta4-20153-05" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/roslyn</Uri>
<Sha>1baa0b3063238ed752ad1f0368b1df6b6901373e</Sha>
<Sha>20b9af913f1b8ce0a62f72bea9e75e4aa3cf6b0e</Sha>
</Dependency>
</ToolsetDependencies>
</Dependencies>

View File

@ -62,97 +62,96 @@
-->
<PropertyGroup Label="Automated">
<!-- Packages from dotnet/arcade -->
<MicrosoftDotNetGenAPIPackageVersion>5.0.0-beta.20123.1</MicrosoftDotNetGenAPIPackageVersion>
<MicrosoftDotNetGenAPIPackageVersion>5.0.0-beta.20151.1</MicrosoftDotNetGenAPIPackageVersion>
<!-- Packages from dotnet/roslyn -->
<MicrosoftNetCompilersToolsetPackageVersion>3.5.0-beta4-20125-04</MicrosoftNetCompilersToolsetPackageVersion>
<MicrosoftNetCompilersToolsetPackageVersion>3.5.0-beta4-20153-05</MicrosoftNetCompilersToolsetPackageVersion>
<!-- Packages from dotnet/core-setup -->
<MicrosoftExtensionsDependencyModelPackageVersion>5.0.0-preview.2.20125.16</MicrosoftExtensionsDependencyModelPackageVersion>
<MicrosoftNETCoreAppInternalPackageVersion>5.0.0-preview.2.20125.16</MicrosoftNETCoreAppInternalPackageVersion>
<MicrosoftNETCoreAppRefPackageVersion>5.0.0-preview.2.20125.16</MicrosoftNETCoreAppRefPackageVersion>
<MicrosoftNETCoreAppRuntimewinx64PackageVersion>5.0.0-preview.2.20125.16</MicrosoftNETCoreAppRuntimewinx64PackageVersion>
<NETStandardLibraryRefPackageVersion>2.1.0-preview.2.20125.16</NETStandardLibraryRefPackageVersion>
<MicrosoftExtensionsDependencyModelPackageVersion>5.0.0-preview.2-runtime.20154.1</MicrosoftExtensionsDependencyModelPackageVersion>
<MicrosoftNETCoreAppInternalPackageVersion>5.0.0-preview.2.20154.1</MicrosoftNETCoreAppInternalPackageVersion>
<MicrosoftNETCoreAppRefPackageVersion>5.0.0-preview.2.20154.1</MicrosoftNETCoreAppRefPackageVersion>
<MicrosoftNETCoreAppRuntimewinx64PackageVersion>5.0.0-preview.2.20154.1</MicrosoftNETCoreAppRuntimewinx64PackageVersion>
<NETStandardLibraryRefPackageVersion>2.1.0-preview.2.20154.1</NETStandardLibraryRefPackageVersion>
<!-- Packages from dotnet/corefx -->
<MicrosoftWin32RegistryPackageVersion>5.0.0-preview.2.20125.16</MicrosoftWin32RegistryPackageVersion>
<MicrosoftWin32SystemEventsPackageVersion>5.0.0-preview.2.20125.16</MicrosoftWin32SystemEventsPackageVersion>
<SystemComponentModelAnnotationsPackageVersion>5.0.0-preview.2.20125.16</SystemComponentModelAnnotationsPackageVersion>
<SystemDiagnosticsEventLogPackageVersion>5.0.0-preview.2.20125.16</SystemDiagnosticsEventLogPackageVersion>
<SystemDrawingCommonPackageVersion>5.0.0-preview.2.20125.16</SystemDrawingCommonPackageVersion>
<SystemIOPipelinesPackageVersion>5.0.0-preview.2.20125.16</SystemIOPipelinesPackageVersion>
<SystemNetHttpWinHttpHandlerPackageVersion>5.0.0-preview.2.20125.16</SystemNetHttpWinHttpHandlerPackageVersion>
<SystemNetWebSocketsWebSocketProtocolPackageVersion>5.0.0-preview.2.20125.16</SystemNetWebSocketsWebSocketProtocolPackageVersion>
<SystemReflectionMetadataPackageVersion>5.0.0-preview.2.20125.16</SystemReflectionMetadataPackageVersion>
<SystemRuntimeCompilerServicesUnsafePackageVersion>5.0.0-preview.2.20125.16</SystemRuntimeCompilerServicesUnsafePackageVersion>
<SystemSecurityCryptographyCngPackageVersion>5.0.0-preview.2.20125.16</SystemSecurityCryptographyCngPackageVersion>
<SystemSecurityCryptographyPkcsPackageVersion>5.0.0-preview.2.20125.16</SystemSecurityCryptographyPkcsPackageVersion>
<SystemSecurityCryptographyXmlPackageVersion>5.0.0-preview.2.20125.16</SystemSecurityCryptographyXmlPackageVersion>
<SystemSecurityPermissionsPackageVersion>5.0.0-preview.2.20125.16</SystemSecurityPermissionsPackageVersion>
<SystemSecurityPrincipalWindowsPackageVersion>5.0.0-preview.2.20125.16</SystemSecurityPrincipalWindowsPackageVersion>
<SystemServiceProcessServiceControllerPackageVersion>5.0.0-preview.2.20125.16</SystemServiceProcessServiceControllerPackageVersion>
<SystemTextEncodingsWebPackageVersion>5.0.0-preview.2.20125.16</SystemTextEncodingsWebPackageVersion>
<SystemTextJsonPackageVersion>5.0.0-preview.2.20125.16</SystemTextJsonPackageVersion>
<SystemThreadingChannelsPackageVersion>5.0.0-preview.2.20125.16</SystemThreadingChannelsPackageVersion>
<SystemWindowsExtensionsPackageVersion>5.0.0-preview.2.20125.16</SystemWindowsExtensionsPackageVersion>
<MicrosoftWin32RegistryPackageVersion>5.0.0-preview.2.20154.1</MicrosoftWin32RegistryPackageVersion>
<MicrosoftWin32SystemEventsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftWin32SystemEventsPackageVersion>
<SystemComponentModelAnnotationsPackageVersion>5.0.0-preview.2.20154.1</SystemComponentModelAnnotationsPackageVersion>
<SystemDiagnosticsEventLogPackageVersion>5.0.0-preview.2.20154.1</SystemDiagnosticsEventLogPackageVersion>
<SystemDrawingCommonPackageVersion>5.0.0-preview.2.20154.1</SystemDrawingCommonPackageVersion>
<SystemIOPipelinesPackageVersion>5.0.0-preview.2.20154.1</SystemIOPipelinesPackageVersion>
<SystemNetHttpWinHttpHandlerPackageVersion>5.0.0-preview.2.20154.1</SystemNetHttpWinHttpHandlerPackageVersion>
<SystemNetWebSocketsWebSocketProtocolPackageVersion>5.0.0-preview.2.20154.1</SystemNetWebSocketsWebSocketProtocolPackageVersion>
<SystemReflectionMetadataPackageVersion>5.0.0-preview.2.20154.1</SystemReflectionMetadataPackageVersion>
<SystemRuntimeCompilerServicesUnsafePackageVersion>5.0.0-preview.2.20154.1</SystemRuntimeCompilerServicesUnsafePackageVersion>
<SystemSecurityCryptographyCngPackageVersion>5.0.0-preview.2.20154.1</SystemSecurityCryptographyCngPackageVersion>
<SystemSecurityCryptographyPkcsPackageVersion>5.0.0-preview.2.20154.1</SystemSecurityCryptographyPkcsPackageVersion>
<SystemSecurityCryptographyXmlPackageVersion>5.0.0-preview.2.20154.1</SystemSecurityCryptographyXmlPackageVersion>
<SystemSecurityPermissionsPackageVersion>5.0.0-preview.2.20154.1</SystemSecurityPermissionsPackageVersion>
<SystemSecurityPrincipalWindowsPackageVersion>5.0.0-preview.2.20154.1</SystemSecurityPrincipalWindowsPackageVersion>
<SystemServiceProcessServiceControllerPackageVersion>5.0.0-preview.2.20154.1</SystemServiceProcessServiceControllerPackageVersion>
<SystemTextEncodingsWebPackageVersion>5.0.0-preview.2.20154.1</SystemTextEncodingsWebPackageVersion>
<SystemTextJsonPackageVersion>5.0.0-preview.2.20154.1</SystemTextJsonPackageVersion>
<SystemThreadingChannelsPackageVersion>5.0.0-preview.2.20154.1</SystemThreadingChannelsPackageVersion>
<SystemWindowsExtensionsPackageVersion>5.0.0-preview.2.20154.1</SystemWindowsExtensionsPackageVersion>
<!-- Only listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
<MicrosoftNETCorePlatformsPackageVersion>5.0.0-preview.2.20125.16</MicrosoftNETCorePlatformsPackageVersion>
<MicrosoftNETCorePlatformsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftNETCorePlatformsPackageVersion>
<!-- Packages from dotnet/blazor -->
<MicrosoftAspNetCoreBlazorMonoPackageVersion>3.2.0-preview1.20067.1</MicrosoftAspNetCoreBlazorMonoPackageVersion>
<!-- Packages from dotnet/extensions -->
<InternalAspNetCoreAnalyzersPackageVersion>5.0.0-preview.2.20126.1</InternalAspNetCoreAnalyzersPackageVersion>
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>5.0.0-preview.2.20126.1</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
<MicrosoftAspNetCoreTestingPackageVersion>5.0.0-preview.2.20126.1</MicrosoftAspNetCoreTestingPackageVersion>
<MicrosoftExtensionsCachingAbstractionsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsCachingAbstractionsPackageVersion>
<MicrosoftExtensionsCachingMemoryPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsCachingMemoryPackageVersion>
<MicrosoftExtensionsCachingSqlServerPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsCachingSqlServerPackageVersion>
<MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>
<MicrosoftExtensionsConfigurationAbstractionsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
<MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>
<MicrosoftExtensionsConfigurationBinderPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsConfigurationBinderPackageVersion>
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
<MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>
<MicrosoftExtensionsConfigurationIniPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsConfigurationIniPackageVersion>
<MicrosoftExtensionsConfigurationJsonPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsConfigurationJsonPackageVersion>
<MicrosoftExtensionsConfigurationPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsConfigurationPackageVersion>
<MicrosoftExtensionsConfigurationUserSecretsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsConfigurationUserSecretsPackageVersion>
<MicrosoftExtensionsConfigurationXmlPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsConfigurationXmlPackageVersion>
<MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>
<MicrosoftExtensionsDependencyInjectionPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsDependencyInjectionPackageVersion>
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
<MicrosoftExtensionsFileProvidersCompositePackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsFileProvidersCompositePackageVersion>
<MicrosoftExtensionsFileProvidersPhysicalPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsFileProvidersPhysicalPackageVersion>
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
<MicrosoftExtensionsHostingAbstractionsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsHostingAbstractionsPackageVersion>
<MicrosoftExtensionsHostingPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsHostingPackageVersion>
<MicrosoftExtensionsHttpPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsHttpPackageVersion>
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
<MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>
<MicrosoftExtensionsLoggingConfigurationPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsLoggingConfigurationPackageVersion>
<MicrosoftExtensionsLoggingConsolePackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsLoggingConsolePackageVersion>
<MicrosoftExtensionsLoggingDebugPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsLoggingDebugPackageVersion>
<MicrosoftExtensionsLoggingEventSourcePackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsLoggingEventSourcePackageVersion>
<MicrosoftExtensionsLoggingEventLogPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsLoggingEventLogPackageVersion>
<MicrosoftExtensionsLoggingPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsLoggingPackageVersion>
<MicrosoftExtensionsLoggingTestingPackageVersion>5.0.0-dev</MicrosoftExtensionsLoggingTestingPackageVersion>
<MicrosoftExtensionsLoggingTraceSourcePackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsLoggingTraceSourcePackageVersion>
<MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>
<MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>
<MicrosoftExtensionsOptionsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsOptionsPackageVersion>
<MicrosoftExtensionsPrimitivesPackageVersion>5.0.0-preview.2.20126.1</MicrosoftExtensionsPrimitivesPackageVersion>
<MicrosoftInternalExtensionsRefsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftInternalExtensionsRefsPackageVersion>
<InternalAspNetCoreAnalyzersPackageVersion>5.0.0-preview.2.20154.1</InternalAspNetCoreAnalyzersPackageVersion>
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>5.0.0-preview.2.20154.1</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
<MicrosoftExtensionsCachingAbstractionsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsCachingAbstractionsPackageVersion>
<MicrosoftExtensionsCachingMemoryPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsCachingMemoryPackageVersion>
<MicrosoftExtensionsCachingSqlServerPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsCachingSqlServerPackageVersion>
<MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>
<MicrosoftExtensionsConfigurationAbstractionsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
<MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>
<MicrosoftExtensionsConfigurationBinderPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsConfigurationBinderPackageVersion>
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
<MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>
<MicrosoftExtensionsConfigurationIniPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsConfigurationIniPackageVersion>
<MicrosoftExtensionsConfigurationJsonPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsConfigurationJsonPackageVersion>
<MicrosoftExtensionsConfigurationPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsConfigurationPackageVersion>
<MicrosoftExtensionsConfigurationUserSecretsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsConfigurationUserSecretsPackageVersion>
<MicrosoftExtensionsConfigurationXmlPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsConfigurationXmlPackageVersion>
<MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>
<MicrosoftExtensionsDependencyInjectionPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsDependencyInjectionPackageVersion>
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
<MicrosoftExtensionsFileProvidersCompositePackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsFileProvidersCompositePackageVersion>
<MicrosoftExtensionsFileProvidersPhysicalPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsFileProvidersPhysicalPackageVersion>
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
<MicrosoftExtensionsHostingAbstractionsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsHostingAbstractionsPackageVersion>
<MicrosoftExtensionsHostingPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsHostingPackageVersion>
<MicrosoftExtensionsHttpPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsHttpPackageVersion>
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
<MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>
<MicrosoftExtensionsLoggingConfigurationPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsLoggingConfigurationPackageVersion>
<MicrosoftExtensionsLoggingConsolePackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsLoggingConsolePackageVersion>
<MicrosoftExtensionsLoggingDebugPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsLoggingDebugPackageVersion>
<MicrosoftExtensionsLoggingEventSourcePackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsLoggingEventSourcePackageVersion>
<MicrosoftExtensionsLoggingEventLogPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsLoggingEventLogPackageVersion>
<MicrosoftExtensionsLoggingPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsLoggingPackageVersion>
<MicrosoftExtensionsLoggingTestingPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsLoggingTestingPackageVersion>
<MicrosoftExtensionsLoggingTraceSourcePackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsLoggingTraceSourcePackageVersion>
<MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>
<MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>
<MicrosoftExtensionsOptionsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsOptionsPackageVersion>
<MicrosoftExtensionsPrimitivesPackageVersion>5.0.0-preview.2.20154.1</MicrosoftExtensionsPrimitivesPackageVersion>
<MicrosoftInternalExtensionsRefsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftInternalExtensionsRefsPackageVersion>
<!-- Packages from dotnet/efcore -->
<dotnetefPackageVersion>5.0.0-preview.2.20126.1</dotnetefPackageVersion>
<MicrosoftEntityFrameworkCoreInMemoryPackageVersion>5.0.0-preview.2.20126.1</MicrosoftEntityFrameworkCoreInMemoryPackageVersion>
<MicrosoftEntityFrameworkCoreRelationalPackageVersion>5.0.0-preview.2.20126.1</MicrosoftEntityFrameworkCoreRelationalPackageVersion>
<MicrosoftEntityFrameworkCoreSqlitePackageVersion>5.0.0-preview.2.20126.1</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
<MicrosoftEntityFrameworkCoreSqlServerPackageVersion>5.0.0-preview.2.20126.1</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
<MicrosoftEntityFrameworkCoreToolsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftEntityFrameworkCoreToolsPackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>5.0.0-preview.2.20126.1</MicrosoftEntityFrameworkCorePackageVersion>
<dotnetefPackageVersion>5.0.0-preview.2.20154.4</dotnetefPackageVersion>
<MicrosoftEntityFrameworkCoreInMemoryPackageVersion>5.0.0-preview.2.20154.4</MicrosoftEntityFrameworkCoreInMemoryPackageVersion>
<MicrosoftEntityFrameworkCoreRelationalPackageVersion>5.0.0-preview.2.20154.4</MicrosoftEntityFrameworkCoreRelationalPackageVersion>
<MicrosoftEntityFrameworkCoreSqlitePackageVersion>5.0.0-preview.2.20154.4</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
<MicrosoftEntityFrameworkCoreSqlServerPackageVersion>5.0.0-preview.2.20154.4</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
<MicrosoftEntityFrameworkCoreToolsPackageVersion>5.0.0-preview.2.20154.4</MicrosoftEntityFrameworkCoreToolsPackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>5.0.0-preview.2.20154.4</MicrosoftEntityFrameworkCorePackageVersion>
<!-- Packages from dotnet/aspnetcore-tooling -->
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>5.0.0-preview.2.20126.1</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
<MicrosoftAspNetCoreRazorLanguagePackageVersion>5.0.0-preview.2.20126.1</MicrosoftAspNetCoreRazorLanguagePackageVersion>
<MicrosoftCodeAnalysisRazorPackageVersion>5.0.0-preview.2.20126.1</MicrosoftCodeAnalysisRazorPackageVersion>
<MicrosoftNETSdkRazorPackageVersion>5.0.0-preview.2.20126.1</MicrosoftNETSdkRazorPackageVersion>
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>5.0.0-preview.2.20154.1</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
<MicrosoftAspNetCoreRazorLanguagePackageVersion>5.0.0-preview.2.20154.1</MicrosoftAspNetCoreRazorLanguagePackageVersion>
<MicrosoftCodeAnalysisRazorPackageVersion>5.0.0-preview.2.20154.1</MicrosoftCodeAnalysisRazorPackageVersion>
<MicrosoftNETSdkRazorPackageVersion>5.0.0-preview.2.20154.1</MicrosoftNETSdkRazorPackageVersion>
</PropertyGroup>
<!--
@ -220,7 +219,7 @@
<MicrosoftAspNetCoreAzureAppServicesSiteExtension31PackageVersion>3.1.3</MicrosoftAspNetCoreAzureAppServicesSiteExtension31PackageVersion>
<!-- 3rd party dependencies -->
<AngleSharpPackageVersion>0.9.9</AngleSharpPackageVersion>
<BenchmarkDotNetPackageVersion>0.10.13</BenchmarkDotNetPackageVersion>
<BenchmarkDotNetPackageVersion>0.12.0</BenchmarkDotNetPackageVersion>
<CastleCorePackageVersion>4.2.1</CastleCorePackageVersion>
<FSharpCorePackageVersion>4.2.1</FSharpCorePackageVersion>
<GoogleProtobufPackageVersion>3.8.0</GoogleProtobufPackageVersion>

View File

@ -63,7 +63,7 @@ case $cpuname in
amd64|x86_64)
buildarch=x64
;;
armv7l)
armv*l)
buildarch=arm
;;
i686)

View File

@ -34,6 +34,14 @@ while (($# > 0)); do
force=true
shift 1
;;
--donotabortonfailure)
donotabortonfailure=true
shift 1
;;
--donotdisplaywarnings)
donotdisplaywarnings=true
shift 1
;;
--downloadretries)
download_retries=$2
shift 2
@ -52,6 +60,8 @@ while (($# > 0)); do
echo " - (default) %USERPROFILE%/.netcoreeng/native"
echo ""
echo " --clean Switch specifying not to install anything, but cleanup native asset folders"
echo " --donotabortonfailure Switch specifiying whether to abort native tools installation on failure"
echo " --donotdisplaywarnings Switch specifiying whether to display warnings during native tools installation on failure"
echo " --force Clean and then install tools"
echo " --help Print help and exit"
echo ""
@ -92,6 +102,7 @@ if [[ -z $install_directory ]]; then
fi
install_bin="${native_base_dir}/bin"
installed_any=false
ReadGlobalJsonNativeTools
@ -103,8 +114,8 @@ else
for tool in "${!native_assets[@]}"
do
tool_version=${native_assets[$tool]}
installer_name="install-$tool.sh"
installer_command="$native_installer_dir/$installer_name"
installer_path="$native_installer_dir/install-$tool.sh"
installer_command="$installer_path"
installer_command+=" --baseuri $base_uri"
installer_command+=" --installpath $install_bin"
installer_command+=" --version $tool_version"
@ -118,11 +129,29 @@ else
installer_command+=" --clean"
fi
$installer_command
if [[ $? != 0 ]]; then
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed"
exit 1
if [[ -a $installer_path ]]; then
$installer_command
if [[ $? != 0 ]]; then
if [[ $donotabortonfailure = true ]]; then
if [[ $donotdisplaywarnings != true ]]; then
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed"
fi
else
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed"
exit 1
fi
else
$installed_any = true
fi
else
if [[ $donotabortonfailure == true ]]; then
if [[ $donotdisplaywarnings != true ]]; then
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed: no install script"
fi
else
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Execution Failed: no install script"
exit 1
fi
fi
done
fi
@ -135,8 +164,10 @@ if [[ -d $install_bin ]]; then
echo "Native tools are available from $install_bin"
echo "##vso[task.prependpath]$install_bin"
else
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Native tools install directory does not exist, installation failed"
exit 1
if [[ $installed_any = true ]]; then
Write-PipelineTelemetryError -category 'NativeToolsBootstrap' "Native tools install directory does not exist, installation failed"
exit 1
fi
fi
exit 0

View File

@ -6,7 +6,7 @@
<Python>py -3</Python>
<CoreRun>%HELIX_CORRELATION_PAYLOAD%\Core_Root\CoreRun.exe</CoreRun>
<BaselineCoreRun>%HELIX_CORRELATION_PAYLOAD%\Baseline_Core_Root\CoreRun.exe</BaselineCoreRun>
<HelixPreCommands>$(HelixPreCommands);call %HELIX_CORRELATION_PAYLOAD%\performance\tools\machine-setup.cmd</HelixPreCommands>
<HelixPreCommands>$(HelixPreCommands);call %HELIX_CORRELATION_PAYLOAD%\performance\tools\machine-setup.cmd;set PYTHONPATH=%HELIX_WORKITEM_PAYLOAD%\scripts%3B%HELIX_WORKITEM_PAYLOAD%</HelixPreCommands>
<ArtifactsDirectory>%HELIX_CORRELATION_PAYLOAD%\artifacts\BenchmarkDotNet.Artifacts</ArtifactsDirectory>
<BaselineArtifactsDirectory>%HELIX_CORRELATION_PAYLOAD%\artifacts\BenchmarkDotNet.Artifacts_Baseline</BaselineArtifactsDirectory>
<ResultsComparer>%HELIX_CORRELATION_PAYLOAD%\performance\src\tools\ResultsComparer\ResultsComparer.csproj</ResultsComparer>
@ -99,4 +99,23 @@
<Timeout>4:00</Timeout>
</HelixWorkItem>
</ItemGroup>
<ItemGroup Condition="'$(AGENT_OS)' == 'Windows_NT'">
<HelixWorkItem Include="Crossgen System.Private.Xml.dll">
<PayloadDirectory>$(WorkItemDirectory)\ScenarioCorrelation</PayloadDirectory>
<Command>$(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen\test.py crossgen --test-name System.Private.Xml.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root</Command>
</HelixWorkItem>
<HelixWorkItem Include="Crossgen System.Linq.Expressions.dll">
<PayloadDirectory>$(WorkItemDirectory)\ScenarioCorrelation</PayloadDirectory>
<Command>$(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen\test.py crossgen --test-name System.Linq.Expressions.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root</Command>
</HelixWorkItem>
<HelixWorkItem Include="Crossgen Microsoft.CodeAnalysis.VisualBasic.dll">
<PayloadDirectory>$(WorkItemDirectory)\ScenarioCorrelation</PayloadDirectory>
<Command>$(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen\test.py crossgen --test-name Microsoft.CodeAnalysis.VisualBasic.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root</Command>
</HelixWorkItem>
<HelixWorkItem Include="Crossgen Microsoft.CodeAnalysis.CSharp.dll">
<PayloadDirectory>$(WorkItemDirectory)\ScenarioCorrelation</PayloadDirectory>
<Command>$(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen\test.py crossgen --test-name Microsoft.CodeAnalysis.CSharp.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root</Command>
</HelixWorkItem>
</ItemGroup>
</Project>

View File

@ -84,6 +84,7 @@ stages:
- job: publish_assets
displayName: Publish Assets
dependsOn: setupMaestroVars
timeoutInMinutes: 120
variables:
- name: BARBuildId
value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ]

View File

@ -83,6 +83,7 @@ stages:
- job: publish_assets
displayName: Publish Assets
dependsOn: setupMaestroVars
timeoutInMinutes: 120
variables:
- name: BARBuildId
value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ]

View File

@ -53,23 +53,21 @@ if %$quarantined%==True (
set %$quarantined=true
)
set NONQUARANTINE_FILTER="Flaky:All!=true&Flaky:Helix:All!=true&Flaky:Helix:Queue:All!=true&Flaky:Helix:Queue:%HELIX%!=true"
set QUARANTINE_FILTER="Flaky:All=true|Flaky:Helix:All=true|Flaky:Helix:Queue:All=true|Flaky:Helix:Queue:%HELIX%=true"
set NONQUARANTINE_FILTER="Quarantined!=true"
set QUARANTINE_FILTER="Quarantined=true"
if %$quarantined%==true (
echo Running quarantined tests.
%DOTNET_ROOT%\dotnet vstest %$target% --logger:xunit --TestCaseFilter:%QUARANTINE_FILTER%
if errorlevel 1 (
echo Failure in flaky test 1>&2
echo Failure in quarantined test 1>&2
REM DO NOT EXIT and DO NOT SET EXIT_CODE to 1
)
) else (
REM We need to specify all possible Flaky filters that apply to this environment, because the flaky attribute
REM only puts the explicit filter traits the user provided in
REM Filter syntax: https://github.com/Microsoft/vstest-docs/blob/master/docs/filter.md
echo Running non-quarantined tests.
%DOTNET_ROOT%\dotnet vstest %$target% --logger:xunit --TestCaseFilter:%NONQUARANTINE_FILTER%
if errorlevel 1 (
echo Failure in non-flaky test 1>&2
echo Failure in non-quarantined test 1>&2
set exit_code=1
REM DO NOT EXIT
)

View File

@ -115,11 +115,9 @@ fi
exit_code=0
# We need to specify all possible quarantined filters that apply to this environment, because the quarantine attribute
# only puts the explicit filter traits the user provided in the flaky attribute
# Filter syntax: https://github.com/Microsoft/vstest-docs/blob/master/docs/filter.md
NONQUARANTINE_FILTER="Flaky:All!=true&Flaky:Helix:All!=true&Flaky:Helix:Queue:All!=true&Flaky:Helix:Queue:$helix_queue_name!=true"
QUARANTINE_FILTER="Flaky:All=true|Flaky:Helix:All=true|Flaky:Helix:Queue:All=true|Flaky:Helix:Queue:$helix_queue_name=true"
NONQUARANTINE_FILTER="Quarantined!=true"
QUARANTINE_FILTER="Quarantined=true"
if [ "$quarantined" == true ]; then
echo "Running all tests including quarantined."
$DOTNET_ROOT/dotnet vstest $test_binary_path --logger:xunit --TestCaseFilter:"$QUARANTINE_FILTER"

View File

@ -25,7 +25,7 @@
},
"msbuild-sdks": {
"Yarn.MSBuild": "1.15.2",
"Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20123.1",
"Microsoft.DotNet.Helix.Sdk": "5.0.0-beta.20123.1"
"Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20151.1",
"Microsoft.DotNet.Helix.Sdk": "5.0.0-beta.20151.1"
}
}

View File

@ -12,6 +12,7 @@ namespace Microsoft.AspNetCore.Components
public static string FormatValue(System.DateTimeOffset value, string format, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(decimal value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(double value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(short value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(int value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(long value, System.Globalization.CultureInfo culture = null) { throw null; }
public static bool? FormatValue(bool? value, System.Globalization.CultureInfo culture = null) { throw null; }
@ -21,6 +22,7 @@ namespace Microsoft.AspNetCore.Components
public static string FormatValue(System.DateTime? value, string format, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(decimal? value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(double? value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(short? value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(int? value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(long? value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(float? value, System.Globalization.CultureInfo culture = null) { throw null; }
@ -47,6 +49,8 @@ namespace Microsoft.AspNetCore.Components
public static bool TryConvertToNullableFloat(object obj, System.Globalization.CultureInfo culture, out float? value) { throw null; }
public static bool TryConvertToNullableInt(object obj, System.Globalization.CultureInfo culture, out int? value) { throw null; }
public static bool TryConvertToNullableLong(object obj, System.Globalization.CultureInfo culture, out long? value) { throw null; }
public static bool TryConvertToNullableShort(object obj, System.Globalization.CultureInfo culture, out short? value) { throw null; }
public static bool TryConvertToShort(object obj, System.Globalization.CultureInfo culture, out short value) { throw null; }
public static bool TryConvertToString(object obj, System.Globalization.CultureInfo culture, out string value) { throw null; }
public static bool TryConvertTo<T>(object obj, System.Globalization.CultureInfo culture, out T value) { throw null; }
}
@ -165,6 +169,7 @@ namespace Microsoft.AspNetCore.Components
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime> setter, System.DateTime existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<decimal> setter, decimal existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<double> setter, double existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<short> setter, short existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<int> setter, int existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<long> setter, long existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<bool?> setter, bool? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
@ -174,6 +179,7 @@ namespace Microsoft.AspNetCore.Components
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime?> setter, System.DateTime? existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<decimal?> setter, decimal? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<double?> setter, double? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<short?> setter, short? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<int?> setter, int? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<long?> setter, long? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<float?> setter, float? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }

View File

@ -12,6 +12,7 @@ namespace Microsoft.AspNetCore.Components
public static string FormatValue(System.DateTimeOffset value, string format, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(decimal value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(double value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(short value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(int value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(long value, System.Globalization.CultureInfo culture = null) { throw null; }
public static bool? FormatValue(bool? value, System.Globalization.CultureInfo culture = null) { throw null; }
@ -21,6 +22,7 @@ namespace Microsoft.AspNetCore.Components
public static string FormatValue(System.DateTime? value, string format, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(decimal? value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(double? value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(short? value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(int? value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(long? value, System.Globalization.CultureInfo culture = null) { throw null; }
public static string FormatValue(float? value, System.Globalization.CultureInfo culture = null) { throw null; }
@ -47,6 +49,8 @@ namespace Microsoft.AspNetCore.Components
public static bool TryConvertToNullableFloat(object obj, System.Globalization.CultureInfo culture, out float? value) { throw null; }
public static bool TryConvertToNullableInt(object obj, System.Globalization.CultureInfo culture, out int? value) { throw null; }
public static bool TryConvertToNullableLong(object obj, System.Globalization.CultureInfo culture, out long? value) { throw null; }
public static bool TryConvertToNullableShort(object obj, System.Globalization.CultureInfo culture, out short? value) { throw null; }
public static bool TryConvertToShort(object obj, System.Globalization.CultureInfo culture, out short value) { throw null; }
public static bool TryConvertToString(object obj, System.Globalization.CultureInfo culture, out string value) { throw null; }
public static bool TryConvertTo<T>(object obj, System.Globalization.CultureInfo culture, out T value) { throw null; }
}
@ -165,6 +169,7 @@ namespace Microsoft.AspNetCore.Components
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime> setter, System.DateTime existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<decimal> setter, decimal existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<double> setter, double existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<short> setter, short existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<int> setter, int existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<long> setter, long existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<bool?> setter, bool? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
@ -174,6 +179,7 @@ namespace Microsoft.AspNetCore.Components
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime?> setter, System.DateTime? existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<decimal?> setter, decimal? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<double?> setter, double? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<short?> setter, short? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<int?> setter, int? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<long?> setter, long? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<float?> setter, float? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }

View File

@ -15,7 +15,7 @@ namespace Microsoft.AspNetCore.Components
//
// Perf: our conversion routines present a regular API surface that allows us to specialize on types to avoid boxing.
// for instance, many of these types could be cast to IFormattable to do the appropriate formatting, but that's going
// to allocate.
// to allocate.
public static class BindConverter
{
private static object BoxedTrue = true;
@ -158,6 +158,41 @@ namespace Microsoft.AspNetCore.Components
return value.Value.ToString(culture ?? CultureInfo.CurrentCulture);
}
/// <summary>
/// Formats the provided <paramref name="value"/> for inclusion in an attribute.
/// </summary>
/// <param name="value">The value to format.</param>
/// <param name="culture">
/// The <see cref="CultureInfo"/> to use while formatting. Defaults to <see cref="CultureInfo.CurrentCulture"/>.
/// </param>
/// <returns>The formatted value.</returns>
public static string FormatValue(short value, CultureInfo culture = null) => FormatShortValueCore(value, culture);
private static string FormatShortValueCore(short value, CultureInfo culture)
{
return value.ToString(culture ?? CultureInfo.CurrentCulture);
}
/// <summary>
/// Formats the provided <paramref name="value"/> for inclusion in an attribute.
/// </summary>
/// <param name="value">The value to format.</param>
/// <param name="culture">
/// The <see cref="CultureInfo"/> to use while formatting. Defaults to <see cref="CultureInfo.CurrentCulture"/>.
/// </param>
/// <returns>The formatted value.</returns>
public static string FormatValue(short? value, CultureInfo culture = null) => FormatNullableShortValueCore(value, culture);
private static string FormatNullableShortValueCore(short? value, CultureInfo culture)
{
if (value == null)
{
return null;
}
return value.Value.ToString(culture ?? CultureInfo.CurrentCulture);
}
/// <summary>
/// Formats the provided <paramref name="value"/> for inclusion in an attribute.
/// </summary>
@ -649,6 +684,71 @@ namespace Microsoft.AspNetCore.Components
return true;
}
/// <summary>
/// Attempts to convert a value to a <see cref="System.Int16"/>.
/// </summary>
/// <param name="obj">The object to convert.</param>
/// <param name="culture">The <see cref="CultureInfo"/> to use for conversion.</param>
/// <param name="value">The converted value.</param>
/// <returns><c>true</c> if conversion is successful, otherwise <c>false</c>.</returns>
public static bool TryConvertToShort(object obj, CultureInfo culture, out short value)
{
return ConvertToShortCore(obj, culture, out value);
}
/// <summary>
/// Attempts to convert a value to a nullable <see cref="System.Int16"/>.
/// </summary>
/// <param name="obj">The object to convert.</param>
/// <param name="culture">The <see cref="CultureInfo"/> to use for conversion.</param>
/// <param name="value">The converted value.</param>
/// <returns><c>true</c> if conversion is successful, otherwise <c>false</c>.</returns>
public static bool TryConvertToNullableShort(object obj, CultureInfo culture, out short? value)
{
return ConvertToNullableShort(obj, culture, out value);
}
internal static BindParser<short> ConvertToShort = ConvertToShortCore;
internal static BindParser<short?> ConvertToNullableShort = ConvertToNullableShortCore;
private static bool ConvertToShortCore(object obj, CultureInfo culture, out short value)
{
var text = (string)obj;
if (string.IsNullOrEmpty(text))
{
value = default;
return false;
}
if (!short.TryParse(text, NumberStyles.Number, culture ?? CultureInfo.CurrentCulture, out var converted))
{
value = default;
return false;
}
value = converted;
return true;
}
private static bool ConvertToNullableShortCore(object obj, CultureInfo culture, out short? value)
{
var text = (string)obj;
if (string.IsNullOrEmpty(text))
{
value = default;
return true;
}
if (!short.TryParse(text, NumberStyles.Number, culture ?? CultureInfo.CurrentCulture, out var converted))
{
value = default;
return false;
}
value = converted;
return true;
}
/// <summary>
/// Attempts to convert a value to a <see cref="System.Single"/>.
/// </summary>
@ -1198,6 +1298,14 @@ namespace Microsoft.AspNetCore.Components
{
formatter = (BindFormatter<long?>)FormatNullableLongValueCore;
}
else if (typeof(T) == typeof(short))
{
formatter = (BindFormatter<short>)FormatShortValueCore;
}
else if (typeof(T) == typeof(short?))
{
formatter = (BindFormatter<short?>)FormatNullableShortValueCore;
}
else if (typeof(T) == typeof(float))
{
formatter = (BindFormatter<float>)FormatFloatValueCore;
@ -1323,6 +1431,14 @@ namespace Microsoft.AspNetCore.Components
{
parser = ConvertToNullableLong;
}
else if (typeof(T) == typeof(short))
{
parser = ConvertToShort;
}
else if (typeof(T) == typeof(short?))
{
parser = ConvertToNullableShort;
}
else if (typeof(T) == typeof(float))
{
parser = ConvertToFloat;

View File

@ -136,6 +136,25 @@ namespace Microsoft.AspNetCore.Components
return CreateBinderCore<long>(factory, receiver, setter, culture, ConvertToLong);
}
/// <summary>
/// For internal use only.
/// </summary>
/// <param name="factory"></param>
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
/// <param name="culture"></param>
/// <returns></returns>
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
Action<short> setter,
short existingValue,
CultureInfo culture = null)
{
return CreateBinderCore<short>(factory, receiver, setter, culture, ConvertToShort);
}
/// <summary>
/// For internal use only.
/// </summary>
@ -155,6 +174,25 @@ namespace Microsoft.AspNetCore.Components
return CreateBinderCore<long?>(factory, receiver, setter, culture, ConvertToNullableLong);
}
/// <summary>
/// For internal use only.
/// </summary>
/// <param name="factory"></param>
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
/// <param name="culture"></param>
/// <returns></returns>
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
Action<short?> setter,
short? existingValue,
CultureInfo culture = null)
{
return CreateBinderCore<short?>(factory, receiver, setter, culture, ConvertToNullableShort);
}
/// <summary>
/// For internal use only.
/// </summary>

View File

@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Components.Forms
{
/// <summary>
/// An input component for editing numeric values.
/// Supported numeric types are <see cref="int"/>, <see cref="long"/>, <see cref="float"/>, <see cref="double"/>, <see cref="decimal"/>.
/// Supported numeric types are <see cref="int"/>, <see cref="long"/>, <see cref="short"/>, <see cref="float"/>, <see cref="double"/>, <see cref="decimal"/>.
/// </summary>
public class InputNumber<TValue> : InputBase<TValue>
{
@ -22,6 +22,7 @@ namespace Microsoft.AspNetCore.Components.Forms
var targetType = Nullable.GetUnderlyingType(typeof(TValue)) ?? typeof(TValue);
if (targetType == typeof(int) ||
targetType == typeof(long) ||
targetType == typeof(short) ||
targetType == typeof(float) ||
targetType == typeof(double) ||
targetType == typeof(decimal))
@ -86,6 +87,9 @@ namespace Microsoft.AspNetCore.Components.Forms
case long @long:
return BindConverter.FormatValue(@long, CultureInfo.InvariantCulture);
case short @short:
return BindConverter.FormatValue(@short, CultureInfo.InvariantCulture);
case float @float:
return BindConverter.FormatValue(@float, CultureInfo.InvariantCulture);

View File

@ -2,14 +2,9 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Ignitor;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
using Microsoft.AspNetCore.Components.RenderTree;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Logging;
@ -27,6 +22,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.ServerExecutionTests
}
[Fact]
[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/19414")]
public async Task CannotStartMultipleCircuits()
{
// Arrange

View File

@ -186,6 +186,18 @@ namespace Microsoft.AspNetCore.Components.E2ETest.ServerExecutionTests
Browser.Equal(90000000000.ToString(cultureInfo), () => display.Text);
Browser.Equal(90000000000.ToString(CultureInfo.InvariantCulture), () => input.GetAttribute("value"));
// short
input = Browser.FindElement(By.Id("inputnumber_short"));
display = Browser.FindElement(By.Id("inputnumber_short_value"));
Browser.Equal(42.ToString(cultureInfo), () => display.Text);
Browser.Equal(42.ToString(CultureInfo.InvariantCulture), () => input.GetAttribute("value"));
input.Clear();
input.SendKeys(127.ToString(CultureInfo.InvariantCulture));
input.SendKeys("\t");
Browser.Equal(127.ToString(cultureInfo), () => display.Text);
Browser.Equal(127.ToString(CultureInfo.InvariantCulture), () => input.GetAttribute("value"));
// decimal
input = Browser.FindElement(By.Id("inputnumber_decimal"));
display = Browser.FindElement(By.Id("inputnumber_decimal_value"));

View File

@ -11,6 +11,7 @@ using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
using Microsoft.AspNetCore.Components.RenderTree;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Logging;
using TestServer;
using Xunit;
@ -213,6 +214,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.ServerExecutionTests
}
[Fact]
[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/19410")]
public async Task ContinuesWorkingAfterInvalidAsyncReturnCallback()
{
// Arrange

View File

@ -6,8 +6,8 @@ using BasicTestApp;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
using Microsoft.AspNetCore.Components.E2ETest.Tests;
using Microsoft.AspNetCore.E2ETesting;
using Microsoft.AspNetCore.Testing;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
using Xunit;
using Xunit.Abstractions;
@ -35,5 +35,10 @@ namespace Microsoft.AspNetCore.Components.E2ETest.ServerExecutionTests
$"{typeof(InvalidOperationException).FullName}: The current thread is not associated with the Dispatcher. Use InvokeAsync() to switch execution to the Dispatcher when triggering rendering or component state.",
() => result.Text);
}
[Fact]
[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/19413")]
public override void CanDispatchAsyncWorkToSyncContext()
=> base.CanDispatchAsyncWorkToSyncContext();
}
}

View File

@ -355,6 +355,65 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests
Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
}
[Fact]
public void CanBindTextboxShort()
{
var target = Browser.FindElement(By.Id("textbox-short"));
var boundValue = Browser.FindElement(By.Id("textbox-short-value"));
var mirrorValue = Browser.FindElement(By.Id("textbox-short-mirror"));
Assert.Equal("-42", target.GetAttribute("value"));
Assert.Equal("-42", boundValue.Text);
Assert.Equal("-42", mirrorValue.GetAttribute("value"));
// Clear target; value resets to zero
target.Clear();
Browser.Equal("0", () => target.GetAttribute("value"));
Assert.Equal("0", boundValue.Text);
Assert.Equal("0", mirrorValue.GetAttribute("value"));
// Modify target; verify value is updated and that textboxes linked to the same data are updated
// Leading zeros are not preserved
target.SendKeys("42");
Browser.Equal("042", () => target.GetAttribute("value"));
target.SendKeys("\t");
Browser.Equal("42", () => target.GetAttribute("value"));
Assert.Equal("42", boundValue.Text);
Assert.Equal("42", mirrorValue.GetAttribute("value"));
}
[Fact]
public void CanBindTextboxNullableShort()
{
var target = Browser.FindElement(By.Id("textbox-nullable-short"));
var boundValue = Browser.FindElement(By.Id("textbox-nullable-short-value"));
var mirrorValue = Browser.FindElement(By.Id("textbox-nullable-short-mirror"));
Assert.Equal(string.Empty, target.GetAttribute("value"));
Assert.Equal(string.Empty, boundValue.Text);
Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
// Modify target; verify value is updated and that textboxes linked to the same data are updated
target.Clear();
Browser.Equal("", () => boundValue.Text);
Assert.Equal("", mirrorValue.GetAttribute("value"));
// Modify target; verify value is updated and that textboxes linked to the same data are updated
target.SendKeys("-42\t");
Browser.Equal("-42", () => boundValue.Text);
Assert.Equal("-42", mirrorValue.GetAttribute("value"));
// Modify target; verify value is updated and that textboxes linked to the same data are updated
target.Clear();
target.SendKeys("42\t");
Browser.Equal("42", () => boundValue.Text);
Assert.Equal("42", mirrorValue.GetAttribute("value"));
// Modify target; verify value is updated and that textboxes linked to the same data are updated
target.Clear();
target.SendKeys("\t");
Browser.Equal(string.Empty, () => boundValue.Text);
Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
}
[Fact]
public void CanBindTextboxFloat()
{

View File

@ -12,6 +12,7 @@ using BasicTestApp.HierarchicalImportsTest.Subdir;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
using Microsoft.AspNetCore.E2ETesting;
using Microsoft.AspNetCore.Testing;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
using Xunit;
@ -579,7 +580,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests
}
[Fact]
public void CanDispatchAsyncWorkToSyncContext()
public virtual void CanDispatchAsyncWorkToSyncContext()
{
var appElement = Browser.MountTestComponent<DispatchingComponent>();
var result = appElement.FindElement(By.Id("result"));

View File

@ -167,7 +167,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests
}
[Fact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/1987", FlakyOn.AzP.Windows)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/1987")]
public void InputEvent_RespondsOnKeystrokes()
{
Browser.MountTestComponent<InputEventComponent>();

View File

@ -50,6 +50,18 @@
<span id="textbox-nullable-long-value">@textboxNullableLongValue</span>
<input id="textbox-nullable-long-mirror" @bind="textboxNullableLongValue" readonly />
</p>
<p>
short:
<input id="textbox-short" @bind="textboxShortValue" type="number" />
<span id="textbox-short-value">@textboxShortValue</span>
<input id="textbox-short-mirror" @bind="textboxShortValue" readonly />
</p>
<p>
Nullable short:
<input id="textbox-nullable-short" @bind="textboxNullableShortValue" type="number" />
<span id="textbox-nullable-short-value">@textboxNullableShortValue</span>
<input id="textbox-nullable-short-mirror" @bind="textboxNullableShortValue" readonly />
</p>
<p>
float:
<input id="textbox-float" @bind-value="textboxFloatValue" type="number" />
@ -328,6 +340,8 @@
int? textboxNullableIntValue = null;
long textboxLongValue = 3_000_000_000;
long? textboxNullableLongValue = null;
short textboxShortValue = -42;
short? textboxNullableShortValue = null;
float textboxFloatValue = 3.141f;
float? textboxNullableFloatValue = null;
double textboxDoubleValue = 3.14159265359d;

View File

@ -66,6 +66,10 @@
long: <InputNumber id="inputnumber_long" @bind-Value="inputNumberLong" />
<span id="inputnumber_long_value">@inputNumberLong</span>
</div>
<div>
short: <InputNumber id="inputnumber_short" @bind-Value="inputNumberShort" />
<span id="inputnumber_short_value">@inputNumberShort</span>
</div>
<div>
decimal: <InputNumber id="inputnumber_decimal" @bind-Value="inputNumberDecimal" />
<span id="inputnumber_decimal_value">@inputNumberDecimal</span>
@ -104,6 +108,7 @@
int inputNumberInt = 42;
long inputNumberLong = 4200;
short inputNumberShort = 42;
decimal inputNumberDecimal = 4.2m;
DateTime inputDateDateTime = new DateTime(1985, 3, 4);

View File

@ -53,8 +53,6 @@ This package is an internal implementation of the .NET Core SDK and is not meant
<!-- Platform manifest and package override metatdata -->
<ReferencePackSharedFxVersion>$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion).0</ReferencePackSharedFxVersion>
<ReferencePackSharedFxVersion Condition="'$(VersionSuffix)' != ''">$(ReferencePackSharedFxVersion)-$(VersionSuffix)</ReferencePackSharedFxVersion>
<ReferencePlatformManifestPath Condition="'$(IsServicingBuild)' != 'true'">$(PlatformManifestOutputPath)</ReferencePlatformManifestPath>
<ReferencePlatformManifestPath Condition="'$(IsServicingBuild)' == 'true'">$(RepoRoot)eng\PlatformManifest.txt</ReferencePlatformManifestPath>
</PropertyGroup>
<ItemGroup>
@ -157,7 +155,7 @@ This package is an internal implementation of the .NET Core SDK and is not meant
<RefPackContent Include="@(AspNetCoreReferenceAssemblyPath)" PackagePath="$(RefAssemblyPackagePath)" />
<RefPackContent Include="@(AspNetCoreReferenceDocXml)" PackagePath="$(RefAssemblyPackagePath)" />
<RefPackContent Include="$(TargetDir)$(PackageConflictManifestFileName)" PackagePath="$(ManifestsPackagePath)" />
<RefPackContent Include="$(ReferencePlatformManifestPath)" PackagePath="$(ManifestsPackagePath)" />
<RefPackContent Include="$(PlatformManifestOutputPath)" PackagePath="$(ManifestsPackagePath)" />
</ItemGroup>
</Target>

View File

@ -106,7 +106,6 @@ namespace Microsoft.AspNetCore.Hosting
[Theory]
[MemberData(nameof(RequestStartData))]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2230", FlakyOn.All)]
public void RequestStart(DefaultHttpContext httpContext, string[] expected)
{
// Arrange

View File

@ -238,7 +238,6 @@ namespace Microsoft.AspNetCore.Hosting
}
[ConditionalFact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2244", FlakyOn.Helix.All)]
public async Task WebHostStopAsyncUsesDefaultTimeoutIfNoTokenProvided()
{
var data = new Dictionary<string, string>

View File

@ -200,6 +200,7 @@ namespace Microsoft.Net.Http.Headers
public static readonly string WebSocketSubProtocols;
public static readonly string WWWAuthenticate;
public static readonly string XFrameOptions;
public static readonly string XRequestedWith;
}
public static partial class HeaderQuality
{

View File

@ -88,5 +88,6 @@ namespace Microsoft.Net.Http.Headers
public static readonly string WebSocketSubProtocols = "Sec-WebSocket-Protocol";
public static readonly string WWWAuthenticate = "WWW-Authenticate";
public static readonly string XFrameOptions = "X-Frame-Options";
public static readonly string XRequestedWith = "X-Requested-With";
}
}

View File

@ -47,6 +47,9 @@ namespace Microsoft.AspNetCore.Identity
/// <value>
/// The display name for the provider.
/// </value>
/// <remarks>
/// Examples of the display name may be local, FACEBOOK, Google, etc.
/// </remarks>
public string ProviderDisplayName { get; set; }
}
}

View File

@ -79,7 +79,7 @@ namespace Microsoft.AspNetCore.Identity.Test
[Theory]
[MemberData(nameof(ScriptWithFallbackSrcData))]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2267", FlakyOn.AzP.macOS)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2267")]
public async Task IdentityUI_ScriptTags_FallbackSourceContent_Matches_CDNContent(ScriptTag scriptTag)
{
var wwwrootDir = Path.Combine(GetProjectBasePath(), "wwwroot", scriptTag.Version);

View File

@ -18,6 +18,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity.Test;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Net.Http.Headers;
using Xunit;
namespace Microsoft.AspNetCore.Identity.InMemory
@ -425,7 +426,7 @@ namespace Microsoft.AspNetCore.Identity.InMemory
}
if (ajaxRequest)
{
request.Headers.Add("X-Requested-With", "XMLHttpRequest");
request.Headers.Add(HeaderNames.XRequestedWith, "XMLHttpRequest");
}
var transaction = new Transaction
{

View File

@ -550,7 +550,6 @@ namespace Microsoft.AspNetCore.WebSockets.Test
}
[Fact]
[Flaky("https://github.com/dotnet/aspnetcore/issues/8187", FlakyOn.Helix.All)]
public async Task OriginIsNotValidatedForNonWebSocketRequests()
{
using (var server = KestrelWebSocketHelpers.CreateServer(LoggerFactory, out var port, context =>

View File

@ -30,7 +30,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
builder.UseStartup<BasicWebSite.StartupWithCookieTempDataProviderAndCookieConsent>();
[Fact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/1803", FlakyOn.AzP.Windows)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/1803")]
public async Task CookieTempDataProviderCookie_SetInResponse_OnGrantingConsent()
{
// Arrange
@ -64,7 +64,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
}
[Fact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/1803", FlakyOn.AzP.Windows)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/1803")]
public async Task CookieTempDataProviderCookie_NotSetInResponse_OnNoConsent()
{
// Arrange

View File

@ -10,7 +10,7 @@
"defaultName": "WebApplication",
"description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
"groupIdentity": "Microsoft.Web.Blazor.Wasm",
"precedence": "6001",
"precedence": "7001",
"guids": [
"4C26868E-5E7C-458D-82E3-040509D0C71F",
"5990939C-7E7B-4CFA-86FF-44CA5756498A",

View File

@ -9,10 +9,10 @@
"generatorVersions": "[1.0.0.0-*)",
"description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
"groupIdentity": "Microsoft.Web.Blazor.Server",
"precedence": "6000",
"identity": "Microsoft.Web.Blazor.Server.CSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.Web.Blazor.Server.CSharp.5.0",
"shortName": "blazorserver",
"thirdPartyNotices": "https://aka.ms/aspnetcore/3.1-third-party-notices",
"thirdPartyNotices": "https://aka.ms/aspnetcore/5.0-third-party-notices",
"tags": {
"language": "C#",
"type": "project"

View File

@ -9,8 +9,8 @@
"generatorVersions": "[1.0.0.0-*)",
"description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
"groupIdentity": "Microsoft.Web.Empty",
"precedence": "6000",
"identity": "Microsoft.Web.Empty.CSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.Web.Empty.CSharp.5.0",
"shortName": "web",
"tags": {
"language": "C#",

View File

@ -8,8 +8,8 @@
"generatorVersions": "[1.0.0.0-*)",
"description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
"groupIdentity": "Microsoft.Web.Empty",
"precedence": "6000",
"identity": "Microsoft.Web.Empty.FSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.Web.Empty.FSharp.5.0",
"shortName": "web",
"tags": {
"language": "F#",

View File

@ -9,8 +9,8 @@
"generatorVersions": "[1.0.0.0-*)",
"description": "A project template for creating a gRPC ASP.NET Core service.",
"groupIdentity": "Microsoft.Web.Grpc",
"precedence": "6000",
"identity": "Microsoft.Grpc.Service.CSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.Grpc.Service.CSharp.5.0",
"shortName": "grpc",
"tags": {
"language": "C#",

View File

@ -10,8 +10,8 @@
"generatorVersions": "[1.0.0.0-*)",
"description": "A project for creating a Razor class library that targets .NET Standard",
"groupIdentity": "Microsoft.Web.Razor",
"precedence": "6000",
"identity": "Microsoft.Web.Razor.Library.CSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.Web.Razor.Library.CSharp.5.0",
"shortName": "razorclasslib",
"tags": {
"language": "C#",

View File

@ -10,13 +10,13 @@
"generatorVersions": "[1.0.0.0-*)",
"description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
"groupIdentity": "Microsoft.Web.RazorPages",
"precedence": "6000",
"identity": "Microsoft.Web.RazorPages.CSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.Web.RazorPages.CSharp.5.0",
"shortName": [
"webapp",
"razor"
],
"thirdPartyNotices": "https://aka.ms/aspnetcore/3.1-third-party-notices",
"thirdPartyNotices": "https://aka.ms/aspnetcore/5.0-third-party-notices",
"tags": {
"language": "C#",
"type": "project"

View File

@ -9,10 +9,10 @@
"generatorVersions": "[1.0.0.0-*)",
"description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
"groupIdentity": "Microsoft.Web.Mvc",
"precedence": "6000",
"identity": "Microsoft.Web.Mvc.CSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.Web.Mvc.CSharp.5.0",
"shortName": "mvc",
"thirdPartyNotices": "https://aka.ms/aspnetcore/3.1-third-party-notices",
"thirdPartyNotices": "https://aka.ms/aspnetcore/5.0-third-party-notices",
"tags": {
"language": "C#",
"type": "project"

View File

@ -9,10 +9,10 @@
"generatorVersions": "[1.0.0.0-*)",
"description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
"groupIdentity": "Microsoft.Web.Mvc",
"precedence": "6000",
"identity": "Microsoft.Web.Mvc.FSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.Web.Mvc.FSharp.5.0",
"shortName": "mvc",
"thirdPartyNotices": "https://aka.ms/aspnetcore/3.1-third-party-notices",
"thirdPartyNotices": "https://aka.ms/aspnetcore/5.0-third-party-notices",
"tags": {
"language": "F#",
"type": "project"

View File

@ -9,8 +9,8 @@
"generatorVersions": "[1.0.0.0-*)",
"description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
"groupIdentity": "Microsoft.Web.WebApi",
"precedence": "6000",
"identity": "Microsoft.Web.WebApi.CSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.Web.WebApi.CSharp.5.0",
"shortName": "webapi",
"tags": {
"language": "C#",

View File

@ -8,8 +8,8 @@
"generatorVersions": "[1.0.0.0-*)",
"description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
"groupIdentity": "Microsoft.Web.WebApi",
"precedence": "6000",
"identity": "Microsoft.Web.WebApi.FSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.Web.WebApi.FSharp.5.0",
"shortName": "webapi",
"tags": {
"language": "F#",

View File

@ -10,8 +10,8 @@
"generatorVersions": "[1.0.0.0-*)",
"description": "An empty project template for creating a worker service.",
"groupIdentity": "Microsoft.Worker.Empty",
"precedence": "6000",
"identity": "Microsoft.Worker.Empty.CSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.Worker.Empty.CSharp.5.0",
"shortName": "worker",
"tags": {
"language": "C#",

View File

@ -6,8 +6,8 @@
"SPA"
],
"groupIdentity": "Microsoft.DotNet.Web.Spa.ProjectTemplates.Angular",
"precedence": "6000",
"identity": "Microsoft.DotNet.Web.Spa.ProjectTemplates.Angular.CSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.DotNet.Web.Spa.ProjectTemplates.Angular.CSharp.5.0",
"name": "ASP.NET Core with Angular",
"preferNameDirectory": true,
"primaryOutputs": [

View File

@ -6,8 +6,8 @@
"SPA"
],
"groupIdentity": "Microsoft.DotNet.Web.Spa.ProjectTemplates.React",
"precedence": "6000",
"identity": "Microsoft.DotNet.Web.Spa.ProjectTemplates.React.CSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.DotNet.Web.Spa.ProjectTemplates.React.CSharp.5.0",
"name": "ASP.NET Core with React.js",
"preferNameDirectory": true,
"primaryOutputs": [

View File

@ -6,8 +6,8 @@
"SPA"
],
"groupIdentity": "Microsoft.DotNet.Web.Spa.ProjectTemplates.ReactRedux",
"precedence": "6000",
"identity": "Microsoft.DotNet.Web.Spa.ProjectTemplates.ReactRedux.CSharp.3.1",
"precedence": "7000",
"identity": "Microsoft.DotNet.Web.Spa.ProjectTemplates.ReactRedux.CSharp.5.0",
"name": "ASP.NET Core with React.js and Redux",
"preferNameDirectory": true,
"primaryOutputs": [

View File

@ -22,6 +22,7 @@ namespace Templates.Test.SpaTemplateTest
public Task ReactTemplate_Works_NetCore()
=> SpaTemplateImplAsync("reactnoauth", "react", useLocalDb: false, usesAuth: false);
[QuarantinedTest]
[ConditionalFact]
[SkipOnHelix("selenium")]
public Task ReactTemplate_IndividualAuth_NetCore()

View File

@ -9,7 +9,7 @@ using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Authentication.Cookies
{
/// <summary>
/// This default implementation of the ICookieAuthenticationEvents may be used if the
/// This default implementation of the ICookieAuthenticationEvents may be used if the
/// application only needs to override a few of the interface methods. This may be used as a base class
/// or may be instantiated directly.
/// </summary>
@ -103,9 +103,9 @@ namespace Microsoft.AspNetCore.Authentication.Cookies
private static bool IsAjaxRequest(HttpRequest request)
{
return string.Equals(request.Query["X-Requested-With"], "XMLHttpRequest", StringComparison.Ordinal) ||
string.Equals(request.Headers["X-Requested-With"], "XMLHttpRequest", StringComparison.Ordinal);
}
return string.Equals(request.Query[HeaderNames.XRequestedWith], "XMLHttpRequest", StringComparison.Ordinal) ||
string.Equals(request.Headers[HeaderNames.XRequestedWith], "XMLHttpRequest", StringComparison.Ordinal);
}
/// <summary>
/// Implements the interface method by invoking the related delegate method.

View File

@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.TestHost;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Net.Http.Headers;
@ -20,6 +21,7 @@ using Xunit;
namespace Microsoft.AspNetCore.Authentication.Negotiate
{
[QuarantinedTest]
public class EventTests
{
[Fact]

View File

@ -12,6 +12,7 @@
<Reference Include="Microsoft.AspNetCore.Authentication.Negotiate" />
<Reference Include="Microsoft.AspNetCore.Diagnostics" />
<Reference Include="Microsoft.AspNetCore.Routing" />
<Reference Include="Microsoft.AspNetCore.Testing" />
<Reference Include="Microsoft.AspNetCore.TestHost" />
<Reference Include="Microsoft.Extensions.Hosting" />
</ItemGroup>

View File

@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.TestHost;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Net.Http.Headers;
@ -21,6 +22,7 @@ using Xunit.Sdk;
namespace Microsoft.AspNetCore.Authentication.Negotiate
{
[QuarantinedTest]
public class NegotiateHandlerTests
{
[Fact]

View File

@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.TestHost;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
@ -14,6 +15,7 @@ using Xunit;
namespace Microsoft.AspNetCore.Authentication.Negotiate
{
[QuarantinedTest]
public class ServerDeferralTests
{
[Fact]

View File

@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener
public class RequestBodyTests
{
[ConditionalFact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/1826", FlakyOn.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/1826")]
public async Task RequestBody_SyncReadDisabledByDefault_WorksWhenEnabled()
{
string address;
@ -142,7 +142,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener
}
[ConditionalFact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2206", FlakyOn.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2206")]
public async Task RequestBody_ReadAsyncPartialBodyAndExpiredTimeout_Canceled()
{
StaggardContent content = new StaggardContent();

View File

@ -45,7 +45,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys.FunctionalTests
}
[ConditionalFact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2135", FlakyOn.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2135")]
public async Task Caching_JustPublic_NotCached()
{
var requestCount = 1;
@ -86,7 +86,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys.FunctionalTests
}
[ConditionalFact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2207", FlakyOn.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2207")]
public async Task Caching_WithoutContentType_Cached_OnWin7AndWin2008R2()
{
if (Utilities.IsWin8orLater)
@ -237,7 +237,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys.FunctionalTests
[ConditionalTheory]
[InlineData("0")]
[InlineData("-1")]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2208", FlakyOn.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2208")]
public async Task Caching_InvalidExpires_NotCached(string expiresValue)
{
var requestCount = 1;
@ -378,7 +378,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys.FunctionalTests
}
[ConditionalFact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2209", FlakyOn.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2209")]
public async Task Caching_VariousStatusCodes_Cached()
{
var requestCount = 1;

View File

@ -131,7 +131,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys
}
[ConditionalFact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2267", FlakyOn.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2267")]
public async Task Server_ShutdownDuringRequest_Success()
{
Task<string> responseTask;

View File

@ -98,6 +98,7 @@
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel>
<TreatWarningAsError>true</TreatWarningAsError>
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\RequestHandlerLib;..\IISLib;..\CommonLib;$(GoogleTestSubmoduleRoot)googletest\include;$(GoogleTestSubmoduleRoot)googlemock\include;...\AspNetCore\Inc;..\InProcessRequestHandler\</AdditionalIncludeDirectories>
<AdditionalOptions>/D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" </AdditionalOptions>
<LanguageStandard>stdcpp17</LanguageStandard>
@ -125,6 +126,7 @@
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel>
<TreatWarningAsError>true</TreatWarningAsError>
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\RequestHandlerLib;..\IISLib;..\CommonLib;$(GoogleTestSubmoduleRoot)googletest\include;$(GoogleTestSubmoduleRoot)googlemock\include;...\AspNetCore\Inc;..\InProcessRequestHandler\</AdditionalIncludeDirectories>
<AdditionalOptions>/D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" </AdditionalOptions>
<LanguageStandard>stdcpp17</LanguageStandard>
@ -150,6 +152,7 @@
<PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel>
<TreatWarningAsError>true</TreatWarningAsError>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\RequestHandlerLib;..\IISLib;..\CommonLib;$(GoogleTestSubmoduleRoot)googletest\include;$(GoogleTestSubmoduleRoot)googlemock\include;...\AspNetCore\Inc;..\InProcessRequestHandler\</AdditionalIncludeDirectories>
<AdditionalOptions>/D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" </AdditionalOptions>
@ -179,6 +182,7 @@
<PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel>
<TreatWarningAsError>true</TreatWarningAsError>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\RequestHandlerLib;..\IISLib;..\CommonLib;$(GoogleTestSubmoduleRoot)googletest\include;$(GoogleTestSubmoduleRoot)googlemock\include;...\AspNetCore\Inc;..\InProcessRequestHandler\</AdditionalIncludeDirectories>
<AdditionalOptions>/D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" </AdditionalOptions>
@ -200,4 +204,4 @@
</AdditionalDependencies>
</Lib>
</ItemDefinitionGroup>
</Project>
</Project>

View File

@ -16,7 +16,6 @@ namespace InprocessTests
TEST(Dotnet_EXE_Path_Tests, EndWith_dotnet)
{
HostFxrResolver resolver;
std::filesystem::path hostFxrDllPath;
std::vector<std::wstring> arguments;
ErrorContext errorContext;

View File

@ -27,10 +27,10 @@ namespace BenchmarkDotNet.Attributes
Add(JitOptimizationsValidator.FailOnError);
Add(Job.Core
Add(Job.Default
.With(CsProjCoreToolchain.From(NetCoreAppSettings.NetCoreApp21))
.With(new GcMode { Server = true })
.WithTargetCount(10)
.WithIterationCount(10)
.WithInvocationCount(1)
.WithUnrollFactor(1)
.With(RunStrategy.ColdStart));

View File

@ -211,7 +211,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
[ConditionalTheory]
[InlineData(HostingModel.InProcess)]
[InlineData(HostingModel.OutOfProcess)]
[Flaky("https://github.com/dotnet/aspnetcore/issues/7075", FlakyOn.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/7075")]
public async Task AppOfflineAddedAndRemovedStress(HostingModel hostingModel)
{
var deploymentResult = await AssertStarts(hostingModel);

View File

@ -79,7 +79,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
[ConditionalTheory]
[InlineData(HostingModel.InProcess)]
[InlineData(HostingModel.OutOfProcess)]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/1794", FlakyOn.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/1794")]
public async Task ConfigurationTouchedStress(HostingModel hostingModel)
{
var deploymentResult = await DeployAsync(Fixture.GetBaseDeploymentParameters(hostingModel));

View File

@ -80,7 +80,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests.InProcess
// I think this test is flaky due to freb file not being created quickly enough.
// Adding extra logging, marking as flaky, and repeating should help
[ConditionalFact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2570", FlakyOn.Helix.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2570")]
[Repeat(10)]
[RequiresIIS(IISCapability.FailedRequestTracingModule)]
public async Task CheckFrebDisconnect()

View File

@ -22,7 +22,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests.InProcess
}
[ConditionalFact]
[Flaky("https://github.com/dotnet/aspnetcore/issues/7341", FlakyOn.Helix.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/7341")]
public async Task ReadAndWriteSynchronously()
{
for (int i = 0; i < 100; i++)

View File

@ -171,7 +171,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
[ConditionalTheory]
[MemberData(nameof(TestVariants))]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2200", FlakyOn.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2200")]
public async Task CheckUTF8File(TestVariant variant)
{
var path = "CheckConsoleFunctions";

View File

@ -225,7 +225,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
}
[ConditionalFact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/1817", FlakyOn.AzP.Windows)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/1817")]
public async Task ReaderThrowsResetExceptionOnInvalidBody()
{
var requestStartedCompletionSource = CreateTaskCompletionSource();

View File

@ -127,6 +127,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
private readonly long _bits;
private int _next;
private KeyValuePair<string, StringValues> _current;
private KnownHeaderType _currentKnownType;
private readonly bool _hasUnknown;
private Dictionary<string, StringValues>.Enumerator _unknownEnumerator;
@ -136,6 +137,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
_bits = collection._bits;
_next = 0;
_current = default;
_currentKnownType = default;
_hasUnknown = collection.MaybeUnknown != null;
_unknownEnumerator = _hasUnknown
? collection.MaybeUnknown.GetEnumerator()
@ -144,6 +146,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
public KeyValuePair<string, StringValues> Current => _current;
internal KnownHeaderType CurrentKnownType => _currentKnownType;
object IEnumerator.Current => _current;
public void Dispose()

View File

@ -94,6 +94,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
private readonly long _bits;
private int _next;
private KeyValuePair<string, StringValues> _current;
private KnownHeaderType _currentKnownType;
private readonly bool _hasUnknown;
private Dictionary<string, StringValues>.Enumerator _unknownEnumerator;
@ -103,6 +104,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
_bits = collection._bits;
_next = 0;
_current = default;
_currentKnownType = default;
_hasUnknown = collection.MaybeUnknown != null;
_unknownEnumerator = _hasUnknown
? collection.MaybeUnknown.GetEnumerator()
@ -111,6 +113,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
public KeyValuePair<string, StringValues> Current => _current;
internal KnownHeaderType CurrentKnownType => _currentKnownType;
object IEnumerator.Current => _current;
public void Dispose()

View File

@ -43,6 +43,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
private readonly long _bits;
private int _next;
private KeyValuePair<string, StringValues> _current;
private KnownHeaderType _currentKnownType;
private readonly bool _hasUnknown;
private Dictionary<string, StringValues>.Enumerator _unknownEnumerator;
@ -52,6 +53,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
_bits = collection._bits;
_next = 0;
_current = default;
_currentKnownType = default;
_hasUnknown = collection.MaybeUnknown != null;
_unknownEnumerator = _hasUnknown
? collection.MaybeUnknown.GetEnumerator()
@ -60,6 +62,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
public KeyValuePair<string, StringValues> Current => _current;
internal KnownHeaderType CurrentKnownType => _currentKnownType;
object IEnumerator.Current => _current;
public void Dispose()

View File

@ -0,0 +1,157 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Net.Http;
using System.Net.Http.HPack;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
{
internal static class HPackHeaderWriter
{
/// <summary>
/// Begin encoding headers in the first HEADERS frame.
/// </summary>
public static bool BeginEncodeHeaders(int statusCode, Http2HeadersEnumerator headersEnumerator, Span<byte> buffer, out int length)
{
if (!HPackEncoder.EncodeStatusHeader(statusCode, buffer, out var statusCodeLength))
{
throw new HPackEncodingException(SR.net_http_hpack_encode_failure);
}
if (!headersEnumerator.MoveNext())
{
length = statusCodeLength;
return true;
}
// We're ok with not throwing if no headers were encoded because we've already encoded the status.
// There is a small chance that the header will encode if there is no other content in the next HEADERS frame.
var done = EncodeHeaders(headersEnumerator, buffer.Slice(statusCodeLength), throwIfNoneEncoded: false, out var headersLength);
length = statusCodeLength + headersLength;
return done;
}
/// <summary>
/// Begin encoding headers in the first HEADERS frame.
/// </summary>
public static bool BeginEncodeHeaders(Http2HeadersEnumerator headersEnumerator, Span<byte> buffer, out int length)
{
if (!headersEnumerator.MoveNext())
{
length = 0;
return true;
}
return EncodeHeaders(headersEnumerator, buffer, throwIfNoneEncoded: true, out length);
}
/// <summary>
/// Continue encoding headers in the next HEADERS frame. The enumerator should already have a current value.
/// </summary>
public static bool ContinueEncodeHeaders(Http2HeadersEnumerator headersEnumerator, Span<byte> buffer, out int length)
{
return EncodeHeaders(headersEnumerator, buffer, throwIfNoneEncoded: true, out length);
}
private static bool EncodeHeaders(Http2HeadersEnumerator headersEnumerator, Span<byte> buffer, bool throwIfNoneEncoded, out int length)
{
var currentLength = 0;
do
{
if (!EncodeHeader(headersEnumerator.KnownHeaderType, headersEnumerator.Current.Key, headersEnumerator.Current.Value, buffer.Slice(currentLength), out int headerLength))
{
// The the header wasn't written and no headers have been written then the header is too large.
// Throw an error to avoid an infinite loop of attempting to write large header.
if (currentLength == 0 && throwIfNoneEncoded)
{
throw new HPackEncodingException(SR.net_http_hpack_encode_failure);
}
length = currentLength;
return false;
}
currentLength += headerLength;
}
while (headersEnumerator.MoveNext());
length = currentLength;
return true;
}
private static bool EncodeHeader(KnownHeaderType knownHeaderType, string name, string value, Span<byte> buffer, out int length)
{
var hPackStaticTableId = GetResponseHeaderStaticTableId(knownHeaderType);
if (hPackStaticTableId == -1)
{
return HPackEncoder.EncodeLiteralHeaderFieldWithoutIndexingNewName(name, value, buffer, out length);
}
else
{
return HPackEncoder.EncodeLiteralHeaderFieldWithoutIndexing(hPackStaticTableId, value, buffer, out length);
}
}
private static int GetResponseHeaderStaticTableId(KnownHeaderType responseHeaderType)
{
switch (responseHeaderType)
{
case KnownHeaderType.CacheControl:
return H2StaticTable.CacheControl;
case KnownHeaderType.Date:
return H2StaticTable.Date;
case KnownHeaderType.TransferEncoding:
return H2StaticTable.TransferEncoding;
case KnownHeaderType.Via:
return H2StaticTable.Via;
case KnownHeaderType.Allow:
return H2StaticTable.Allow;
case KnownHeaderType.ContentType:
return H2StaticTable.ContentType;
case KnownHeaderType.ContentEncoding:
return H2StaticTable.ContentEncoding;
case KnownHeaderType.ContentLanguage:
return H2StaticTable.ContentLanguage;
case KnownHeaderType.ContentLocation:
return H2StaticTable.ContentLocation;
case KnownHeaderType.ContentRange:
return H2StaticTable.ContentRange;
case KnownHeaderType.Expires:
return H2StaticTable.Expires;
case KnownHeaderType.LastModified:
return H2StaticTable.LastModified;
case KnownHeaderType.AcceptRanges:
return H2StaticTable.AcceptRanges;
case KnownHeaderType.Age:
return H2StaticTable.Age;
case KnownHeaderType.ETag:
return H2StaticTable.ETag;
case KnownHeaderType.Location:
return H2StaticTable.Location;
case KnownHeaderType.ProxyAuthenticate:
return H2StaticTable.ProxyAuthenticate;
case KnownHeaderType.RetryAfter:
return H2StaticTable.RetryAfter;
case KnownHeaderType.Server:
return H2StaticTable.Server;
case KnownHeaderType.SetCookie:
return H2StaticTable.SetCookie;
case KnownHeaderType.Vary:
return H2StaticTable.Vary;
case KnownHeaderType.WWWAuthenticate:
return H2StaticTable.WwwAuthenticate;
case KnownHeaderType.AccessControlAllowOrigin:
return H2StaticTable.AccessControlAllowOrigin;
case KnownHeaderType.ContentLength:
return H2StaticTable.ContentLength;
default:
return -1;
}
}
}
}

View File

@ -65,7 +65,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
private int _gracefulCloseInitiator;
private int _isClosed;
private Http2StreamStack _streamPool;
// Internal for testing
internal Http2StreamStack StreamPool;
internal const int InitialStreamPoolSize = 5;
internal const int MaxStreamPoolSize = 40;
@ -111,7 +112,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
_serverSettings.InitialWindowSize = (uint)http2Limits.InitialStreamWindowSize;
// Start pool off at a smaller size if the max number of streams is less than the InitialStreamPoolSize
_streamPool = new Http2StreamStack(Math.Min(InitialStreamPoolSize, http2Limits.MaxStreamsPerConnection));
StreamPool = new Http2StreamStack(Math.Min(InitialStreamPoolSize, http2Limits.MaxStreamsPerConnection));
_inputTask = ReadInputAsync();
}
@ -572,7 +573,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
private Http2Stream GetStream<TContext>(IHttpApplication<TContext> application)
{
if (_streamPool.TryPop(out var stream))
if (StreamPool.TryPop(out var stream))
{
stream.InitializeWithExistingContext(_incomingFrame.StreamId);
return stream;
@ -606,9 +607,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
private void ReturnStream(Http2Stream stream)
{
if (_streamPool.Count < MaxStreamPoolSize)
if (StreamPool.Count < MaxStreamPoolSize)
{
_streamPool.Push(stream);
StreamPool.Push(stream);
}
}
@ -972,8 +973,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
catch (Http2StreamErrorException)
{
MakeSpaceInDrainQueue();
// Tracked for draining
_completedStreams.Enqueue(_currentHeadersStream);
// Because this stream isn't being queued, OnRequestProcessingEnded will not be
// automatically called and the stream won't be completed.
// Manually complete stream to ensure pipes are completed.
// Completing the stream will add it to the completed stream queue.
_currentHeadersStream.DecrementActiveClientStreamCount();
_currentHeadersStream.CompleteStream(errored: true);
throw;
}

View File

@ -7,6 +7,7 @@ using System.Buffers.Binary;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO.Pipelines;
using System.Net.Http;
using System.Net.Http.HPack;
using System.Threading;
using System.Threading.Tasks;
@ -27,7 +28,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
private readonly object _writeLock = new object();
private readonly Http2Frame _outgoingFrame;
private readonly HPackEncoder _hpackEncoder = new HPackEncoder();
private readonly Http2HeadersEnumerator _headersEnumerator = new Http2HeadersEnumerator();
private readonly ConcurrentPipeWriter _outputWriter;
private readonly ConnectionContext _connectionContext;
private readonly Http2Connection _http2Connection;
@ -160,7 +161,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
| Padding (*) ...
+---------------------------------------------------------------+
*/
public void WriteResponseHeaders(int streamId, int statusCode, Http2HeadersFrameFlags headerFrameFlags, IHeaderDictionary headers)
public void WriteResponseHeaders(int streamId, int statusCode, Http2HeadersFrameFlags headerFrameFlags, HttpResponseHeaders headers)
{
lock (_writeLock)
{
@ -171,9 +172,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
try
{
_headersEnumerator.Initialize(headers);
_outgoingFrame.PrepareHeaders(headerFrameFlags, streamId);
var buffer = _headerEncodingBuffer.AsSpan();
var done = _hpackEncoder.BeginEncode(statusCode, EnumerateHeaders(headers), buffer, out var payloadLength);
var done = HPackHeaderWriter.BeginEncodeHeaders(statusCode, _headersEnumerator, buffer, out var payloadLength);
FinishWritingHeaders(streamId, payloadLength, done);
}
catch (HPackEncodingException hex)
@ -196,9 +198,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
try
{
_headersEnumerator.Initialize(headers);
_outgoingFrame.PrepareHeaders(Http2HeadersFrameFlags.END_STREAM, streamId);
var buffer = _headerEncodingBuffer.AsSpan();
var done = _hpackEncoder.BeginEncode(EnumerateHeaders(headers), buffer, out var payloadLength);
var done = HPackHeaderWriter.BeginEncodeHeaders(_headersEnumerator, buffer, out var payloadLength);
FinishWritingHeaders(streamId, payloadLength, done);
}
catch (HPackEncodingException hex)
@ -227,7 +230,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
{
_outgoingFrame.PrepareContinuation(Http2ContinuationFrameFlags.NONE, streamId);
done = _hpackEncoder.Encode(buffer, out payloadLength);
done = HPackHeaderWriter.ContinueEncodeHeaders(_headersEnumerator, buffer, out payloadLength);
_outgoingFrame.PayloadLength = payloadLength;
if (done)
@ -662,16 +665,5 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
flowControl.Abort();
}
}
private static IEnumerable<KeyValuePair<string, string>> EnumerateHeaders(IHeaderDictionary headers)
{
foreach (var header in headers)
{
foreach (var value in header.Value)
{
yield return new KeyValuePair<string, string>(header.Key, value);
}
}
}
}
}

View File

@ -0,0 +1,169 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections;
using System.Collections.Generic;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
{
internal sealed class Http2HeadersEnumerator : IEnumerator<KeyValuePair<string, string>>
{
private bool _isTrailers;
private HttpResponseHeaders.Enumerator _headersEnumerator;
private HttpResponseTrailers.Enumerator _trailersEnumerator;
private IEnumerator<KeyValuePair<string, StringValues>> _genericEnumerator;
private StringValues.Enumerator _stringValuesEnumerator;
public KnownHeaderType KnownHeaderType { get; private set; }
public KeyValuePair<string, string> Current { get; private set; }
object IEnumerator.Current => Current;
public Http2HeadersEnumerator()
{
}
public void Initialize(HttpResponseHeaders headers)
{
_headersEnumerator = headers.GetEnumerator();
_trailersEnumerator = default;
_genericEnumerator = null;
_isTrailers = false;
_stringValuesEnumerator = default;
Current = default;
KnownHeaderType = default;
}
public void Initialize(HttpResponseTrailers headers)
{
_headersEnumerator = default;
_trailersEnumerator = headers.GetEnumerator();
_genericEnumerator = null;
_isTrailers = true;
_stringValuesEnumerator = default;
Current = default;
KnownHeaderType = default;
}
public void Initialize(IDictionary<string, StringValues> headers)
{
_headersEnumerator = default;
_trailersEnumerator = default;
_genericEnumerator = headers.GetEnumerator();
_isTrailers = false;
_stringValuesEnumerator = default;
Current = default;
KnownHeaderType = default;
}
public bool MoveNext()
{
if (MoveNextOnStringEnumerator())
{
return true;
}
if (!TryGetNextStringEnumerator(out _stringValuesEnumerator))
{
return false;
}
return MoveNextOnStringEnumerator();
}
private string GetCurrentKey()
{
if (_genericEnumerator != null)
{
return _genericEnumerator.Current.Key;
}
else if (_isTrailers)
{
return _trailersEnumerator.Current.Key;
}
else
{
return _headersEnumerator.Current.Key;
}
}
private bool MoveNextOnStringEnumerator()
{
var result = _stringValuesEnumerator.MoveNext();
Current = result ? new KeyValuePair<string, string>(GetCurrentKey(), _stringValuesEnumerator.Current) : default;
return result;
}
private bool TryGetNextStringEnumerator(out StringValues.Enumerator enumerator)
{
if (_genericEnumerator != null)
{
if (!_genericEnumerator.MoveNext())
{
enumerator = default;
return false;
}
else
{
enumerator = _genericEnumerator.Current.Value.GetEnumerator();
KnownHeaderType = default;
return true;
}
}
else if (_isTrailers)
{
if (!_trailersEnumerator.MoveNext())
{
enumerator = default;
return false;
}
else
{
enumerator = _trailersEnumerator.Current.Value.GetEnumerator();
KnownHeaderType = _trailersEnumerator.CurrentKnownType;
return true;
}
}
else
{
if (!_headersEnumerator.MoveNext())
{
enumerator = default;
return false;
}
else
{
enumerator = _headersEnumerator.Current.Value.GetEnumerator();
KnownHeaderType = _headersEnumerator.CurrentKnownType;
return true;
}
}
}
public void Reset()
{
if (_genericEnumerator != null)
{
_genericEnumerator.Reset();
}
else if (_isTrailers)
{
_trailersEnumerator.Reset();
}
else
{
_headersEnumerator.Reset();
}
_stringValuesEnumerator = default;
KnownHeaderType = default;
}
public void Dispose()
{
}
}
}

View File

@ -71,6 +71,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
public void InitializeWithExistingContext(int streamId)
{
_context.StreamId = streamId;
Initialize(_context);
}
@ -103,6 +104,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
}
protected override void OnRequestProcessingEnded()
{
CompleteStream(errored: false);
}
public void CompleteStream(bool errored)
{
try
{
@ -110,14 +116,23 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
// If the app finished without reading the request body tell the client not to finish sending it.
if (!EndStreamReceived && !RstStreamReceived)
{
Log.RequestBodyNotEntirelyRead(ConnectionIdFeature, TraceIdentifier);
if (!errored)
{
Log.RequestBodyNotEntirelyRead(ConnectionIdFeature, TraceIdentifier);
}
var (oldState, newState) = ApplyCompletionFlag(StreamCompletionFlags.Aborted);
if (oldState != newState)
{
Debug.Assert(_decrementCalled);
// Don't block on IO. This never faults.
_ = _http2Output.WriteRstStreamAsync(Http2ErrorCode.NO_ERROR);
// If there was an error starting the stream then we don't want to write RST_STREAM here.
// The connection will handle writing RST_STREAM with the correct error code.
if (!errored)
{
// Don't block on IO. This never faults.
_ = _http2Output.WriteRstStreamAsync(Http2ErrorCode.NO_ERROR);
}
RequestBodyPipe.Writer.Complete();
}
}
@ -129,8 +144,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
// The app can no longer read any more of the request body, so return any bytes that weren't read to the
// connection's flow-control window.
_inputFlowControl.Abort();
Reset();
}
finally
{
@ -173,7 +186,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
// CONNECT - :scheme and :path must be excluded
if (Method == HttpMethod.Connect)
{
if (!String.IsNullOrEmpty(RequestHeaders[HeaderNames.Scheme]) || !String.IsNullOrEmpty(RequestHeaders[HeaderNames.Path]))
if (!String.IsNullOrEmpty(HttpRequestHeaders.HeaderScheme) || !String.IsNullOrEmpty(HttpRequestHeaders.HeaderPath))
{
ResetAndAbort(new ConnectionAbortedException(CoreStrings.Http2ErrorConnectMustNotSendSchemeOrPath), Http2ErrorCode.PROTOCOL_ERROR);
return false;
@ -192,16 +205,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
// - That said, we shouldn't allow arbitrary values or use them to populate Request.Scheme, right?
// - For now we'll restrict it to http/s and require it match the transport.
// - We'll need to find some concrete scenarios to warrant unblocking this.
if (!string.Equals(RequestHeaders[HeaderNames.Scheme], Scheme, StringComparison.OrdinalIgnoreCase))
if (!string.Equals(HttpRequestHeaders.HeaderScheme, Scheme, StringComparison.OrdinalIgnoreCase))
{
ResetAndAbort(new ConnectionAbortedException(
CoreStrings.FormatHttp2StreamErrorSchemeMismatch(RequestHeaders[HeaderNames.Scheme], Scheme)), Http2ErrorCode.PROTOCOL_ERROR);
CoreStrings.FormatHttp2StreamErrorSchemeMismatch(HttpRequestHeaders.HeaderScheme, Scheme)), Http2ErrorCode.PROTOCOL_ERROR);
return false;
}
// :path (and query) - Required
// Must start with / except may be * for OPTIONS
var path = RequestHeaders[HeaderNames.Path].ToString();
var path = HttpRequestHeaders.HeaderPath.ToString();
RawTarget = path;
// OPTIONS - https://tools.ietf.org/html/rfc7540#section-8.1.2.3
@ -238,7 +251,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
private bool TryValidateMethod()
{
// :method
_methodText = RequestHeaders[HeaderNames.Method].ToString();
_methodText = HttpRequestHeaders.HeaderMethod.ToString();
Method = HttpUtilities.GetKnownMethod(_methodText);
if (Method == HttpMethod.None)
@ -264,7 +277,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
// :authority (optional)
// Prefer this over Host
var authority = RequestHeaders[HeaderNames.Authority];
var authority = HttpRequestHeaders.HeaderAuthority;
var host = HttpRequestHeaders.HeaderHost;
if (!StringValues.IsNullOrEmpty(authority))
{

View File

@ -3,12 +3,14 @@
using System;
using System.Collections.Generic;
using System.Net.Http.HPack;
using System.Linq;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
using Microsoft.Extensions.Primitives;
using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
{
public class HPackEncoderTests
public class HPackHeaderWriterTests
{
public static TheoryData<KeyValuePair<string, string>[], byte[], int?> SinglePayloadData
{
@ -89,16 +91,15 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
[MemberData(nameof(SinglePayloadData))]
public void EncodesHeadersInSinglePayloadWhenSpaceAvailable(KeyValuePair<string, string>[] headers, byte[] expectedPayload, int? statusCode)
{
var encoder = new HPackEncoder();
var payload = new byte[1024];
var length = 0;
if (statusCode.HasValue)
{
Assert.True(encoder.BeginEncode(statusCode.Value, headers, payload, out length));
Assert.True(HPackHeaderWriter.BeginEncodeHeaders(statusCode.Value, GetHeadersEnumerator(headers), payload, out length));
}
else
{
Assert.True(encoder.BeginEncode(headers, payload, out length));
Assert.True(HPackHeaderWriter.BeginEncodeHeaders(GetHeadersEnumerator(headers), payload, out length));
}
Assert.Equal(expectedPayload.Length, length);
@ -115,10 +116,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
[InlineData(false)]
public void EncodesHeadersInMultiplePayloadsWhenSpaceNotAvailable(bool exactSize)
{
var encoder = new HPackEncoder();
var statusCode = 200;
var headers = new []
var headers = new[]
{
new KeyValuePair<string, string>("date", "Mon, 24 Jul 2017 19:22:30 GMT"),
new KeyValuePair<string, string>("content-type", "text/html; charset=utf-8"),
@ -156,33 +155,45 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
Span<byte> payload = new byte[1024];
var offset = 0;
var headerEnumerator = GetHeadersEnumerator(headers);
// When !exactSize, slices are one byte short of fitting the next header
var sliceLength = expectedStatusCodePayload.Length + (exactSize ? 0 : expectedDateHeaderPayload.Length - 1);
Assert.False(encoder.BeginEncode(statusCode, headers, payload.Slice(offset, sliceLength), out var length));
Assert.False(HPackHeaderWriter.BeginEncodeHeaders(statusCode, headerEnumerator, payload.Slice(offset, sliceLength), out var length));
Assert.Equal(expectedStatusCodePayload.Length, length);
Assert.Equal(expectedStatusCodePayload, payload.Slice(0, length).ToArray());
offset += length;
sliceLength = expectedDateHeaderPayload.Length + (exactSize ? 0 : expectedContentTypeHeaderPayload.Length - 1);
Assert.False(encoder.Encode(payload.Slice(offset, sliceLength), out length));
Assert.False(HPackHeaderWriter.ContinueEncodeHeaders(headerEnumerator, payload.Slice(offset, sliceLength), out length));
Assert.Equal(expectedDateHeaderPayload.Length, length);
Assert.Equal(expectedDateHeaderPayload, payload.Slice(offset, length).ToArray());
offset += length;
sliceLength = expectedContentTypeHeaderPayload.Length + (exactSize ? 0 : expectedServerHeaderPayload.Length - 1);
Assert.False(encoder.Encode(payload.Slice(offset, sliceLength), out length));
Assert.False(HPackHeaderWriter.ContinueEncodeHeaders(headerEnumerator, payload.Slice(offset, sliceLength), out length));
Assert.Equal(expectedContentTypeHeaderPayload.Length, length);
Assert.Equal(expectedContentTypeHeaderPayload, payload.Slice(offset, length).ToArray());
offset += length;
sliceLength = expectedServerHeaderPayload.Length;
Assert.True(encoder.Encode(payload.Slice(offset, sliceLength), out length));
Assert.True(HPackHeaderWriter.ContinueEncodeHeaders(headerEnumerator, payload.Slice(offset, sliceLength), out length));
Assert.Equal(expectedServerHeaderPayload.Length, length);
Assert.Equal(expectedServerHeaderPayload, payload.Slice(offset, length).ToArray());
}
private static Http2HeadersEnumerator GetHeadersEnumerator(IEnumerable<KeyValuePair<string, string>> headers)
{
var groupedHeaders = headers
.GroupBy(k => k.Key)
.ToDictionary(g => g.Key, g => new StringValues(g.Select(gg => gg.Value).ToArray()));
var enumerator = new Http2HeadersEnumerator();
enumerator.Initialize(groupedHeaders);
return enumerator;
}
}
}

View File

@ -13,15 +13,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
public class GeneratedCodeTests
{
[ConditionalFact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2223", FlakyOn.Helix.All)]
public void GeneratedCodeIsUpToDate()
{
var httpHeadersGeneratedPath = Path.Combine(AppContext.BaseDirectory, "shared", "GeneratedContent", "HttpHeaders.Generated.cs");
var httpProtocolGeneratedPath = Path.Combine(AppContext.BaseDirectory, "shared", "GeneratedContent", "HttpProtocol.Generated.cs");
var httpUtilitiesGeneratedPath = Path.Combine(AppContext.BaseDirectory, "shared", "GeneratedContent", "HttpUtilities.Generated.cs");
var http2ConnectionGeneratedPath = Path.Combine(AppContext.BaseDirectory, "shared", "GeneratedContent", "Http2Connection.Generated.cs");
var transportMultiplexedConnectionGeneratedPath = Path.Combine(AppContext.BaseDirectory,"shared", "GeneratedContent", "TransportMultiplexedConnection.Generated.cs");
var transportConnectionGeneratedPath = Path.Combine(AppContext.BaseDirectory,"shared", "GeneratedContent", "TransportConnection.Generated.cs");
var transportMultiplexedConnectionGeneratedPath = Path.Combine(AppContext.BaseDirectory, "shared", "GeneratedContent", "TransportMultiplexedConnection.Generated.cs");
var transportConnectionGeneratedPath = Path.Combine(AppContext.BaseDirectory, "shared", "GeneratedContent", "TransportConnection.Generated.cs");
var testHttpHeadersGeneratedPath = Path.GetTempFileName();
var testHttpProtocolGeneratedPath = Path.GetTempFileName();

View File

@ -29,10 +29,18 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Internal
_log = log;
_context = new QuicTransportContext(_log, options);
EndPoint = endpoint;
var quicListenerOptions = new QuicListenerOptions();
var sslConfig = new SslServerAuthenticationOptions();
sslConfig.ServerCertificate = options.Certificate;
sslConfig.ApplicationProtocols = new List<SslApplicationProtocol>() { new SslApplicationProtocol(options.Alpn) };
_listener = new QuicListener(QuicImplementationProviders.MsQuic, endpoint as IPEndPoint, sslConfig);
quicListenerOptions.ServerAuthenticationOptions = sslConfig;
quicListenerOptions.CertificateFilePath = options.CertificateFilePath;
quicListenerOptions.PrivateKeyFilePath = options.PrivateKeyFilePath;
quicListenerOptions.ListenEndPoint = endpoint as IPEndPoint;
_listener = new QuicListener(QuicImplementationProviders.MsQuic, quicListenerOptions);
_listener.Start();
}

View File

@ -29,6 +29,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic
/// </summary>
public X509Certificate2 Certificate { get; set; }
/// <summary>
/// Optional path to certificate file to configure the security configuration.
/// </summary>
public string CertificateFilePath { get; set; }
/// <summary>
/// Optional path to private key file to configure the security configuration.
/// </summary>
public string PrivateKeyFilePath { get; set; }
/// <summary>
/// Sets the idle timeout for connections and streams.
/// </summary>

View File

@ -0,0 +1,100 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Buffers;
using System.Collections.Generic;
using System.IO.Pipelines;
using System.Net.Http.HPack;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Primitives;
using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Server.Kestrel.Performance
{
public class Http2ConnectionBenchmark
{
private MemoryPool<byte> _memoryPool;
private Pipe _pipe;
private HttpRequestHeaders _httpRequestHeaders;
private Http2Connection _connection;
private Http2HeadersEnumerator _requestHeadersEnumerator;
private int _currentStreamId;
private byte[] _headersBuffer;
[GlobalSetup]
public void GlobalSetup()
{
_memoryPool = SlabMemoryPoolFactory.Create();
var options = new PipeOptions(_memoryPool, readerScheduler: PipeScheduler.Inline, writerScheduler: PipeScheduler.Inline, useSynchronizationContext: false);
_pipe = new Pipe(options);
_httpRequestHeaders = new HttpRequestHeaders();
_httpRequestHeaders.Append(HeaderNames.Method, new StringValues("GET"));
_httpRequestHeaders.Append(HeaderNames.Path, new StringValues("/"));
_httpRequestHeaders.Append(HeaderNames.Scheme, new StringValues("http"));
_httpRequestHeaders.Append(HeaderNames.Authority, new StringValues("localhost:80"));
_headersBuffer = new byte[1024 * 16];
var serviceContext = new ServiceContext
{
DateHeaderValueManager = new DateHeaderValueManager(),
ServerOptions = new KestrelServerOptions(),
Log = new KestrelTrace(NullLogger.Instance),
SystemClock = new MockSystemClock()
};
serviceContext.ServerOptions.Limits.Http2.MaxStreamsPerConnection = int.MaxValue;
serviceContext.DateHeaderValueManager.OnHeartbeat(default);
_connection = new Http2Connection(new HttpConnectionContext
{
MemoryPool = _memoryPool,
ConnectionId = "TestConnectionId",
Protocols = Core.HttpProtocols.Http2,
Transport = new MockDuplexPipe(_pipe.Reader, new NullPipeWriter()),
ServiceContext = serviceContext,
ConnectionFeatures = new FeatureCollection(),
TimeoutControl = new MockTimeoutControl(),
});
_requestHeadersEnumerator = new Http2HeadersEnumerator();
_currentStreamId = 1;
_ = _connection.ProcessRequestsAsync(new DummyApplication());
_pipe.Writer.Write(Http2Connection.ClientPreface);
_pipe.Writer.WriteSettings(new Http2PeerSettings());
_pipe.Writer.FlushAsync().GetAwaiter().GetResult();
}
[Benchmark]
public async Task EmptyRequest()
{
_requestHeadersEnumerator.Initialize(_httpRequestHeaders);
_requestHeadersEnumerator.MoveNext();
_pipe.Writer.WriteStartStream(streamId: _currentStreamId, _requestHeadersEnumerator, _headersBuffer, endStream: true);
_currentStreamId += 2;
await _pipe.Writer.FlushAsync();
}
[GlobalCleanup]
public void Dispose()
{
_pipe.Writer.Complete();
_memoryPool?.Dispose();
}
}
}

View File

@ -0,0 +1,59 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Buffers;
using System.IO.Pipelines;
using BenchmarkDotNet.Attributes;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2.FlowControl;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.Extensions.Logging.Abstractions;
namespace Microsoft.AspNetCore.Server.Kestrel.Performance
{
public class Http2FrameWriterBenchmark
{
private MemoryPool<byte> _memoryPool;
private Pipe _pipe;
private Http2FrameWriter _frameWriter;
private HttpResponseHeaders _responseHeaders;
[GlobalSetup]
public void GlobalSetup()
{
_memoryPool = SlabMemoryPoolFactory.Create();
var options = new PipeOptions(_memoryPool, readerScheduler: PipeScheduler.Inline, writerScheduler: PipeScheduler.Inline, useSynchronizationContext: false);
_pipe = new Pipe(options);
_frameWriter = new Http2FrameWriter(
new NullPipeWriter(),
connectionContext: null,
http2Connection: null,
new OutputFlowControl(initialWindowSize: uint.MaxValue),
timeoutControl: null,
minResponseDataRate: null,
"TestConnectionId",
_memoryPool,
new KestrelTrace(NullLogger.Instance));
_responseHeaders = new HttpResponseHeaders();
_responseHeaders.HeaderContentType = "application/json";
_responseHeaders.HeaderContentLength = "1024";
}
[Benchmark]
public void WriteResponseHeaders()
{
_frameWriter.WriteResponseHeaders(0, 200, Http2HeadersFrameFlags.END_HEADERS, _responseHeaders);
}
[GlobalCleanup]
public void Dispose()
{
_pipe.Writer.Complete();
_memoryPool?.Dispose();
}
}
}

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
@ -10,6 +10,8 @@
</PropertyGroup>
<ItemGroup>
<Compile Include="$(KestrelSharedSourceRoot)test\DummyApplication.cs" />
<Compile Include="$(KestrelSharedSourceRoot)test\PipeWriterHttp2FrameExtensions.cs" />
<Compile Include="$(RepoRoot)src\Shared\Buffers.MemoryPool\*.cs" LinkBase="MemoryPool" />
<Compile Include="$(KestrelSharedSourceRoot)test\TestApplicationErrorLogger.cs" />
<Compile Include="$(KestrelSharedSourceRoot)test\TestHttp1Connection.cs" />

View File

@ -0,0 +1,19 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.IO.Pipelines;
namespace Microsoft.AspNetCore.Server.Kestrel.Performance
{
internal class MockDuplexPipe : IDuplexPipe
{
public MockDuplexPipe(PipeReader input, PipeWriter output)
{
Input = input;
Output = output;
}
public PipeReader Input { get; }
public PipeWriter Output { get; }
}
}

View File

@ -0,0 +1,15 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
namespace Microsoft.AspNetCore.Server.Kestrel.Performance
{
internal class MockSystemClock : ISystemClock
{
public DateTimeOffset UtcNow { get; }
public long UtcNowTicks { get; }
public DateTimeOffset UtcNowUnsynchronized { get; }
}
}

View File

@ -0,0 +1,62 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2.FlowControl;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
namespace Microsoft.AspNetCore.Server.Kestrel.Performance
{
internal class MockTimeoutControl : ITimeoutControl
{
public TimeoutReason TimerReason { get; } = TimeoutReason.KeepAlive;
public void BytesRead(long count)
{
}
public void BytesWrittenToBuffer(MinDataRate minRate, long count)
{
}
public void CancelTimeout()
{
}
public void InitializeHttp2(InputFlowControl connectionInputFlowControl)
{
}
public void ResetTimeout(long ticks, TimeoutReason timeoutReason)
{
}
public void SetTimeout(long ticks, TimeoutReason timeoutReason)
{
}
public void StartRequestBody(MinDataRate minRate)
{
}
public void StartTimingRead()
{
}
public void StartTimingWrite()
{
}
public void StopRequestBody()
{
}
public void StopTimingRead()
{
}
public void StopTimingWrite()
{
}
}
}

View File

@ -0,0 +1,43 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.IO.Pipelines;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Server.Kestrel.Performance
{
internal class NullPipeWriter : PipeWriter
{
// Should be large enough for any content attempting to write to the buffer
private readonly byte[] _buffer = new byte[1024 * 128];
public override void Advance(int bytes)
{
}
public override void CancelPendingFlush()
{
}
public override void Complete(Exception exception = null)
{
}
public override ValueTask<FlushResult> FlushAsync(CancellationToken cancellationToken = default)
{
return new ValueTask<FlushResult>(new FlushResult(false, true));
}
public override Memory<byte> GetMemory(int sizeHint = 0)
{
return _buffer;
}
public override Span<byte> GetSpan(int sizeHint = 0)
{
return _buffer;
}
}
}

View File

@ -38,4 +38,4 @@
</ItemGroup>
</Project>

View File

@ -19,6 +19,10 @@ namespace CodeGenerator
{
var requestPrimaryHeaders = new[]
{
":authority",
":method",
":path",
":scheme",
"Accept",
"Connection",
"Host",
@ -72,6 +76,10 @@ namespace CodeGenerator
};
RequestHeaders = commonHeaders.Concat(new[]
{
":authority",
":method",
":path",
":scheme",
"Accept",
"Accept-Charset",
"Accept-Encoding",
@ -247,7 +255,7 @@ namespace CodeGenerator
{
public string Name { get; set; }
public int Index { get; set; }
public string Identifier => Name.Replace("-", "");
public string Identifier => ResolveIdentifier(Name);
public byte[] Bytes => Encoding.ASCII.GetBytes($"\r\n{Name}: ");
public int BytesOffset { get; set; }
@ -264,6 +272,21 @@ namespace CodeGenerator
public string SetBit() => $"_bits |= {"0x" + (1L << Index).ToString("x")}L";
public string ClearBit() => $"_bits &= ~{"0x" + (1L << Index).ToString("x")}L";
private string ResolveIdentifier(string name)
{
var identifer = name.Replace("-", "");
// Pseudo headers start with a colon. A colon isn't valid in C# names so
// remove it and pascal case the header name. e.g. :path -> Path, :scheme -> Scheme.
// This identifier will match the names in HeadersNames.cs
if (identifer.StartsWith(':'))
{
identifer = char.ToUpper(identifer[1]) + identifer.Substring(2);
}
return identifer;
}
private void GetMaskAndComp(string name, int offset, int count, out ulong mask, out ulong comp)
{
mask = 0;
@ -539,6 +562,9 @@ namespace CodeGenerator
var responseTrailers = ResponseTrailers;
var allHeaderNames = RequestHeaders.Concat(ResponseHeaders).Concat(ResponseTrailers)
.Select(h => h.Identifier).Distinct().OrderBy(n => n).ToArray();
var loops = new[]
{
new
@ -589,6 +615,11 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{{
internal enum KnownHeaderType
{{
Unknown,{Each(allHeaderNames, n => @"
" + n + ",")}
}}
{Each(loops, loop => $@"
internal partial class {loop.ClassName}
{{{(loop.Bytes != null ?
@ -1035,6 +1066,7 @@ $@" private void Clear(long bitsToClear)
if ({header.TestBit()})
{{
_current = new KeyValuePair<string, StringValues>(HeaderNames.{header.Identifier}, _collection._headers._{header.Identifier});
_currentKnownType = KnownHeaderType.{header.Identifier};
_next = {header.Index + 1};
return true;
}}")}
@ -1042,6 +1074,7 @@ $@" private void Clear(long bitsToClear)
if (_collection._contentLength.HasValue)
{{
_current = new KeyValuePair<string, StringValues>(HeaderNames.ContentLength, HeaderUtilities.FormatNonNegativeInt64(_collection._contentLength.Value));
_currentKnownType = KnownHeaderType.ContentLength;
_next = {loop.Headers.Count()};
return true;
}}" : "")}
@ -1049,9 +1082,11 @@ $@" private void Clear(long bitsToClear)
if (!_hasUnknown || !_unknownEnumerator.MoveNext())
{{
_current = default(KeyValuePair<string, StringValues>);
_currentKnownType = default;
return false;
}}
_current = _unknownEnumerator.Current;
_currentKnownType = KnownHeaderType.Unknown;
return true;
}}
}}

View File

@ -0,0 +1,94 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Buffers;
using System.Collections.Generic;
using System.IO.Pipelines;
using System.Net.Http.HPack;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
namespace Microsoft.AspNetCore.Testing
{
internal static class PipeWriterHttp2FrameExtensions
{
public static void WriteSettings(this PipeWriter writer, Http2PeerSettings clientSettings)
{
var frame = new Http2Frame();
frame.PrepareSettings(Http2SettingsFrameFlags.NONE);
var settings = clientSettings.GetNonProtocolDefaults();
var payload = new byte[settings.Count * Http2FrameReader.SettingSize];
frame.PayloadLength = payload.Length;
Http2FrameWriter.WriteSettings(settings, payload);
Http2FrameWriter.WriteHeader(frame, writer);
writer.Write(payload);
}
public static void WriteStartStream(this PipeWriter writer, int streamId, Http2HeadersEnumerator headers, byte[] headerEncodingBuffer, bool endStream)
{
var frame = new Http2Frame();
frame.PrepareHeaders(Http2HeadersFrameFlags.NONE, streamId);
var buffer = headerEncodingBuffer.AsSpan();
var done = HPackHeaderWriter.BeginEncodeHeaders(headers, buffer, out var length);
frame.PayloadLength = length;
if (done)
{
frame.HeadersFlags = Http2HeadersFrameFlags.END_HEADERS;
}
if (endStream)
{
frame.HeadersFlags |= Http2HeadersFrameFlags.END_STREAM;
}
Http2FrameWriter.WriteHeader(frame, writer);
writer.Write(buffer.Slice(0, length));
while (!done)
{
frame.PrepareContinuation(Http2ContinuationFrameFlags.NONE, streamId);
done = HPackHeaderWriter.ContinueEncodeHeaders(headers, buffer, out length);
frame.PayloadLength = length;
if (done)
{
frame.ContinuationFlags = Http2ContinuationFrameFlags.END_HEADERS;
}
Http2FrameWriter.WriteHeader(frame, writer);
writer.Write(buffer.Slice(0, length));
}
}
public static void WriteStartStream(this PipeWriter writer, int streamId, Span<byte> headerData, bool endStream)
{
var frame = new Http2Frame();
frame.PrepareHeaders(Http2HeadersFrameFlags.NONE, streamId);
frame.PayloadLength = headerData.Length;
frame.HeadersFlags = Http2HeadersFrameFlags.END_HEADERS;
if (endStream)
{
frame.HeadersFlags |= Http2HeadersFrameFlags.END_STREAM;
}
Http2FrameWriter.WriteHeader(frame, writer);
writer.Write(headerData);
}
public static void WriteData(this PipeWriter writer, int streamId, Memory<byte> data, bool endStream)
{
var frame = new Http2Frame();
frame.PrepareData(streamId);
frame.PayloadLength = data.Length;
frame.DataFlags = endStream ? Http2DataFrameFlags.END_STREAM : Http2DataFrameFlags.NONE;
Http2FrameWriter.WriteHeader(frame, writer);
writer.Write(data.Span);
}
}
}

View File

@ -100,7 +100,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[ConditionalTheory]
[MemberData(nameof(IPEndPointRegistrationDataDynamicPort))]
[IPv6SupportedCondition]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2074", FlakyOn.AzP.macOS)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2074")]
public async Task RegisterIPEndPoint_DynamicPort_Success(IPEndPoint endPoint, string testUrl)
{
await RegisterIPEndPoint_Success(endPoint, testUrl);
@ -109,7 +109,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[ConditionalTheory]
[MemberData(nameof(IPEndPointRegistrationDataPort443))]
[IPv6SupportedCondition]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2711", FlakyOn.AzP.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2711")]
public async Task RegisterIPEndPoint_Port443_Success(IPEndPoint endpoint, string testUrl)
{
if (!CanBindToEndpoint(endpoint.Address, 443))
@ -131,7 +131,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[ConditionalTheory]
[MemberData(nameof(AddressRegistrationDataIPv6Port5000Default))]
[IPv6SupportedCondition]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2711", FlakyOn.AzP.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2711")]
public async Task RegisterAddresses_IPv6Port5000Default_Success(string addressInput, string[] testUrls)
{
if (!CanBindToEndpoint(IPAddress.Loopback, 5000) || !CanBindToEndpoint(IPAddress.IPv6Loopback, 5000))
@ -145,7 +145,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
[ConditionalTheory]
[MemberData(nameof(AddressRegistrationDataIPv6Port80))]
[IPv6SupportedCondition]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2711", FlakyOn.AzP.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2711")]
public async Task RegisterAddresses_IPv6Port80_Success(string addressInput, string[] testUrls)
{
if (!CanBindToEndpoint(IPAddress.Loopback, 80) || !CanBindToEndpoint(IPAddress.IPv6Loopback, 80))
@ -157,7 +157,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
}
[ConditionalTheory]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2179", FlakyOn.Helix.All)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/2179")]
[MemberData(nameof(AddressRegistrationDataIPv6ScopeId))]
[IPv6SupportedCondition]
[IPv6ScopeIdPresentCondition]
@ -596,7 +596,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
}
[Fact]
[Flaky("https://github.com/dotnet/aspnetcore-internal/issues/2178", FlakyOn.All)]
public async Task DoesNotOverrideDirectConfigurationWithIServerAddressesFeature_IfPreferHostingUrlsFalse()
{
var useUrlsAddress = $"http://127.0.0.1:0";
@ -881,7 +880,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
var exception = Assert.Throws<IOException>(() => host.Start());
var thisAddressString = $"http://{(addressFamily == AddressFamily.InterNetwork ? "127.0.0.1" : "[::1]")}:{port}";
var otherAddressString = $"http://{(addressFamily == AddressFamily.InterNetworkV6? "127.0.0.1" : "[::1]")}:{port}";
var otherAddressString = $"http://{(addressFamily == AddressFamily.InterNetworkV6 ? "127.0.0.1" : "[::1]")}:{port}";
if (exception.Message == CoreStrings.FormatEndpointAlreadyInUse(otherAddressString))
{

View File

@ -14,7 +14,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests
{
public class ConnectionMiddlewareTests : LoggedTest
{
[Flaky("<No longer needed; tracked in Kusto>", FlakyOn.All)]
[Fact]
public async Task ThrowingSynchronousConnectionMiddlewareDoesNotCrashServer()
{

Some files were not shown because too many files have changed in this diff Show More