Merge pull request #18151 from dotnet/johluo/feb-branding

Update branding to 3.1.2
This commit is contained in:
John Luo 2020-01-15 10:46:39 -08:00 committed by GitHub
commit 36e79022be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 1914 additions and 741 deletions

View File

@ -38,6 +38,19 @@ variables:
value: ''
- name: _SignType
value: ''
- name: _InternalRuntimeDownloadArgs
value: ''
- name: _InternalRuntimeDownloadCodeSignArgs
value: ''
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- group: DotNet-MSRC-Storage
- name: _InternalRuntimeDownloadArgs
value: -DotNetRuntimeSourceFeed https://dotnetclimsrc.blob.core.windows.net/dotnet -DotNetRuntimeSourceFeedKey $(dotnetclimsrc-read-sas-token-base64) /p:DotNetAssetRootAccessTokenSuffix='$(dotnetclimsrc-read-sas-token-base64)'
# The code signing doesn't use the aspnet build scripts, so the msbuild parameers have
# to be passed directly. This is awkward, since we pass the same info above, but we have
# to have it in two different forms
- name: _InternalRuntimeDownloadCodeSignArgs
value: /p:DotNetRuntimeSourceFeed=https://dotnetclimsrc.blob.core.windows.net/dotnet /p:DotNetRuntimeSourceFeedKey=$(dotnetclimsrc-read-sas-token-base64)
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- ${{ if ne(variables['Build.Reason'], 'PullRequest') }}:
# DotNet-Blob-Feed provides: dotnetfeed-storage-access-key-1
@ -81,7 +94,15 @@ stages:
jobDisplayName: Code check
agentOs: Windows
steps:
- powershell: ./eng/scripts/CodeCheck.ps1 -ci
- ${{ if ne(variables['System.TeamProject'], 'public') }}:
- task: PowerShell@2
displayName: Setup Private Feeds Credentials
inputs:
filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1
arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config -Password $Env:Token
env:
Token: $(dn-bot-dnceng-artifact-feeds-rw)
- powershell: ./eng/scripts/CodeCheck.ps1 -ci $(_InternalRuntimeDownloadArgs)
displayName: Run eng/scripts/CodeCheck.ps1
artifacts:
- name: Code_Check_Logs
@ -108,6 +129,14 @@ stages:
# This is intentional to workaround https://github.com/dotnet/arcade/issues/1957 which always re-submits for code-signing, even
# if they have already been signed. This results in slower builds due to re-submitting the same .nupkg many times for signing.
# The sign settings have been configured to
- ${{ if ne(variables['System.TeamProject'], 'public') }}:
- task: PowerShell@2
displayName: Setup Private Feeds Credentials
inputs:
filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1
arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config -Password $Env:Token
env:
Token: $(dn-bot-dnceng-artifact-feeds-rw)
- script: ./build.cmd
-ci
@ -117,6 +146,7 @@ stages:
-buildNative
/bl:artifacts/log/build.x64.binlog
$(_BuildArgs)
$(_InternalRuntimeDownloadArgs)
displayName: Build x64
# Build the x86 shared framework
@ -132,6 +162,7 @@ stages:
/p:OnlyPackPlatformSpecificPackages=true
/bl:artifacts/log/build.x86.binlog
$(_BuildArgs)
$(_InternalRuntimeDownloadArgs)
displayName: Build x86
# This is in a separate build step with -forceCoreMsbuild to workaround MAX_PATH limitations - https://github.com/Microsoft/msbuild/issues/53
@ -140,6 +171,7 @@ stages:
-pack
-noBuildDeps
$(_BuildArgs)
$(_InternalRuntimeDownloadArgs)
displayName: Build SiteExtension
# This runs code-signing on all packages, zips, and jar files as defined in build/CodeSign.targets. If https://github.com/dotnet/arcade/issues/1957 is resolved,
@ -165,6 +197,7 @@ stages:
/p:AssetManifestFileName=aspnetcore-win-x64-x86.xml
$(_BuildArgs)
$(_PublishArgs)
$(_InternalRuntimeDownloadArgs)
/p:PublishInstallerBaseVersion=true
displayName: Build Installers
@ -205,6 +238,7 @@ stages:
/p:AssetManifestFileName=aspnetcore-win-arm.xml
$(_BuildArgs)
$(_PublishArgs)
$(_InternalRuntimeDownloadArgs)
installNodeJs: false
installJdk: false
artifacts:
@ -231,6 +265,7 @@ stages:
-p:AssetManifestFileName=aspnetcore-MacOS_x64.xml
$(_BuildArgs)
$(_PublishArgs)
$(_InternalRuntimeDownloadArgs)
installNodeJs: false
installJdk: false
artifacts:
@ -251,6 +286,14 @@ stages:
jobDisplayName: "Build: Linux x64"
agentOs: Linux
steps:
- ${{ if ne(variables['System.TeamProject'], 'public') }}:
- task: Bash@3
displayName: Setup Private Feeds Credentials
inputs:
filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh
arguments: $(Build.SourcesDirectory)/NuGet.config $Token
env:
Token: $(dn-bot-dnceng-artifact-feeds-rw)
- script: ./build.sh
--ci
--arch x64
@ -261,6 +304,7 @@ stages:
-p:OnlyPackPlatformSpecificPackages=true
-bl:artifacts/log/build.linux-x64.binlog
$(_BuildArgs)
$(_InternalRuntimeDownloadArgs)
displayName: Run build.sh
- script: |
git clean -xfd src/**/obj/
@ -274,7 +318,8 @@ stages:
-p:BuildRuntimeArchive=false \
-p:LinuxInstallerType=deb \
-bl:artifacts/log/build.deb.binlog \
$(_BuildArgs)
$(_BuildArgs) \
$(_InternalRuntimeDownloadArgs)
displayName: Build Debian installers
- script: |
git clean -xfd src/**/obj/
@ -290,7 +335,8 @@ stages:
-bl:artifacts/log/build.rpm.binlog \
-p:AssetManifestFileName=aspnetcore-Linux_x64.xml \
$(_BuildArgs) \
$(_PublishArgs)
$(_PublishArgs) \
$(_InternalRuntimeDownloadArgs)
displayName: Build RPM installers
installNodeJs: false
installJdk: false
@ -322,6 +368,7 @@ stages:
-p:AssetManifestFileName=aspnetcore-Linux_arm.xml
$(_BuildArgs)
$(_PublishArgs)
$(_InternalRuntimeDownloadArgs)
installNodeJs: false
installJdk: false
artifacts:
@ -352,6 +399,7 @@ stages:
-p:AssetManifestFileName=aspnetcore-Linux_arm64.xml
$(_BuildArgs)
$(_PublishArgs)
$(_InternalRuntimeDownloadArgs)
installNodeJs: false
installJdk: false
artifacts:
@ -385,6 +433,7 @@ stages:
-p:AssetManifestFileName=aspnetcore-Linux_musl_x64.xml
$(_BuildArgs)
$(_PublishArgs)
$(_InternalRuntimeDownloadArgs)
installNodeJs: false
installJdk: false
artifacts:
@ -418,6 +467,7 @@ stages:
-p:AssetManifestFileName=aspnetcore-Linux_musl_arm64.xml
$(_BuildArgs)
$(_PublishArgs)
$(_InternalRuntimeDownloadArgs)
installNodeJs: false
installJdk: false
artifacts:
@ -439,7 +489,7 @@ stages:
jobDisplayName: "Test: Windows Server 2016 x64"
agentOs: Windows
isTestingJob: true
buildArgs: -all -pack -test -BuildNative "/p:SkipIISNewHandlerTests=true /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISNewShimTests=true /p:RunTemplateTests=false"
buildArgs: -all -pack -test -BuildNative "/p:SkipIISNewHandlerTests=true /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISNewShimTests=true /p:RunTemplateTests=false" $(_InternalRuntimeDownloadArgs)
beforeBuild:
- powershell: "& ./src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/Servers/IIS/tools/update_schema.ps1"
displayName: Setup IISExpress test certificates and schema
@ -475,7 +525,15 @@ stages:
agentOs: Windows
isTestingJob: true
steps:
- script: ./build.cmd -ci -all -pack
- ${{ if ne(variables['System.TeamProject'], 'public') }}:
- task: PowerShell@2
displayName: Setup Private Feeds Credentials
inputs:
filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1
arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config -Password $Env:Token
env:
Token: $(dn-bot-dnceng-artifact-feeds-rw)
- script: ./build.cmd -ci -all -pack $(_InternalRuntimeDownloadArgs)
displayName: Build Repo
- script: ./src/ProjectTemplates/build.cmd -ci -pack -NoRestore -NoBuilddeps "/p:RunTemplateTests=true /bl:artifacts/log/template.pack.binlog"
displayName: Pack Templates
@ -502,7 +560,7 @@ stages:
jobDisplayName: "Test: macOS 10.13"
agentOs: macOS
isTestingJob: true
buildArgs: --all --test "/p:RunTemplateTests=false"
buildArgs: --all --test "/p:RunTemplateTests=false" $(_InternalRuntimeDownloadArgs)
beforeBuild:
- bash: "./eng/scripts/install-nginx-mac.sh"
displayName: Installing Nginx
@ -537,7 +595,7 @@ stages:
jobDisplayName: "Test: Ubuntu 16.04 x64"
agentOs: Linux
isTestingJob: true
buildArgs: --all --test "/p:RunTemplateTests=false"
buildArgs: --all --test "/p:RunTemplateTests=false" $(_InternalRuntimeDownloadArgs)
beforeBuild:
- bash: "./eng/scripts/install-nginx-linux.sh"
displayName: Installing Nginx
@ -584,6 +642,25 @@ stages:
chmod +x $HOME/bin/jq
echo "##vso[task.prependpath]$HOME/bin"
displayName: Install jq
- task: UseDotNet@2
displayName: 'Use .NET Core sdk'
inputs:
packageType: sdk
# The SDK version selected here is intentionally supposed to use the latest release
# For the purpose of building Linux distros, we can't depend on features of the SDK
# which may not exist in pre-built versions of the SDK
# Pinning to preview 8 since preview 9 has breaking changes
version: 3.1.100
installationPath: $(DotNetCoreSdkDir)
includePreviewVersions: true
- ${{ if ne(variables['System.TeamProject'], 'public') }}:
- task: Bash@3
displayName: Setup Private Feeds Credentials
inputs:
filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh
arguments: $(Build.SourcesDirectory)/NuGet.config $Token
env:
Token: $(dn-bot-dnceng-artifact-feeds-rw)
- script: ./eng/scripts/ci-source-build.sh --ci --configuration Release /p:BuildManaged=true /p:BuildNodeJs=false
displayName: Run ci-source-build.sh
- task: PublishBuildArtifacts@1

View File

@ -28,6 +28,14 @@ jobs:
contents: '**/*.nupkg'
targetFolder: $(Build.SourcesDirectory)/artifacts/packages/$(BuildConfiguration)/shipping/
flattenFolders: true
- ${{ if ne(variables['System.TeamProject'], 'public') }}:
- task: PowerShell@2
displayName: Setup Private Feeds Credentials
inputs:
filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1
arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config -Password $Env:Token
env:
Token: $(dn-bot-dnceng-artifact-feeds-rw)
- powershell: .\eng\common\build.ps1
-ci
-restore
@ -39,6 +47,7 @@ jobs:
/p:DotNetSignType=$(_SignType)
$(_BuildArgs)
$(_PublishArgs)
$(_InternalRuntimeDownloadCodeSignArgs)
displayName: Sign and publish packages
artifacts:
- name: CodeSign_Xplat_${{ parameters.inputName }}_Logs

View File

@ -161,6 +161,24 @@ jobs:
- ${{ if ne(parameters.steps, '')}}:
- ${{ parameters.steps }}
- ${{ if eq(parameters.steps, '')}}:
- ${{ if ne(variables['System.TeamProject'], 'public') }}:
- ${{ if eq(parameters.agentOs, 'Windows') }}:
- ${{ if ne(variables['System.TeamProject'], 'public') }}:
- task: PowerShell@2
displayName: Setup Private Feeds Credentials
inputs:
filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1
arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config -Password $Env:Token
env:
Token: $(dn-bot-dnceng-artifact-feeds-rw)
- ${{ if ne(parameters.agentOs, 'Windows') }}:
- task: Bash@3
displayName: Setup Private Feeds Credentials
inputs:
filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh
arguments: $(Build.SourcesDirectory)/NuGet.config $Token
env:
Token: $(dn-bot-dnceng-artifact-feeds-rw)
- ${{ if eq(parameters.buildScript, '') }}:
- ${{ if eq(parameters.agentOs, 'Windows') }}:
- script: .\$(BuildDirectory)\build.cmd -ci /p:DotNetSignType=$(_SignType) -Configuration $(BuildConfiguration) $(BuildScriptArgs)

View File

@ -84,8 +84,8 @@
<RuntimeInstallerBaseName>aspnetcore-runtime</RuntimeInstallerBaseName>
<TargetingPackInstallerBaseName>aspnetcore-targeting-pack</TargetingPackInstallerBaseName>
<!-- Produce targeting pack installers/packages once per major.minor except in extraordinary cases i.e. 3.0.1. -->
<!-- We can remove the 3.0.1 line from any branch other than release/3.0 and from here after 3.0.1 is released. -->
<!-- Produce targeting pack installers/packages once per major.minor except in extraordinary cases i.e. 3.1.2. -->
<!-- We can remove the 3.1.2 line from any branch other than release/3.1 and from here after 3.1.2 is released. -->
<IsTargetingPackBuilding Condition=" '$(DotNetBuildFromSource)' == 'true' ">false</IsTargetingPackBuilding>
<IsTargetingPackBuilding
Condition=" '$(IsTargetingPackBuilding)' == '' AND '$(VersionPrefix)' == '3.0.1' ">true</IsTargetingPackBuilding>

View File

@ -77,6 +77,12 @@ MSBuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]
.PARAMETER MSBuildArguments
Additional MSBuild arguments to be passed through.
.PARAMETER DotNetRuntimeSourceFeed
Additional feed that can be used when downloading .NET runtimes
.PARAMETER DotNetRuntimeSourceFeedKey
Key for feed that can be used when downloading .NET runtimes
.EXAMPLE
Building both native and managed projects.
@ -151,6 +157,11 @@ param(
# Other lifecycle targets
[switch]$Help, # Show help
# Optional arguments that enable downloading an internal
# runtime or runtime from a non-default location
[string]$DotNetRuntimeSourceFeed,
[string]$DotNetRuntimeSourceFeedKey,
# Capture the rest
[Parameter(ValueFromRemainingArguments = $true)]
@ -251,6 +262,16 @@ if (-not $Configuration) {
}
$MSBuildArguments += "/p:Configuration=$Configuration"
[string[]]$ToolsetBuildArguments = @()
if ($DotNetRuntimeSourceFeed -or $DotNetRuntimeSourceFeedKey) {
$runtimeFeedArg = "/p:DotNetRuntimeSourceFeed=$DotNetRuntimeSourceFeed"
$runtimeFeedKeyArg = "/p:DotNetRuntimeSourceFeedKey=$DotNetRuntimeSourceFeedKey"
$MSBuildArguments += $runtimeFeedArg
$MSBuildArguments += $runtimeFeedKeyArg
$ToolsetBuildArguments += $runtimeFeedArg
$ToolsetBuildArguments += $runtimeFeedKeyArg
}
$foundJdk = $false
$javac = Get-Command javac -ErrorAction Ignore -CommandType Application
$localJdkPath = "$PSScriptRoot\.tools\jdk\win-x64\"
@ -375,7 +396,8 @@ try {
/p:Configuration=Release `
/p:Restore=$RunRestore `
/p:Build=true `
/clp:NoSummary
/clp:NoSummary `
@ToolsetBuildArguments
}
MSBuild $toolsetBuildProj `

View File

@ -29,6 +29,8 @@ build_installers=''
build_projects=''
target_arch='x64'
configuration=''
dotnet_runtime_source_feed=''
dotnet_runtime_source_feed_key=''
if [ "$(uname)" = "Darwin" ]; then
target_os_name='osx'
@ -45,33 +47,36 @@ __usage() {
echo "Usage: $(basename "${BASH_SOURCE[0]}") [options] [[--] <Arguments>...]
Arguments:
<Arguments>... Arguments passed to the command. Variable number of arguments allowed.
<Arguments>... Arguments passed to the command. Variable number of arguments allowed.
Options:
--configuration|-c The build configuration (Debug, Release). Default=Debug
--arch The CPU architecture to build for (x64, arm, arm64). Default=$target_arch
--os-name The base runtime identifier to build for (linux, osx, linux-musl). Default=$target_os_name
--configuration|-c The build configuration (Debug, Release). Default=Debug
--arch The CPU architecture to build for (x64, arm, arm64). Default=$target_arch
--os-name The base runtime identifier to build for (linux, osx, linux-musl). Default=$target_os_name
--[no-]restore Run restore.
--[no-]build Compile projects. (Implies --no-restore)
--[no-]pack Produce packages.
--[no-]test Run tests.
--[no-]restore Run restore.
--[no-]build Compile projects. (Implies --no-restore)
--[no-]pack Produce packages.
--[no-]test Run tests.
--projects A list of projects to build. (Must be an absolute path.)
Globbing patterns are supported, such as \"$(pwd)/**/*.csproj\".
--no-build-deps Do not build project-to-project references and only build the specified project.
--no-build-repo-tasks Suppress building RepoTasks.
--projects A list of projects to build. (Must be an absolute path.)
Globbing patterns are supported, such as \"$(pwd)/**/*.csproj\".
--no-build-deps Do not build project-to-project references and only build the specified project.
--no-build-repo-tasks Suppress building RepoTasks.
--all Build all project types.
--[no-]build-native Build native projects (C, C++).
--[no-]build-managed Build managed projects (C#, F#, VB).
--[no-]build-nodejs Build NodeJS projects (TypeScript, JS).
--[no-]build-java Build Java projects.
--[no-]build-installers Build Java projects.
--all Build all project types.
--[no-]build-native Build native projects (C, C++).
--[no-]build-managed Build managed projects (C#, F#, VB).
--[no-]build-nodejs Build NodeJS projects (TypeScript, JS).
--[no-]build-java Build Java projects.
--[no-]build-installers Build Java projects.
--ci Apply CI specific settings and environment variables.
--binarylog|-bl Use a binary logger
--verbosity|-v MSBuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]
--ci Apply CI specific settings and environment variables.
--binarylog|-bl Use a binary logger
--verbosity|-v MSBuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]
--dotnet-runtime-source-feed Additional feed that can be used when downloading .NET runtimes
--dotnet-runtime-source-feed-key Key for feed that can be used when downloading .NET runtimes
Description:
This build script installs required tools and runs an MSBuild command on this repository
@ -188,16 +193,26 @@ while [[ $# -gt 0 ]]; do
-no-build-repo-tasks|-nobuildrepotasks)
build_repo_tasks=false
;;
-arch)
shift
target_arch="${1:-}"
[ -z "$target_arch" ] && __error "Missing value for parameter --arch" && __usage
;;
-ci)
ci=true
;;
-binarylog|-bl)
use_default_binary_log=true
;;
-verbosity|-v)
-dotnet-runtime-source-feed|-dotnetruntimesourcefeed)
shift
[ -z "${1:-}" ] && __error "Missing value for parameter --verbosity" && __usage
verbosity="${1:-}"
[ -z "${1:-}" ] && __error "Missing value for parameter --dotnet-runtime-source-feed" && __usage
dotnet_runtime_source_feed="${1:-}"
;;
-dotnet-runtime-source-feed-key|-dotnetruntimesourcefeedkey)
shift
[ -z "${1:-}" ] && __error "Missing value for parameter --dotnet-runtime-source-feed-key" && __usage
dotnet_runtime_source_feed_key="${1:-}"
;;
*)
msbuild_args[${#msbuild_args[*]}]="$1"
@ -270,6 +285,17 @@ msbuild_args[${#msbuild_args[*]}]="-p:Configuration=$configuration"
echo "Setting msbuild verbosity to $verbosity"
msbuild_args[${#msbuild_args[*]}]="-verbosity:$verbosity"
# Set up additional runtime args
toolset_build_args=()
if [ ! -z "$dotnet_runtime_source_feed" ] || [ ! -z "$dotnet_runtime_source_feed_key" ]; then
runtimeFeedArg="/p:DotNetRuntimeSourceFeed=$dotnet_runtime_source_feed"
runtimeFeedKeyArg="/p:DotNetRuntimeSourceFeedKey=$dotnet_runtime_source_feed_key"
msbuild_args[${#msbuild_args[*]}]=$runtimeFeedArg
msbuild_args[${#msbuild_args[*]}]=$runtimeFeedKeyArg
toolset_build_args[${#toolset_build_args[*]}]=$runtimeFeedArg
toolset_build_args[${#toolset_build_args[*]}]=$runtimeFeedKeyArg
fi
# Initialize global variables need to be set before the import of Arcade is imported
restore=$run_restore
@ -325,7 +351,8 @@ if [ "$build_repo_tasks" = true ]; then
-p:Configuration=Release \
-p:Restore=$run_restore \
-p:Build=true \
-clp:NoSummary
-clp:NoSummary \
${toolset_build_args[@]+"${toolset_build_args[@]}"}
fi
# This incantation avoids unbound variable issues if msbuild_args is empty

View File

@ -2,106 +2,106 @@
<Project>
<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
<AspNetCoreBaselineVersion>3.1.0</AspNetCoreBaselineVersion>
<AspNetCoreBaselineVersion>3.1.1</AspNetCoreBaselineVersion>
</PropertyGroup>
<!-- Package: AspNetCoreRuntime.3.0.x64-->
<PropertyGroup Condition=" '$(PackageId)' == 'AspNetCoreRuntime.3.0.x64' ">
<BaselinePackageVersion>3.0.0</BaselinePackageVersion>
<BaselinePackageVersion>3.0.2</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'AspNetCoreRuntime.3.0.x64' AND '$(TargetFramework)' == 'net461' " />
<!-- Package: AspNetCoreRuntime.3.0.x86-->
<PropertyGroup Condition=" '$(PackageId)' == 'AspNetCoreRuntime.3.0.x86' ">
<BaselinePackageVersion>3.0.0</BaselinePackageVersion>
<BaselinePackageVersion>3.0.2</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'AspNetCoreRuntime.3.0.x86' AND '$(TargetFramework)' == 'net461' " />
<!-- Package: dotnet-sql-cache-->
<PropertyGroup Condition=" '$(PackageId)' == 'dotnet-sql-cache' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<!-- Package: Microsoft.AspNetCore.ApiAuthorization.IdentityServer-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.ApiAuthorization.IdentityServer' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.ApiAuthorization.IdentityServer' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="[3.1.1, )" />
<BaselinePackageReference Include="IdentityServer4" Version="[3.0.0, )" />
<BaselinePackageReference Include="IdentityServer4.AspNetIdentity" Version="[3.0.0, )" />
<BaselinePackageReference Include="IdentityServer4.EntityFramework" Version="[3.0.0, )" />
<BaselinePackageReference Include="IdentityServer4.EntityFramework.Storage" Version="[3.0.0, )" />
<BaselinePackageReference Include="IdentityServer4.Storage" Version="[3.0.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Http" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Http" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.App.Runtime.win-x64-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.App.Runtime.win-x64' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<!-- Package: Microsoft.AspNetCore.Authentication.AzureAD.UI-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.AzureAD.UI' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.AzureAD.UI' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Authentication.AzureADB2C.UI-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.AzureADB2C.UI' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.AzureADB2C.UI' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Authentication.Certificate-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.Certificate' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.Certificate' AND '$(TargetFramework)' == 'netcoreapp3.1' " />
<!-- Package: Microsoft.AspNetCore.Authentication.Facebook-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.Facebook' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.Facebook' AND '$(TargetFramework)' == 'netcoreapp3.1' " />
<!-- Package: Microsoft.AspNetCore.Authentication.Google-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.Google' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.Google' AND '$(TargetFramework)' == 'netcoreapp3.1' " />
<!-- Package: Microsoft.AspNetCore.Authentication.JwtBearer-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.JwtBearer' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.JwtBearer' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="[5.5.0, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Authentication.MicrosoftAccount-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.MicrosoftAccount' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.MicrosoftAccount' AND '$(TargetFramework)' == 'netcoreapp3.1' " />
<!-- Package: Microsoft.AspNetCore.Authentication.Negotiate-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.Negotiate' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.Negotiate' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Authentication.OpenIdConnect-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.OpenIdConnect' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.OpenIdConnect' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="[5.5.0, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Authentication.Twitter-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.Twitter' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.Twitter' AND '$(TargetFramework)' == 'netcoreapp3.1' " />
<!-- Package: Microsoft.AspNetCore.Authentication.WsFederation-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.WsFederation' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authentication.WsFederation' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.IdentityModel.Protocols.WsFederation" Version="[5.5.0, )" />
@ -109,39 +109,39 @@
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Authorization-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authorization' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authorization' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Metadata" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Metadata" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.1, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Authorization' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Metadata" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Metadata" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.AzureAppServices.HostingStartup-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.AzureAppServices.HostingStartup' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.AzureAppServices.HostingStartup' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.AzureAppServicesIntegration" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.AzureAppServicesIntegration" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.AzureAppServices.SiteExtension-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.AzureAppServices.SiteExtension' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.AzureAppServices.SiteExtension' AND '$(TargetFramework)' == 'net461' ">
<BaselinePackageReference Include="Microsoft.Web.Xdt.Extensions" Version="[3.1.0-rtm.19566.1, )" />
<BaselinePackageReference Include="Microsoft.Web.Xdt.Extensions" Version="[3.1.1-servicing.19615.10, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.AzureAppServicesIntegration-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.AzureAppServicesIntegration' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.AzureAppServicesIntegration' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.Extensions.Logging.AzureAppServices" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.AzureAppServices" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Blazor-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Blazor' ">
@ -186,273 +186,273 @@
</PropertyGroup>
<!-- Package: Microsoft.AspNetCore.Components-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Components' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Components' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Components.Analyzers" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authorization" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.JSInterop" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Components.Analyzers" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authorization" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.JSInterop" Version="[3.1.1, )" />
<BaselinePackageReference Include="System.ComponentModel.Annotations" Version="[4.7.0, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Components' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Components.Analyzers" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authorization" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.JSInterop" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Components.Analyzers" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authorization" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.JSInterop" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Components.Analyzers-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Components.Analyzers' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<!-- Package: Microsoft.AspNetCore.Components.Authorization-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Components.Authorization' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Components.Authorization' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Components" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authorization" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Components" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authorization" Version="[3.1.1, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Components.Authorization' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Components" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authorization" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Components" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Authorization" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Components.Forms-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Components.Forms' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Components.Forms' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Components" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Components" Version="[3.1.1, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Components.Forms' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Components" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Components" Version="[3.1.1, )" />
<BaselinePackageReference Include="System.ComponentModel.Annotations" Version="[4.7.0, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Components.Web-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Components.Web' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Components.Web' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Components" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Components.Forms" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.JSInterop" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Components" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Components.Forms" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.JSInterop" Version="[3.1.1, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Components.Web' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Components" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Components.Forms" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.JSInterop" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Components" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Components.Forms" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.JSInterop" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.ConcurrencyLimiter-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.ConcurrencyLimiter' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.ConcurrencyLimiter' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Connections.Abstractions-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Connections.Abstractions' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Connections.Abstractions' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Http.Features" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Http.Features" Version="[3.1.1, )" />
<BaselinePackageReference Include="System.IO.Pipelines" Version="[4.7.0, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Connections.Abstractions' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Http.Features" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Http.Features" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="[1.1.0, )" />
<BaselinePackageReference Include="System.IO.Pipelines" Version="[4.7.0, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Connections.Abstractions' AND '$(TargetFramework)' == 'netstandard2.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Http.Features" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Http.Features" Version="[3.1.1, )" />
<BaselinePackageReference Include="System.IO.Pipelines" Version="[4.7.0, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Cryptography.Internal-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Cryptography.Internal' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Cryptography.Internal' AND '$(TargetFramework)' == 'netstandard2.0' " />
<!-- Package: Microsoft.AspNetCore.Cryptography.KeyDerivation-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Cryptography.KeyDerivation' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Cryptography.KeyDerivation' AND '$(TargetFramework)' == 'netcoreapp2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Cryptography.Internal" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Cryptography.Internal" Version="[3.1.1, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Cryptography.KeyDerivation' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Cryptography.Internal" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Cryptography.Internal" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.DataProtection-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Cryptography.Internal" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Cryptography.Internal" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Win32.Registry" Version="[4.7.0, )" />
<BaselinePackageReference Include="System.Security.Cryptography.Xml" Version="[4.7.0, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Cryptography.Internal" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Cryptography.Internal" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Win32.Registry" Version="[4.7.0, )" />
<BaselinePackageReference Include="System.Security.Cryptography.Xml" Version="[4.7.0, )" />
<BaselinePackageReference Include="System.Security.Principal.Windows" Version="[4.7.0, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.DataProtection.Abstractions-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection.Abstractions' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection.Abstractions' AND '$(TargetFramework)' == 'netstandard2.0' " />
<!-- Package: Microsoft.AspNetCore.DataProtection.AzureKeyVault-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection.AzureKeyVault' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection.AzureKeyVault' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Azure.KeyVault" Version="[2.3.2, )" />
<BaselinePackageReference Include="Microsoft.IdentityModel.Clients.ActiveDirectory" Version="[3.19.8, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.DataProtection.AzureStorage-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection.AzureStorage' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection.AzureStorage' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Azure.Storage.Blob" Version="[10.0.1, )" />
<BaselinePackageReference Include="Microsoft.Data.OData" Version="[5.8.4, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.DataProtection.EntityFrameworkCore-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection.EntityFrameworkCore' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection.EntityFrameworkCore' AND '$(TargetFramework)' == 'netstandard2.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.EntityFrameworkCore" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.EntityFrameworkCore" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.DataProtection.Extensions-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection.Extensions' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection.Extensions' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.1, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection.Extensions' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.DataProtection.StackExchangeRedis-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection.StackExchangeRedis' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.DataProtection.StackExchangeRedis' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.DataProtection" Version="[3.1.1, )" />
<BaselinePackageReference Include="StackExchange.Redis" Version="[2.0.593, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.HeaderPropagation-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.HeaderPropagation' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.HeaderPropagation' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Http" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Http" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Hosting.WindowsServices-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Hosting.WindowsServices' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Hosting.WindowsServices' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="System.ServiceProcess.ServiceController" Version="[4.7.0, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Http.Connections.Client-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Http.Connections.Client' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Http.Connections.Client' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Http.Connections.Common" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Http.Connections.Common" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.1, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Http.Connections.Client' AND '$(TargetFramework)' == 'netstandard2.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Http.Connections.Common" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Http.Connections.Common" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Http.Connections.Common-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Http.Connections.Common' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Http.Connections.Common' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="[3.1.1, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Http.Connections.Common' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="System.Text.Json" Version="[4.7.0, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Http.Features-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Http.Features' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Http.Features' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.Extensions.Primitives" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Primitives" Version="[3.1.1, )" />
<BaselinePackageReference Include="System.IO.Pipelines" Version="[4.7.0, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Http.Features' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.Extensions.Primitives" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Primitives" Version="[3.1.1, )" />
<BaselinePackageReference Include="System.IO.Pipelines" Version="[4.7.0, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Identity.EntityFrameworkCore-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Identity.EntityFrameworkCore' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Identity.EntityFrameworkCore' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.Extensions.Identity.Stores" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Identity.Stores" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[3.1.1, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Identity.EntityFrameworkCore' AND '$(TargetFramework)' == 'netstandard2.1' ">
<BaselinePackageReference Include="Microsoft.Extensions.Identity.Stores" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Identity.Stores" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Identity.Specification.Tests-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Identity.Specification.Tests' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Identity.Specification.Tests' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Testing" Version="[3.1.0-rtm.19565.4, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Configuration" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Testing" Version="[3.1.1-servicing.19614.4, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Configuration" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.1, )" />
<BaselinePackageReference Include="xunit.assert" Version="[2.4.1, )" />
<BaselinePackageReference Include="xunit.extensibility.core" Version="[2.4.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Identity.UI-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Identity.UI' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Identity.UI' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.Extensions.Identity.Stores" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Identity.Stores" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="[3.1.1, )" />
<BaselinePackageReference Include="Newtonsoft.Json" Version="[12.0.2, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.JsonPatch-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.JsonPatch' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.JsonPatch' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.CSharp" Version="[4.7.0, )" />
@ -460,236 +460,238 @@
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Metadata-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Metadata' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Metadata' AND '$(TargetFramework)' == 'netstandard2.0' " />
<!-- Package: Microsoft.AspNetCore.MiddlewareAnalysis-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.MiddlewareAnalysis' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.MiddlewareAnalysis' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Mvc.NewtonsoftJson-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Mvc.NewtonsoftJson' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Mvc.NewtonsoftJson' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="[3.1.1, )" />
<BaselinePackageReference Include="Newtonsoft.Json" Version="[12.0.2, )" />
<BaselinePackageReference Include="Newtonsoft.Json.Bson" Version="[1.0.2, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.CodeAnalysis.Razor" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyModel" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.CodeAnalysis.Razor" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyModel" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Mvc.Testing-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Mvc.Testing' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Mvc.Testing' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.TestHost" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyModel" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Hosting" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.TestHost" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyModel" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Hosting" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.NodeServices-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.NodeServices' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.NodeServices' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Console" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Console" Version="[3.1.1, )" />
<BaselinePackageReference Include="Newtonsoft.Json" Version="[12.0.2, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.Owin-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Owin' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Owin' AND '$(TargetFramework)' == 'netcoreapp3.1' " />
<!-- Package: Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Libuv" Version="[1.10.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.SignalR.Client-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Client' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Client' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Client.Core" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Http.Connections.Client" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Client.Core" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Http.Connections.Client" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.SignalR.Client.Core-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Client.Core' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Client.Core' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.Json" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.Json" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="[1.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.1, )" />
<BaselinePackageReference Include="System.Threading.Channels" Version="[4.7.0, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Client.Core' AND '$(TargetFramework)' == 'netstandard2.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.Json" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.Json" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.DependencyInjection" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.1, )" />
<BaselinePackageReference Include="System.Threading.Channels" Version="[4.7.0, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.SignalR.Common-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Common' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Common' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.1, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Common' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Connections.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.1, )" />
<BaselinePackageReference Include="System.Text.Json" Version="[4.7.0, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.SignalR.Protocols.Json-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Protocols.Json' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Protocols.Json' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.1, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Protocols.Json' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.SignalR.Protocols.MessagePack-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Protocols.MessagePack' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Protocols.MessagePack' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.1, )" />
<BaselinePackageReference Include="MessagePack" Version="[1.7.3.7, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.1, )" />
<BaselinePackageReference Include="Newtonsoft.Json" Version="[12.0.2, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.SignalR.Specification.Tests-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Specification.Tests' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.Specification.Tests' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.Json" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.Json" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="[3.1.1, )" />
<BaselinePackageReference Include="xunit.assert" Version="[2.4.1, )" />
<BaselinePackageReference Include="xunit.extensibility.core" Version="[2.4.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.SignalR.StackExchangeRedis-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.StackExchangeRedis' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SignalR.StackExchangeRedis' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="MessagePack" Version="[1.7.3.7, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.1, )" />
<BaselinePackageReference Include="StackExchange.Redis" Version="[2.0.593, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.SpaServices-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SpaServices' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SpaServices' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.NodeServices" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.NodeServices" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.SpaServices.Extensions-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SpaServices.Extensions' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.SpaServices.Extensions' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.SpaServices" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.FileProviders.Physical" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.SpaServices" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.FileProviders.Physical" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.AspNetCore.TestHost-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.TestHost' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.TestHost' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="System.IO.Pipelines" Version="[4.7.0, )" />
</ItemGroup>
<!-- Package: Microsoft.dotnet-openapi-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.dotnet-openapi' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<!-- Package: Microsoft.DotNet.Web.Client.ItemTemplates-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.DotNet.Web.Client.ItemTemplates' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<!-- Package: Microsoft.DotNet.Web.ItemTemplates-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.DotNet.Web.ItemTemplates' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<!-- Package: Microsoft.DotNet.Web.ProjectTemplates.3.1-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.DotNet.Web.ProjectTemplates.3.1' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<!-- Package: Microsoft.DotNet.Web.Spa.ProjectTemplates.3.1-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.DotNet.Web.Spa.ProjectTemplates.3.1' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<!-- Package: Microsoft.Extensions.ApiDescription.Client-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.Extensions.ApiDescription.Client' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<!-- Package: Microsoft.Extensions.ApiDescription.Server-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.Extensions.ApiDescription.Server' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<!-- Package: Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore' AND '$(TargetFramework)' == 'netstandard2.1' ">
<BaselinePackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.Extensions.Identity.Core-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.Extensions.Identity.Core' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.Extensions.Identity.Core' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.1, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.Extensions.Identity.Core' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Options" Version="[3.1.1, )" />
</ItemGroup>
<!-- Package: Microsoft.Extensions.Identity.Stores-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.Extensions.Identity.Stores' ">
<BaselinePackageVersion>3.1.0</BaselinePackageVersion>
<BaselinePackageVersion>3.1.1</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.Extensions.Identity.Stores' AND '$(TargetFramework)' == 'netcoreapp3.1' ">
<BaselinePackageReference Include="Microsoft.Extensions.Identity.Core" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Identity.Core" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.1, )" />
</ItemGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.Extensions.Identity.Stores' AND '$(TargetFramework)' == 'netstandard2.0' ">
<BaselinePackageReference Include="Microsoft.Extensions.Identity.Core" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.0, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Identity.Core" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="[3.1.1, )" />
<BaselinePackageReference Include="Microsoft.Extensions.Logging" Version="[3.1.1, )" />
</ItemGroup>
</Project>

View File

@ -4,86 +4,86 @@ This file contains a list of all the packages and their versions which were rele
Update this list when preparing for a new patch.
-->
<Baseline Version="3.1.0">
<Package Id="AspNetCoreRuntime.3.0.x64" Version="3.0.0" />
<Package Id="AspNetCoreRuntime.3.0.x86" Version="3.0.0" />
<Package Id="dotnet-sql-cache" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.ApiAuthorization.IdentityServer" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.App.Runtime.win-x64" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Authentication.Certificate" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Authentication.Facebook" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Authentication.Google" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Authentication.Negotiate" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Authentication.Twitter" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Authentication.WsFederation" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Authorization" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.AzureAppServices.HostingStartup" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.AzureAppServices.SiteExtension" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.AzureAppServicesIntegration" Version="3.1.0" />
<Baseline Version="3.1.1">
<Package Id="AspNetCoreRuntime.3.0.x64" Version="3.0.2" />
<Package Id="AspNetCoreRuntime.3.0.x86" Version="3.0.2" />
<Package Id="dotnet-sql-cache" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.ApiAuthorization.IdentityServer" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.App.Runtime.win-x64" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Authentication.Certificate" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Authentication.Facebook" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Authentication.Google" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Authentication.Negotiate" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Authentication.Twitter" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Authentication.WsFederation" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Authorization" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.AzureAppServices.HostingStartup" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.AzureAppServices.SiteExtension" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.AzureAppServicesIntegration" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Blazor" Version="3.0.0-preview9.19465.2" />
<Package Id="Microsoft.AspNetCore.Blazor.Build" Version="3.0.0-preview9.19465.2" />
<Package Id="Microsoft.AspNetCore.Blazor.DevServer" Version="3.0.0-preview9.19465.2" />
<Package Id="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.0.0-preview9.19465.2" />
<Package Id="Microsoft.AspNetCore.Blazor.Server" Version="3.0.0-preview9.19465.2" />
<Package Id="Microsoft.AspNetCore.Blazor.Templates" Version="3.0.0-preview9.19465.2" />
<Package Id="Microsoft.AspNetCore.Components" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Components.Analyzers" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Components.Authorization" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Components.Forms" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Components.Web" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.ConcurrencyLimiter" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Connections.Abstractions" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Cryptography.Internal" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.DataProtection" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.DataProtection.Abstractions" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.DataProtection.AzureKeyVault" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.DataProtection.AzureStorage" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.DataProtection.EntityFrameworkCore" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.DataProtection.Extensions" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.HeaderPropagation" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Hosting.WindowsServices" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Http.Connections.Client" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Http.Connections.Common" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Http.Features" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Identity.Specification.Tests" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Identity.UI" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.JsonPatch" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Metadata" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.MiddlewareAnalysis" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Mvc.Testing" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.NodeServices" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Owin" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.SignalR.Client" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.SignalR.Client.Core" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.SignalR.Common" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.SignalR.Protocols.Json" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.SignalR.Specification.Tests" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.SpaServices" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.SpaServices.Extensions" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.TestHost" Version="3.1.0" />
<Package Id="Microsoft.dotnet-openapi" Version="3.1.0" />
<Package Id="Microsoft.DotNet.Web.Client.ItemTemplates" Version="3.1.0" />
<Package Id="Microsoft.DotNet.Web.ItemTemplates" Version="3.1.0" />
<Package Id="Microsoft.DotNet.Web.ProjectTemplates.3.1" Version="3.1.0" />
<Package Id="Microsoft.DotNet.Web.Spa.ProjectTemplates.3.1" Version="3.1.0" />
<Package Id="Microsoft.Extensions.ApiDescription.Client" Version="3.1.0" />
<Package Id="Microsoft.Extensions.ApiDescription.Server" Version="3.1.0" />
<Package Id="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="3.1.0" />
<Package Id="Microsoft.Extensions.Identity.Core" Version="3.1.0" />
<Package Id="Microsoft.Extensions.Identity.Stores" Version="3.1.0" />
<Package Id="Microsoft.AspNetCore.Components" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Components.Analyzers" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Components.Authorization" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Components.Forms" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Components.Web" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.ConcurrencyLimiter" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Connections.Abstractions" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Cryptography.Internal" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.DataProtection" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.DataProtection.Abstractions" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.DataProtection.AzureKeyVault" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.DataProtection.AzureStorage" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.DataProtection.EntityFrameworkCore" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.DataProtection.Extensions" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.HeaderPropagation" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Hosting.WindowsServices" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Http.Connections.Client" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Http.Connections.Common" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Http.Features" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Identity.Specification.Tests" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Identity.UI" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.JsonPatch" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Metadata" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.MiddlewareAnalysis" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Mvc.Testing" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.NodeServices" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Owin" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.SignalR.Client" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.SignalR.Client.Core" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.SignalR.Common" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.SignalR.Protocols.Json" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.SignalR.Specification.Tests" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.SpaServices" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.SpaServices.Extensions" Version="3.1.1" />
<Package Id="Microsoft.AspNetCore.TestHost" Version="3.1.1" />
<Package Id="Microsoft.dotnet-openapi" Version="3.1.1" />
<Package Id="Microsoft.DotNet.Web.Client.ItemTemplates" Version="3.1.1" />
<Package Id="Microsoft.DotNet.Web.ItemTemplates" Version="3.1.1" />
<Package Id="Microsoft.DotNet.Web.ProjectTemplates.3.1" Version="3.1.1" />
<Package Id="Microsoft.DotNet.Web.Spa.ProjectTemplates.3.1" Version="3.1.1" />
<Package Id="Microsoft.Extensions.ApiDescription.Client" Version="3.1.1" />
<Package Id="Microsoft.Extensions.ApiDescription.Server" Version="3.1.1" />
<Package Id="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="3.1.1" />
<Package Id="Microsoft.Extensions.Identity.Core" Version="3.1.1" />
<Package Id="Microsoft.Extensions.Identity.Stores" Version="3.1.1" />
</Baseline>

View File

@ -13,281 +13,281 @@
<Uri>https://github.com/aspnet/Blazor</Uri>
<Sha>7868699de745fd30a654c798a99dc541b77b95c0</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="3.1.1-servicing.19605.6">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>9cf15bed711983d35362d62972ab87ccc88ba8ca</Sha>
<Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="3.1.1">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-AspNetCore-Tooling</Uri>
<Sha>07f16c89db55ab6f9f773cc3db6eb5a52908065e</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="3.1.1-servicing.19605.6">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>9cf15bed711983d35362d62972ab87ccc88ba8ca</Sha>
<Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="3.1.1">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-AspNetCore-Tooling</Uri>
<Sha>07f16c89db55ab6f9f773cc3db6eb5a52908065e</Sha>
</Dependency>
<Dependency Name="Microsoft.CodeAnalysis.Razor" Version="3.1.1-servicing.19605.6">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>9cf15bed711983d35362d62972ab87ccc88ba8ca</Sha>
<Dependency Name="Microsoft.CodeAnalysis.Razor" Version="3.1.1">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-AspNetCore-Tooling</Uri>
<Sha>07f16c89db55ab6f9f773cc3db6eb5a52908065e</Sha>
</Dependency>
<Dependency Name="Microsoft.NET.Sdk.Razor" Version="3.1.1-servicing.19605.6">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>9cf15bed711983d35362d62972ab87ccc88ba8ca</Sha>
<Dependency Name="Microsoft.NET.Sdk.Razor" Version="3.1.1">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-AspNetCore-Tooling</Uri>
<Sha>07f16c89db55ab6f9f773cc3db6eb5a52908065e</Sha>
</Dependency>
<Dependency Name="dotnet-ef" Version="3.1.1-servicing.19605.1">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>7f59c0bb92fb33698232f0d7007ebcb0a428b543</Sha>
<Dependency Name="dotnet-ef" Version="3.1.1">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-EntityFrameworkCore</Uri>
<Sha>fde8a73d63ea11e1f2bdc690cf1b16ba0a449649</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="3.1.1-servicing.19605.1">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>7f59c0bb92fb33698232f0d7007ebcb0a428b543</Sha>
<Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="3.1.1">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-EntityFrameworkCore</Uri>
<Sha>fde8a73d63ea11e1f2bdc690cf1b16ba0a449649</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="3.1.1-servicing.19605.1">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>7f59c0bb92fb33698232f0d7007ebcb0a428b543</Sha>
<Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="3.1.1">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-EntityFrameworkCore</Uri>
<Sha>fde8a73d63ea11e1f2bdc690cf1b16ba0a449649</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.1-servicing.19605.1">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>7f59c0bb92fb33698232f0d7007ebcb0a428b543</Sha>
<Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.1">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-EntityFrameworkCore</Uri>
<Sha>fde8a73d63ea11e1f2bdc690cf1b16ba0a449649</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.1-servicing.19605.1">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>7f59c0bb92fb33698232f0d7007ebcb0a428b543</Sha>
<Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.1">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-EntityFrameworkCore</Uri>
<Sha>fde8a73d63ea11e1f2bdc690cf1b16ba0a449649</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="3.1.1-servicing.19605.1">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>7f59c0bb92fb33698232f0d7007ebcb0a428b543</Sha>
<Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="3.1.1">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-EntityFrameworkCore</Uri>
<Sha>fde8a73d63ea11e1f2bdc690cf1b16ba0a449649</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore" Version="3.1.1-servicing.19605.1">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>7f59c0bb92fb33698232f0d7007ebcb0a428b543</Sha>
<Dependency Name="Microsoft.EntityFrameworkCore" Version="3.1.1">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-EntityFrameworkCore</Uri>
<Sha>fde8a73d63ea11e1f2bdc690cf1b16ba0a449649</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="3.1.1-servicing.19614.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="3.1.1-servicing.19614.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.ActivatorUtilities.Sources" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.ActivatorUtilities.Sources" Version="3.1.1-servicing.19614.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.Memory" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Caching.Memory" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.CommandLineUtils.Sources" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.CommandLineUtils.Sources" Version="3.1.1-servicing.19614.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Json" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Configuration.Json" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.KeyPerFile" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Configuration.KeyPerFile" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Configuration" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DependencyInjection" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.DependencyInjection" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.HashCodeCombiner.Sources" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.HashCodeCombiner.Sources" Version="3.1.1-servicing.19614.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Hosting" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Hosting" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="3.1.1-servicing.19614.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Http" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Http" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Localization.Abstractions" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Localization.Abstractions" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Localization" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Localization" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Console" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Logging.Console" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Debug" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Logging.Debug" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Testing" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Logging.Testing" Version="3.1.1-servicing.19614.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Logging" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.ObjectPool" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.ObjectPool" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Options" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Options" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.ParameterDefaultValue.Sources" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.ParameterDefaultValue.Sources" Version="3.1.1-servicing.19614.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Primitives" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.Primitives" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.TypeNameHelper.Sources" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.TypeNameHelper.Sources" Version="3.1.1-servicing.19614.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.ValueStopwatch.Sources" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.ValueStopwatch.Sources" Version="3.1.1-servicing.19614.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.WebEncoders" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.Extensions.WebEncoders" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.JSInterop" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.JSInterop" Version="3.1.1" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Mono.WebAssembly.Interop" Version="3.1.1-preview4.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Mono.WebAssembly.Interop" Version="3.1.1-preview4.19614.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Bcl.AsyncInterfaces" Version="1.1.0" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri>
@ -377,25 +377,25 @@
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>0f7f38c4fd323b26da10cce95f857f77f0f09b48</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DependencyModel" Version="3.1.1-servicing.19576.9" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>f3f2dd583fffa254015fc21ff0e45784b333256d</Sha>
<Dependency Name="Microsoft.Extensions.DependencyModel" Version="3.1.1" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://dev.azure.com/dnceng/internal/_git/dotnet-core-setup</Uri>
<Sha>a1388f194c30cb21b36b75982962cb5e35954e4e</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="3.1.1-servicing.19576.9" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>f3f2dd583fffa254015fc21ff0e45784b333256d</Sha>
<Dependency Name="Microsoft.NETCore.App.Runtime.win-x64" Version="3.1.1" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://dev.azure.com/dnceng/internal/_git/dotnet-core-setup</Uri>
<Sha>a1388f194c30cb21b36b75982962cb5e35954e4e</Sha>
</Dependency>
<Dependency Name="NETStandard.Library.Ref" Version="2.1.0" Pinned="true">
<Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>7d57652f33493fa022125b7f63aad0d70c52d810</Sha>
</Dependency>
<Dependency Name="Microsoft.NETCore.App.Internal" Version="3.1.1-servicing.19576.9" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>f3f2dd583fffa254015fc21ff0e45784b333256d</Sha>
<Dependency Name="Microsoft.NETCore.App.Internal" Version="3.1.1-servicing.19608.4" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://dev.azure.com/dnceng/internal/_git/dotnet-core-setup</Uri>
<Sha>a1388f194c30cb21b36b75982962cb5e35954e4e</Sha>
</Dependency>
<!-- Keep these dependencies at the bottom of ProductDependencies, else they will be picked as the parent for CoherentParentDependencies -->
<Dependency Name="Microsoft.NETCore.App.Ref" Version="3.1.0" Pinned="true">
@ -413,9 +413,9 @@
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>0f7f38c4fd323b26da10cce95f857f77f0f09b48</Sha>
</Dependency>
<Dependency Name="Internal.AspNetCore.Analyzers" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Internal.AspNetCore.Analyzers" Version="3.1.1-servicing.19614.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.DotNet.GenAPI" Version="1.0.0-beta.19607.3">
<Uri>https://github.com/dotnet/arcade</Uri>
@ -429,9 +429,9 @@
<Uri>https://github.com/dotnet/arcade</Uri>
<Sha>4d80b9cfa53e309c8f685abff3512f60c3d8a3d1</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Testing" Version="3.1.1-servicing.19604.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>d40e21ccc14908a054b2181b1d6aeb22c49c630d</Sha>
<Dependency Name="Microsoft.AspNetCore.Testing" Version="3.1.1-servicing.19614.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://dev.azure.com/dnceng/internal/_git/aspnet-Extensions</Uri>
<Sha>d00c382ec5d68a85d2eb4a49ab4559b8db7a2390</Sha>
</Dependency>
<Dependency Name="Microsoft.Net.Compilers.Toolset" Version="3.4.0-beta4-19569-03" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/roslyn</Uri>

View File

@ -8,12 +8,12 @@
<PropertyGroup Label="Version settings">
<AspNetCoreMajorVersion>3</AspNetCoreMajorVersion>
<AspNetCoreMinorVersion>1</AspNetCoreMinorVersion>
<AspNetCorePatchVersion>1</AspNetCorePatchVersion>
<AspNetCorePatchVersion>2</AspNetCorePatchVersion>
<PreReleasePreviewNumber>0</PreReleasePreviewNumber>
<!--
When StabilizePackageVersion is set to 'true', this branch will produce stable outputs for 'Shipping' packages
-->
<StabilizePackageVersion Condition="'$(StabilizePackageVersion)' == ''">false</StabilizePackageVersion>
<StabilizePackageVersion Condition="'$(StabilizePackageVersion)' == ''">true</StabilizePackageVersion>
<DotNetFinalVersionKind Condition="'$(StabilizePackageVersion)' == 'true'">release</DotNetFinalVersionKind>
<IncludePreReleaseLabelInPackageVersion>true</IncludePreReleaseLabelInPackageVersion>
<IncludePreReleaseLabelInPackageVersion Condition=" '$(DotNetFinalVersionKind)' == 'release' ">false</IncludePreReleaseLabelInPackageVersion>
@ -66,10 +66,10 @@
<!-- Packages from dotnet/roslyn -->
<MicrosoftNetCompilersToolsetPackageVersion>3.4.0-beta4-19569-03</MicrosoftNetCompilersToolsetPackageVersion>
<!-- Packages from dotnet/core-setup -->
<MicrosoftExtensionsDependencyModelPackageVersion>3.1.1-servicing.19576.9</MicrosoftExtensionsDependencyModelPackageVersion>
<MicrosoftNETCoreAppInternalPackageVersion>3.1.1-servicing.19576.9</MicrosoftNETCoreAppInternalPackageVersion>
<MicrosoftExtensionsDependencyModelPackageVersion>3.1.1</MicrosoftExtensionsDependencyModelPackageVersion>
<MicrosoftNETCoreAppInternalPackageVersion>3.1.1-servicing.19608.4</MicrosoftNETCoreAppInternalPackageVersion>
<MicrosoftNETCoreAppRefPackageVersion>3.1.0</MicrosoftNETCoreAppRefPackageVersion>
<MicrosoftNETCoreAppRuntimewinx64PackageVersion>3.1.1-servicing.19576.9</MicrosoftNETCoreAppRuntimewinx64PackageVersion>
<MicrosoftNETCoreAppRuntimewinx64PackageVersion>3.1.1</MicrosoftNETCoreAppRuntimewinx64PackageVersion>
<NETStandardLibraryRefPackageVersion>2.1.0</NETStandardLibraryRefPackageVersion>
<!-- Packages from dotnet/corefx -->
<MicrosoftBclAsyncInterfacesPackageVersion>1.1.0</MicrosoftBclAsyncInterfacesPackageVersion>
@ -99,80 +99,80 @@
<!-- Packages from aspnet/Blazor -->
<MicrosoftAspNetCoreBlazorMonoPackageVersion>3.1.0-preview4.19605.1</MicrosoftAspNetCoreBlazorMonoPackageVersion>
<!-- Packages from aspnet/Extensions -->
<InternalAspNetCoreAnalyzersPackageVersion>3.1.1-servicing.19604.6</InternalAspNetCoreAnalyzersPackageVersion>
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.1.1-servicing.19604.6</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>3.1.1-servicing.19604.6</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
<MicrosoftAspNetCoreTestingPackageVersion>3.1.1-servicing.19604.6</MicrosoftAspNetCoreTestingPackageVersion>
<MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>
<MicrosoftExtensionsCachingAbstractionsPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsCachingAbstractionsPackageVersion>
<MicrosoftExtensionsCachingMemoryPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsCachingMemoryPackageVersion>
<MicrosoftExtensionsCachingSqlServerPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsCachingSqlServerPackageVersion>
<MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>
<MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>
<MicrosoftExtensionsConfigurationAbstractionsPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
<MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>
<MicrosoftExtensionsConfigurationBinderPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsConfigurationBinderPackageVersion>
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
<MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>
<MicrosoftExtensionsConfigurationIniPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsConfigurationIniPackageVersion>
<MicrosoftExtensionsConfigurationJsonPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsConfigurationJsonPackageVersion>
<MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>
<MicrosoftExtensionsConfigurationPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsConfigurationPackageVersion>
<MicrosoftExtensionsConfigurationUserSecretsPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsConfigurationUserSecretsPackageVersion>
<MicrosoftExtensionsConfigurationXmlPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsConfigurationXmlPackageVersion>
<MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>
<MicrosoftExtensionsDependencyInjectionPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsDependencyInjectionPackageVersion>
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
<MicrosoftExtensionsFileProvidersCompositePackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsFileProvidersCompositePackageVersion>
<MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>
<MicrosoftExtensionsFileProvidersPhysicalPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsFileProvidersPhysicalPackageVersion>
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
<MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>
<MicrosoftExtensionsHostingAbstractionsPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsHostingAbstractionsPackageVersion>
<MicrosoftExtensionsHostingPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsHostingPackageVersion>
<MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>
<MicrosoftExtensionsHttpPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsHttpPackageVersion>
<MicrosoftExtensionsLocalizationAbstractionsPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsLocalizationAbstractionsPackageVersion>
<MicrosoftExtensionsLocalizationPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsLocalizationPackageVersion>
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
<MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>
<MicrosoftExtensionsLoggingConfigurationPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsLoggingConfigurationPackageVersion>
<MicrosoftExtensionsLoggingConsolePackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsLoggingConsolePackageVersion>
<MicrosoftExtensionsLoggingDebugPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsLoggingDebugPackageVersion>
<MicrosoftExtensionsLoggingEventSourcePackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsLoggingEventSourcePackageVersion>
<MicrosoftExtensionsLoggingEventLogPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsLoggingEventLogPackageVersion>
<MicrosoftExtensionsLoggingPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsLoggingPackageVersion>
<MicrosoftExtensionsLoggingTestingPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsLoggingTestingPackageVersion>
<MicrosoftExtensionsLoggingTraceSourcePackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsLoggingTraceSourcePackageVersion>
<MicrosoftExtensionsObjectPoolPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsObjectPoolPackageVersion>
<MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>
<MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>
<MicrosoftExtensionsOptionsPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsOptionsPackageVersion>
<MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>
<MicrosoftExtensionsPrimitivesPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsPrimitivesPackageVersion>
<MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>
<MicrosoftExtensionsValueStopwatchSourcesPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsValueStopwatchSourcesPackageVersion>
<MicrosoftExtensionsWebEncodersPackageVersion>3.1.1-servicing.19604.6</MicrosoftExtensionsWebEncodersPackageVersion>
<InternalAspNetCoreAnalyzersPackageVersion>3.1.1-servicing.19614.4</InternalAspNetCoreAnalyzersPackageVersion>
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.1.1-servicing.19614.4</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>3.1.1-servicing.19614.4</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
<MicrosoftAspNetCoreTestingPackageVersion>3.1.1-servicing.19614.4</MicrosoftAspNetCoreTestingPackageVersion>
<MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>3.1.1-servicing.19614.4</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>
<MicrosoftExtensionsCachingAbstractionsPackageVersion>3.1.1</MicrosoftExtensionsCachingAbstractionsPackageVersion>
<MicrosoftExtensionsCachingMemoryPackageVersion>3.1.1</MicrosoftExtensionsCachingMemoryPackageVersion>
<MicrosoftExtensionsCachingSqlServerPackageVersion>3.1.1</MicrosoftExtensionsCachingSqlServerPackageVersion>
<MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>3.1.1</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>
<MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>3.1.1-servicing.19614.4</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>
<MicrosoftExtensionsConfigurationAbstractionsPackageVersion>3.1.1</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
<MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>3.1.1</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>
<MicrosoftExtensionsConfigurationBinderPackageVersion>3.1.1</MicrosoftExtensionsConfigurationBinderPackageVersion>
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>3.1.1</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>3.1.1</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
<MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>3.1.1</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>
<MicrosoftExtensionsConfigurationIniPackageVersion>3.1.1</MicrosoftExtensionsConfigurationIniPackageVersion>
<MicrosoftExtensionsConfigurationJsonPackageVersion>3.1.1</MicrosoftExtensionsConfigurationJsonPackageVersion>
<MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>3.1.1</MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>
<MicrosoftExtensionsConfigurationPackageVersion>3.1.1</MicrosoftExtensionsConfigurationPackageVersion>
<MicrosoftExtensionsConfigurationUserSecretsPackageVersion>3.1.1</MicrosoftExtensionsConfigurationUserSecretsPackageVersion>
<MicrosoftExtensionsConfigurationXmlPackageVersion>3.1.1</MicrosoftExtensionsConfigurationXmlPackageVersion>
<MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>3.1.1</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>
<MicrosoftExtensionsDependencyInjectionPackageVersion>3.1.1</MicrosoftExtensionsDependencyInjectionPackageVersion>
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>3.1.1</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>3.1.1</MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>3.1.1</MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>3.1.1</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
<MicrosoftExtensionsFileProvidersCompositePackageVersion>3.1.1</MicrosoftExtensionsFileProvidersCompositePackageVersion>
<MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>3.1.1</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>
<MicrosoftExtensionsFileProvidersPhysicalPackageVersion>3.1.1</MicrosoftExtensionsFileProvidersPhysicalPackageVersion>
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>3.1.1</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
<MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.1.1-servicing.19614.4</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>
<MicrosoftExtensionsHostingAbstractionsPackageVersion>3.1.1</MicrosoftExtensionsHostingAbstractionsPackageVersion>
<MicrosoftExtensionsHostingPackageVersion>3.1.1</MicrosoftExtensionsHostingPackageVersion>
<MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>3.1.1-servicing.19614.4</MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>
<MicrosoftExtensionsHttpPackageVersion>3.1.1</MicrosoftExtensionsHttpPackageVersion>
<MicrosoftExtensionsLocalizationAbstractionsPackageVersion>3.1.1</MicrosoftExtensionsLocalizationAbstractionsPackageVersion>
<MicrosoftExtensionsLocalizationPackageVersion>3.1.1</MicrosoftExtensionsLocalizationPackageVersion>
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.1.1</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
<MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>3.1.1</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>
<MicrosoftExtensionsLoggingConfigurationPackageVersion>3.1.1</MicrosoftExtensionsLoggingConfigurationPackageVersion>
<MicrosoftExtensionsLoggingConsolePackageVersion>3.1.1</MicrosoftExtensionsLoggingConsolePackageVersion>
<MicrosoftExtensionsLoggingDebugPackageVersion>3.1.1</MicrosoftExtensionsLoggingDebugPackageVersion>
<MicrosoftExtensionsLoggingEventSourcePackageVersion>3.1.1</MicrosoftExtensionsLoggingEventSourcePackageVersion>
<MicrosoftExtensionsLoggingEventLogPackageVersion>3.1.1</MicrosoftExtensionsLoggingEventLogPackageVersion>
<MicrosoftExtensionsLoggingPackageVersion>3.1.1</MicrosoftExtensionsLoggingPackageVersion>
<MicrosoftExtensionsLoggingTestingPackageVersion>3.1.1-servicing.19614.4</MicrosoftExtensionsLoggingTestingPackageVersion>
<MicrosoftExtensionsLoggingTraceSourcePackageVersion>3.1.1</MicrosoftExtensionsLoggingTraceSourcePackageVersion>
<MicrosoftExtensionsObjectPoolPackageVersion>3.1.1</MicrosoftExtensionsObjectPoolPackageVersion>
<MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>3.1.1</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>
<MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>3.1.1</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>
<MicrosoftExtensionsOptionsPackageVersion>3.1.1</MicrosoftExtensionsOptionsPackageVersion>
<MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>3.1.1-servicing.19614.4</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>
<MicrosoftExtensionsPrimitivesPackageVersion>3.1.1</MicrosoftExtensionsPrimitivesPackageVersion>
<MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>3.1.1-servicing.19614.4</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>
<MicrosoftExtensionsValueStopwatchSourcesPackageVersion>3.1.1-servicing.19614.4</MicrosoftExtensionsValueStopwatchSourcesPackageVersion>
<MicrosoftExtensionsWebEncodersPackageVersion>3.1.1</MicrosoftExtensionsWebEncodersPackageVersion>
<MicrosoftInternalExtensionsRefsPackageVersion>3.1.0-rtm.19565.4</MicrosoftInternalExtensionsRefsPackageVersion>
<MicrosoftJSInteropPackageVersion>3.1.1-servicing.19604.6</MicrosoftJSInteropPackageVersion>
<MonoWebAssemblyInteropPackageVersion>3.1.1-preview4.19604.6</MonoWebAssemblyInteropPackageVersion>
<MicrosoftJSInteropPackageVersion>3.1.1</MicrosoftJSInteropPackageVersion>
<MonoWebAssemblyInteropPackageVersion>3.1.1-preview4.19614.4</MonoWebAssemblyInteropPackageVersion>
<!-- Packages from aspnet/EntityFrameworkCore -->
<dotnetefPackageVersion>3.1.1-servicing.19605.1</dotnetefPackageVersion>
<MicrosoftEntityFrameworkCoreInMemoryPackageVersion>3.1.1-servicing.19605.1</MicrosoftEntityFrameworkCoreInMemoryPackageVersion>
<MicrosoftEntityFrameworkCoreRelationalPackageVersion>3.1.1-servicing.19605.1</MicrosoftEntityFrameworkCoreRelationalPackageVersion>
<MicrosoftEntityFrameworkCoreSqlitePackageVersion>3.1.1-servicing.19605.1</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
<MicrosoftEntityFrameworkCoreSqlServerPackageVersion>3.1.1-servicing.19605.1</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
<MicrosoftEntityFrameworkCoreToolsPackageVersion>3.1.1-servicing.19605.1</MicrosoftEntityFrameworkCoreToolsPackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>3.1.1-servicing.19605.1</MicrosoftEntityFrameworkCorePackageVersion>
<dotnetefPackageVersion>3.1.1</dotnetefPackageVersion>
<MicrosoftEntityFrameworkCoreInMemoryPackageVersion>3.1.1</MicrosoftEntityFrameworkCoreInMemoryPackageVersion>
<MicrosoftEntityFrameworkCoreRelationalPackageVersion>3.1.1</MicrosoftEntityFrameworkCoreRelationalPackageVersion>
<MicrosoftEntityFrameworkCoreSqlitePackageVersion>3.1.1</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
<MicrosoftEntityFrameworkCoreSqlServerPackageVersion>3.1.1</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
<MicrosoftEntityFrameworkCoreToolsPackageVersion>3.1.1</MicrosoftEntityFrameworkCoreToolsPackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>3.1.1</MicrosoftEntityFrameworkCorePackageVersion>
<!-- Packages from aspnet/AspNetCore-Tooling -->
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.1.1-servicing.19605.6</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
<MicrosoftAspNetCoreRazorLanguagePackageVersion>3.1.1-servicing.19605.6</MicrosoftAspNetCoreRazorLanguagePackageVersion>
<MicrosoftCodeAnalysisRazorPackageVersion>3.1.1-servicing.19605.6</MicrosoftCodeAnalysisRazorPackageVersion>
<MicrosoftNETSdkRazorPackageVersion>3.1.1-servicing.19605.6</MicrosoftNETSdkRazorPackageVersion>
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.1.1</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
<MicrosoftAspNetCoreRazorLanguagePackageVersion>3.1.1</MicrosoftAspNetCoreRazorLanguagePackageVersion>
<MicrosoftCodeAnalysisRazorPackageVersion>3.1.1</MicrosoftCodeAnalysisRazorPackageVersion>
<MicrosoftNETSdkRazorPackageVersion>3.1.1</MicrosoftNETSdkRazorPackageVersion>
</PropertyGroup>
<!--
@ -269,5 +269,6 @@
<PropertyGroup Label="Restore feeds">
<!-- In an orchestrated build, this may be overridden to other Azure feeds. -->
<DotNetAssetRootUrl Condition="'$(DotNetAssetRootUrl)'==''">https://dotnetcli.blob.core.windows.net/dotnet/</DotNetAssetRootUrl>
<DotNetPrivateAssetRootUrl Condition="'$(DotNetPrivateAssetRootUrl)'==''">https://dotnetclimsrc.blob.core.windows.net/dotnet/</DotNetPrivateAssetRootUrl>
</PropertyGroup>
</Project>

View File

@ -210,7 +210,15 @@ function InstallDotNet {
local runtimeSourceFeedKey=''
if [[ -n "${7:-}" ]]; then
decodedFeedKey=`echo $7 | base64 --decode`
# The 'base64' binary on alpine uses '-d' and doesn't support '--decode'
# like the rest of the unix variants. At the same time, MacOS doesn't support
# '-d'. To work around this, do a simple detection and switch the parameter
# accordingly.
decodeArg="--decode"
if base64 --help 2>&1 | grep -q "BusyBox"; then
decodeArg="-d"
fi
decodedFeedKey=`echo $7 | base64 $decodeArg`
runtimeSourceFeedKey="--feed-credential $decodedFeedKey"
fi

View File

@ -4,7 +4,11 @@
This script runs a quick check for common errors, such as checking that Visual Studio solutions are up to date or that generated code has been committed to source.
#>
param(
[switch]$ci
[switch]$ci,
# Optional arguments that enable downloading an internal
# runtime or runtime from a non-default location
[string]$DotNetRuntimeSourceFeed,
[string]$DotNetRuntimeSourceFeedKey
)
$ErrorActionPreference = 'Stop'
@ -43,7 +47,12 @@ function LogError {
try {
if ($ci) {
# Install dotnet.exe
& $repoRoot/restore.cmd -ci -NoBuildNodeJS
if ($DotNetRuntimeSourceFeed -or $DotNetRuntimeSourceFeedKey) {
& $repoRoot/restore.cmd -ci -NoBuildNodeJS -DotNetRuntimeSourceFeed $DotNetRuntimeSourceFeed -DotNetRuntimeSourceFeedKey $DotNetRuntimeSourceFeedKey
}
else{
& $repoRoot/restore.cmd -ci -NoBuildNodeJS
}
}
. "$repoRoot/activate.ps1"
@ -171,12 +180,13 @@ try {
# Redirect stderr to stdout because PowerShell does not consistently handle output to stderr
$changedFiles = & cmd /c 'git --no-pager diff --ignore-space-at-eol --name-only 2>nul'
# Temporary: Disable check for blazor js file
$changedFilesExclusion = "src/Components/Web.JS/dist/Release/blazor.server.js"
# Temporary: Disable check for blazor js file and nuget.config (updated automatically for
# internal builds)
$changedFilesExclusions = @("src/Components/Web.JS/dist/Release/blazor.server.js", "NuGet.config")
if ($changedFiles) {
foreach ($file in $changedFiles) {
if ($file -eq $changedFilesExclusion) {continue}
if ($changedFilesExclusions -contains $file) {continue}
$filePath = Resolve-Path "${repoRoot}/${file}"
LogError "Generated code is not up to date in $file. You might need to regenerate the reference assemblies or project list (see docs/ReferenceAssemblies.md and docs/ReferenceResolution.md)" -filepath $filePath

View File

@ -9,10 +9,31 @@ set -euo pipefail
scriptroot="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
reporoot="$(dirname "$(dirname "$scriptroot")")"
# For local development, make a backup copy of this file first
if [ ! -f "$reporoot/global.bak.json" ]; then
mv "$reporoot/global.json" "$reporoot/global.bak.json"
fi
# Detect the current version of .NET Core installed
export SDK_VERSION=$(dotnet --version)
echo "The ambient version of .NET Core SDK version = $SDK_VERSION"
# Update the global.json file to match the current .NET environment
cat "$reporoot/global.bak.json" | \
jq '.sdk.version=env.SDK_VERSION' | \
jq '.tools.dotnet=env.SDK_VERSION' | \
jq 'del(.tools.runtimes)' \
> "$reporoot/global.json"
# Restore the original global.json file
trap "{
mv "$reporoot/global.bak.json" "$reporoot/global.json"
}" EXIT
# Build repo tasks
"$reporoot/eng/common/build.sh" --restore --build --ci --configuration Release /p:ProjectToBuild=$reporoot/eng/tools/RepoTasks/RepoTasks.csproj
export DotNetBuildFromSource='true'
# Build projects
"$reporoot/eng/common/build.sh" --restore --build --pack "$@"
"$reporoot/eng/common/build.sh" --restore --build --pack "$@"

View File

@ -0,0 +1,149 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
namespace RepoTasks
{
public class DownloadFile : Microsoft.Build.Utilities.Task
{
[Required]
public string Uri { get; set; }
/// <summary>
/// If this field is set and the task fail to download the file from `Uri`, with a NotFound
/// status, it will try to download the file from `PrivateUri`.
/// </summary>
public string PrivateUri { get; set; }
/// <summary>
/// Suffix for the private URI in base64 form (for SAS compatibility)
/// </summary>
public string PrivateUriSuffix { get; set; }
public int MaxRetries { get; set; } = 5;
[Required]
public string DestinationPath { get; set; }
public bool Overwrite { get; set; }
public override bool Execute()
{
return ExecuteAsync().GetAwaiter().GetResult();
}
private async System.Threading.Tasks.Task<bool> ExecuteAsync()
{
string destinationDir = Path.GetDirectoryName(DestinationPath);
if (!Directory.Exists(destinationDir))
{
Directory.CreateDirectory(destinationDir);
}
if (File.Exists(DestinationPath) && !Overwrite)
{
return true;
}
const string FileUriProtocol = "file://";
if (Uri.StartsWith(FileUriProtocol, StringComparison.Ordinal))
{
var filePath = Uri.Substring(FileUriProtocol.Length);
Log.LogMessage($"Copying '{filePath}' to '{DestinationPath}'");
File.Copy(filePath, DestinationPath);
return true;
}
List<string> errorMessages = new List<string>();
bool? downloadStatus = await DownloadWithRetriesAsync(Uri, DestinationPath, errorMessages);
if (downloadStatus == false && !string.IsNullOrEmpty(PrivateUri))
{
string uriSuffix = "";
if (!string.IsNullOrEmpty(PrivateUriSuffix))
{
var uriSuffixBytes = System.Convert.FromBase64String(PrivateUriSuffix);
uriSuffix = System.Text.Encoding.UTF8.GetString(uriSuffixBytes);
}
downloadStatus = await DownloadWithRetriesAsync($"{PrivateUri}{uriSuffix}", DestinationPath, errorMessages);
}
if (downloadStatus != true)
{
foreach (var error in errorMessages)
{
Log.LogError(error);
}
}
return downloadStatus == true;
}
/// <summary>
/// Attempt to download file from `source` with retries when response error is different of FileNotFound and Success.
/// </summary>
/// <param name="source">URL to the file to be downloaded.</param>
/// <param name="target">Local path where to put the downloaded file.</param>
/// <returns>true: Download Succeeded. false: Download failed with 404. null: Download failed but is retriable.</returns>
private async Task<bool?> DownloadWithRetriesAsync(string source, string target, List<string> errorMessages)
{
Random rng = new Random();
Log.LogMessage(MessageImportance.High, $"Attempting download '{source}' to '{target}'");
using (var httpClient = new HttpClient())
{
for (int retryNumber = 0; retryNumber < MaxRetries; retryNumber++)
{
try
{
var httpResponse = await httpClient.GetAsync(source);
Log.LogMessage(MessageImportance.High, $"{source} -> {httpResponse.StatusCode}");
// The Azure Storage REST API returns '400 - Bad Request' in some cases
// where the resource is not found on the storage.
// https://docs.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes
if (httpResponse.StatusCode == HttpStatusCode.NotFound ||
httpResponse.ReasonPhrase.IndexOf("The requested URI does not represent any resource on the server.", StringComparison.OrdinalIgnoreCase) == 0)
{
errorMessages.Add($"Problems downloading file from '{source}'. Does the resource exist on the storage? {httpResponse.StatusCode} : {httpResponse.ReasonPhrase}");
return false;
}
httpResponse.EnsureSuccessStatusCode();
using (var outStream = File.Create(target))
{
await httpResponse.Content.CopyToAsync(outStream);
}
Log.LogMessage(MessageImportance.High, $"returning true {source} -> {httpResponse.StatusCode}");
return true;
}
catch (Exception e)
{
Log.LogMessage(MessageImportance.High, $"returning error in {source} ");
errorMessages.Add($"Problems downloading file from '{source}'. {e.Message} {e.StackTrace}");
File.Delete(target);
}
await System.Threading.Tasks.Task.Delay(rng.Next(1000, 10000));
}
}
Log.LogMessage(MessageImportance.High, $"giving up {source} ");
errorMessages.Add($"Giving up downloading the file from '{source}' after {MaxRetries} retries.");
return null;
}
}
}

View File

@ -10,4 +10,5 @@
<UsingTask TaskName="RepoTasks.GenerateSharedFrameworkDepsFile" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.CreateFrameworkListFile" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.RemoveSharedFrameworkDependencies" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.DownloadFile" AssemblyFile="$(_RepoTaskAssembly)" />
</Project>

View File

@ -38,6 +38,7 @@ This package is an internal implementation of the .NET Core SDK and is not meant
<DotNetRuntimeArchiveFileName>dotnet-runtime-$(MicrosoftNETCoreAppRuntimeVersion)-$(TargetRuntimeIdentifier)$(ArchiveExtension)</DotNetRuntimeArchiveFileName>
<DotNetRuntimeDownloadUrl>$(DotNetAssetRootUrl)Runtime/$(MicrosoftNETCoreAppInternalPackageVersion)/$(DotNetRuntimeArchiveFileName)</DotNetRuntimeDownloadUrl>
<DotNetRuntimePrivateDownloadUrl>$(DotNetPrivateAssetRootUrl)Runtime/$(MicrosoftNETCoreAppInternalPackageVersion)/$(DotNetRuntimeArchiveFileName)</DotNetRuntimePrivateDownloadUrl>
<DotNetRuntimeArchive>$(BaseIntermediateOutputPath)$(DotNetRuntimeArchiveFileName)</DotNetRuntimeArchive>
<!-- Setting this suppresses getting documentation .xml files in the shared runtime output. -->
@ -379,9 +380,10 @@ This package is an internal implementation of the .NET Core SDK and is not meant
-->
<Target Name="_DownloadAndExtractDotNetRuntime" Condition="'$(DotNetBuildFromSource)' != 'true'">
<DownloadFile Condition=" ! Exists('$(DotNetRuntimeArchive)')"
SourceUrl="$(DotNetRuntimeDownloadUrl)$(DotNetAssetRootAccessTokenSuffix)"
DestinationFolder="$(BaseIntermediateOutputPath)"
DestinationFileName="$(DotNetRuntimeArchiveFileName)" />
Uri="$(DotNetRuntimeDownloadUrl)"
PrivateUri="$(DotNetRuntimePrivateDownloadUrl)"
PrivateUriSuffix="$(DotNetAssetRootAccessTokenSuffix)"
DestinationPath="$(DotNetRuntimeArchive)" />
<!-- Extract the dotnet-runtime archive -->
<Exec Condition="'$(ArchiveExtension)' == '.tar.gz'"

View File

@ -23,13 +23,15 @@
<PropertyGroup>
<DotNetAssetRootUrl Condition=" '$(DotNetAssetRootUrl)' == '' ">https://dotnetcli.azureedge.net/dotnet/</DotNetAssetRootUrl>
<DotNetAssetRootUrl Condition=" ! $(DotNetAssetRootUrl.EndsWith('/'))">$(DotNetAssetRootUrl)/</DotNetAssetRootUrl>
<DotNetPrivateAssetRootUrl Condition=" '$(DotNetPrivateAssetRootUrl)' == '' ">https://dotnetclimsrc.azureedge.net/dotnet/</DotNetPrivateAssetRootUrl>
<DotNetPrivateAssetRootUrl Condition=" ! $(DotNetPrivateAssetRootUrl.EndsWith('/'))">$(DotNetPrivateAssetRootUrl)/</DotNetPrivateAssetRootUrl>
</PropertyGroup>
<ItemGroup>
<RemoteAsset Include="$(DotNetAssetRootUrl)Runtime/$(MicrosoftNETCoreAppInternalPackageVersion)/dotnet-runtime-$(MicrosoftNETCoreAppRuntimeVersion)-win-x64.exe$(DotNetAssetRootAccessTokenSuffix)">
<RemoteAsset Include="Runtime/$(MicrosoftNETCoreAppInternalPackageVersion)/dotnet-runtime-$(MicrosoftNETCoreAppRuntimeVersion)-win-x64.exe">
<TargetFileName>dotnet-runtime-$(MicrosoftNETCoreAppRuntimeVersion)-win-x64.exe</TargetFileName>
</RemoteAsset>
<RemoteAsset Include="$(DotNetAssetRootUrl)Runtime/$(MicrosoftNETCoreAppInternalPackageVersion)/dotnet-runtime-$(MicrosoftNETCoreAppRuntimeVersion)-win-x86.exe$(DotNetAssetRootAccessTokenSuffix)">
<RemoteAsset Include="Runtime/$(MicrosoftNETCoreAppInternalPackageVersion)/dotnet-runtime-$(MicrosoftNETCoreAppRuntimeVersion)-win-x86.exe">
<TargetFileName>dotnet-runtime-$(MicrosoftNETCoreAppRuntimeVersion)-win-x86.exe</TargetFileName>
</RemoteAsset>
</ItemGroup>
@ -37,7 +39,10 @@
<MakeDir Directories="$(DepsPath)" />
<DownloadFile Condition=" ! Exists('$(DepsPath)%(RemoteAsset.TargetFileName)') "
SourceUrl="%(RemoteAsset.Identity)" DestinationFolder="$(DepsPath)" DestinationFileName="%(RemoteAsset.TargetFileName)" />
Uri="$(DotNetAssetRootUrl)%(RemoteAsset.Identity)"
PrivateUri="$(DotNetPrivateAssetRootUrl)%(RemoteAsset.Identity)"
PrivateUriSuffix="$(DotNetAssetRootAccessTokenSuffix)"
DestinationPath="$(DepsPath)%(RemoteAsset.TargetFileName)" />
</Target>
<Target Name="ExtractPropertiesFromDotNetMsi" DependsOnTargets="FetchDependencies" BeforeTargets="BeforeBuild">

View File

@ -15,7 +15,7 @@
<!-- Targeting pack version should be the one we just built, if we're building it. Otherwise we use the baseline version -->
<PropertyGroup>
<MicrosoftAspNetCoreAppRefPackageVersion Condition="'$(IsTargetingPackBuilding)' != 'false'">%(_TargetingPackVersionInfo.PackageVersion)</MicrosoftAspNetCoreAppRefPackageVersion>
<MicrosoftAspNetCoreAppRefPackageVersion Condition="'$(IsTargetingPackBuilding)' == 'false'">$(AspNetCoreBaselineVersion)</MicrosoftAspNetCoreAppRefPackageVersion>
<MicrosoftAspNetCoreAppRefPackageVersion Condition="'$(IsTargetingPackBuilding)' == 'false'">$(TargetingPackVersionPrefix)</MicrosoftAspNetCoreAppRefPackageVersion>
</PropertyGroup>
<!-- Runtime and Ref packs may have separate versions. -->

View File

@ -31,6 +31,8 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
IHttpTransportFeature,
IConnectionInherentKeepAliveFeature
{
private static long _tenSeconds = TimeSpan.FromSeconds(10).Ticks;
private readonly object _stateLock = new object();
private readonly object _itemsLock = new object();
private readonly object _heartbeatLock = new object();
@ -40,6 +42,12 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
private IDuplexPipe _application;
private IDictionary<object, object> _items;
private CancellationTokenSource _sendCts;
private bool _activeSend;
private long _startedSendTime;
private readonly object _sendingLock = new object();
internal CancellationToken SendingToken { get; private set; }
// This tcs exists so that multiple calls to DisposeAsync all wait asynchronously
// on the same task
private readonly TaskCompletionSource<object> _disposeTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
@ -258,8 +266,26 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
}
else
{
// The other transports don't close their own output, so we can do it here safely
Application?.Output.Complete();
// Normally it isn't safe to try and acquire this lock because the Send can hold onto it for a long time if there is backpressure
// It is safe to wait for this lock now because the Send will be in one of 4 states
// 1. In the middle of a write which is in the middle of being canceled by the CancelPendingFlush above, when it throws
// an OperationCanceledException it will complete the PipeWriter which will make any other Send waiting on the lock
// throw an InvalidOperationException if they call Write
// 2. About to write and see that there is a pending cancel from the CancelPendingFlush, go to 1 to see what happens
// 3. Enters the Send and sees the Dispose state from DisposeAndRemoveAsync and releases the lock
// 4. No Send in progress
await WriteLock.WaitAsync();
try
{
// Complete the applications read loop
Application?.Output.Complete();
}
finally
{
WriteLock.Release();
}
Application?.Input.CancelPendingRead();
}
}
@ -401,7 +427,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
nonClonedContext.Response.RegisterForDispose(timeoutSource);
nonClonedContext.Response.RegisterForDispose(tokenSource);
var longPolling = new LongPollingServerTransport(timeoutSource.Token, Application.Input, loggerFactory);
var longPolling = new LongPollingServerTransport(timeoutSource.Token, Application.Input, loggerFactory, this);
// Start the transport
TransportTask = longPolling.ProcessRequestAsync(nonClonedContext, tokenSource.Token);
@ -507,6 +533,40 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
await connectionDelegate(this);
}
internal void StartSendCancellation()
{
lock (_sendingLock)
{
if (_sendCts == null || _sendCts.IsCancellationRequested)
{
_sendCts = new CancellationTokenSource();
SendingToken = _sendCts.Token;
}
_startedSendTime = DateTime.UtcNow.Ticks;
_activeSend = true;
}
}
internal void TryCancelSend(long currentTicks)
{
lock (_sendingLock)
{
if (_activeSend)
{
if (currentTicks - _startedSendTime > _tenSeconds)
{
_sendCts.Cancel();
}
}
}
}
internal void StopSendCancellation()
{
lock (_sendingLock)
{
_activeSend = false;
}
}
private static class Log
{
private static readonly Action<ILogger, string, Exception> _disposingConnection =

View File

@ -142,7 +142,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
connection.SupportedFormats = TransferFormat.Text;
// We only need to provide the Input channel since writing to the application is handled through /send.
var sse = new ServerSentEventsServerTransport(connection.Application.Input, connection.ConnectionId, _loggerFactory);
var sse = new ServerSentEventsServerTransport(connection.Application.Input, connection.ConnectionId, connection, _loggerFactory);
await DoPersistentConnection(connectionDelegate, sse, context, connection);
}
@ -216,7 +216,9 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
connection.Transport.Output.Complete(connection.ApplicationTask.Exception);
// Wait for the transport to run
await connection.TransportTask;
// Ignore exceptions, it has been logged if there is one and the application has finished
// So there is no one to give the exception to
await connection.TransportTask.NoThrow();
// If the status code is a 204 it means the connection is done
if (context.Response.StatusCode == StatusCodes.Status204NoContent)
@ -234,12 +236,12 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
connection.MarkInactive();
}
}
else if (resultTask.IsFaulted)
else if (resultTask.IsFaulted || resultTask.IsCanceled)
{
// Cancel current request to release any waiting poll and let dispose acquire the lock
currentRequestTcs.TrySetCanceled();
// transport task was faulted, we should remove the connection
// We should be able to safely dispose because there's no more data being written
// We don't need to wait for close here since we've already waited for both sides
await _manager.DisposeAndRemoveAsync(connection, closeGracefully: false);
}
else
@ -434,6 +436,14 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
context.Response.StatusCode = StatusCodes.Status404NotFound;
context.Response.ContentType = "text/plain";
// There are no writes anymore (since this is the write "loop")
// So it is safe to complete the writer
// We complete the writer here because we already have the WriteLock acquired
// and it's unsafe to complete outside of the lock
// Other code isn't guaranteed to be able to acquire the lock before another write
// even if CancelPendingFlush is called, and the other write could hang if there is backpressure
connection.Application.Output.Complete();
return;
}
catch (IOException ex)
@ -481,11 +491,8 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
Log.TerminatingConection(_logger);
// Complete the receiving end of the pipe
connection.Application.Output.Complete();
// Dispose the connection gracefully, but don't wait for it. We assign it here so we can wait in tests
connection.DisposeAndRemoveTask = _manager.DisposeAndRemoveAsync(connection, closeGracefully: true);
// Dispose the connection, but don't wait for it. We assign it here so we can wait in tests
connection.DisposeAndRemoveTask = _manager.DisposeAndRemoveAsync(connection, closeGracefully: false);
context.Response.StatusCode = StatusCodes.Status202Accepted;
context.Response.ContentType = "text/plain";

View File

@ -31,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
private readonly TimerAwaitable _nextHeartbeat;
private readonly ILogger<HttpConnectionManager> _logger;
private readonly ILogger<HttpConnectionContext> _connectionLogger;
private readonly bool _useSendTimeout = true;
private readonly TimeSpan _disconnectTimeout;
public HttpConnectionManager(ILoggerFactory loggerFactory, IHostApplicationLifetime appLifetime)
@ -44,6 +45,11 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
_connectionLogger = loggerFactory.CreateLogger<HttpConnectionContext>();
_nextHeartbeat = new TimerAwaitable(_heartbeatTickRate, _heartbeatTickRate);
_disconnectTimeout = connectionOptions.Value.DisconnectTimeout ?? ConnectionOptionsSetup.DefaultDisconectTimeout;
if (AppContext.TryGetSwitch("Microsoft.AspNetCore.Http.Connections.DoNotUseSendTimeout", out var timeoutDisabled))
{
_useSendTimeout = !timeoutDisabled;
}
// Register these last as the callbacks could run immediately
appLifetime.ApplicationStarted.Register(() => Start());
appLifetime.ApplicationStopping.Register(() => CloseConnections());
@ -155,20 +161,26 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
// Capture the connection state
var lastSeenUtc = connection.LastSeenUtcIfInactive;
var utcNow = DateTimeOffset.UtcNow;
// Once the decision has been made to dispose we don't check the status again
// But don't clean up connections while the debugger is attached.
if (!Debugger.IsAttached && lastSeenUtc.HasValue && (DateTimeOffset.UtcNow - lastSeenUtc.Value).TotalSeconds > _disconnectTimeout.TotalSeconds)
if (!Debugger.IsAttached && lastSeenUtc.HasValue && (utcNow - lastSeenUtc.Value).TotalSeconds > _disconnectTimeout.TotalSeconds)
{
Log.ConnectionTimedOut(_logger, connection.ConnectionId);
HttpConnectionsEventSource.Log.ConnectionTimedOut(connection.ConnectionId);
// This is most likely a long polling connection. The transport here ends because
// a poll completed and has been inactive for > 5 seconds so we wait for the
// a poll completed and has been inactive for > 5 seconds so we wait for the
// application to finish gracefully
_ = DisposeAndRemoveAsync(connection, closeGracefully: true);
}
else
{
if (!Debugger.IsAttached && _useSendTimeout)
{
connection.TryCancelSend(utcNow.Ticks);
}
// Tick the heartbeat, if the connection is still active
connection.TickHeartbeat();
}

View File

@ -0,0 +1,24 @@
// 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.Runtime.CompilerServices;
namespace System.Threading.Tasks
{
internal static class TaskExtensions
{
public static async Task NoThrow(this Task task)
{
await new NoThrowAwaiter(task);
}
}
internal readonly struct NoThrowAwaiter : ICriticalNotifyCompletion
{
private readonly Task _task;
public NoThrowAwaiter(Task task) { _task = task; }
public NoThrowAwaiter GetAwaiter() => this;
public bool IsCompleted => _task.IsCompleted;
// Observe exception
public void GetResult() { _ = _task.Exception; }
public void OnCompleted(Action continuation) => _task.GetAwaiter().OnCompleted(continuation);
public void UnsafeOnCompleted(Action continuation) => OnCompleted(continuation);
}
}

View File

@ -16,12 +16,19 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal.Transports
private readonly PipeReader _application;
private readonly ILogger _logger;
private readonly CancellationToken _timeoutToken;
private readonly HttpConnectionContext _connection;
public LongPollingServerTransport(CancellationToken timeoutToken, PipeReader application, ILoggerFactory loggerFactory)
: this(timeoutToken, application, loggerFactory, connection: null)
{ }
public LongPollingServerTransport(CancellationToken timeoutToken, PipeReader application, ILoggerFactory loggerFactory, HttpConnectionContext connection)
{
_timeoutToken = timeoutToken;
_application = application;
_connection = connection;
// We create the logger with a string to preserve the logging namespace after the server side transport renames.
_logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Connections.Internal.Transports.LongPollingTransport");
}
@ -33,7 +40,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal.Transports
var result = await _application.ReadAsync(token);
var buffer = result.Buffer;
if (buffer.IsEmpty && result.IsCompleted)
if (buffer.IsEmpty && (result.IsCompleted || result.IsCanceled))
{
Log.LongPolling204(_logger);
context.Response.ContentType = "text/plain";
@ -51,19 +58,22 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal.Transports
try
{
await context.Response.Body.WriteAsync(buffer);
_connection?.StartSendCancellation();
await context.Response.Body.WriteAsync(buffer, _connection?.SendingToken ?? default);
}
finally
{
_connection?.StopSendCancellation();
_application.AdvanceTo(buffer.End);
}
}
catch (OperationCanceledException)
{
// 3 cases:
// 4 cases:
// 1 - Request aborted, the client disconnected (no response)
// 2 - The poll timeout is hit (200)
// 3 - A new request comes in and cancels this request (204)
// 3 - SendingToken was canceled, abort the connection
// 4 - A new request comes in and cancels this request (204)
// Case 1
if (context.RequestAborted.IsCancellationRequested)
@ -81,9 +91,16 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal.Transports
context.Response.ContentType = "text/plain";
context.Response.StatusCode = StatusCodes.Status200OK;
}
else
else if (_connection?.SendingToken.IsCancellationRequested == true)
{
// Case 3
context.Response.ContentType = "text/plain";
context.Response.StatusCode = StatusCodes.Status204NoContent;
throw;
}
else
{
// Case 4
Log.LongPolling204(_logger);
context.Response.ContentType = "text/plain";
context.Response.StatusCode = StatusCodes.Status204NoContent;

View File

@ -16,11 +16,17 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal.Transports
private readonly PipeReader _application;
private readonly string _connectionId;
private readonly ILogger _logger;
private readonly HttpConnectionContext _connection;
public ServerSentEventsServerTransport(PipeReader application, string connectionId, ILoggerFactory loggerFactory)
: this(application, connectionId, connection: null, loggerFactory)
{ }
public ServerSentEventsServerTransport(PipeReader application, string connectionId, HttpConnectionContext connection, ILoggerFactory loggerFactory)
{
_application = application;
_connectionId = connectionId;
_connection = connection;
// We create the logger with a string to preserve the logging namespace after the server side transport renames.
_logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Connections.Internal.Transports.ServerSentEventsTransport");
@ -51,11 +57,17 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal.Transports
try
{
if (result.IsCanceled)
{
break;
}
if (!buffer.IsEmpty)
{
Log.SSEWritingMessage(_logger, buffer.Length);
await ServerSentEventsMessageFormatter.WriteMessageAsync(buffer, context.Response.Body);
_connection?.StartSendCancellation();
await ServerSentEventsMessageFormatter.WriteMessageAsync(buffer, context.Response.Body, _connection?.SendingToken ?? default);
}
else if (result.IsCompleted)
{
@ -64,6 +76,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal.Transports
}
finally
{
_connection?.StopSendCancellation();
_application.AdvanceTo(buffer.End);
}
}

View File

@ -231,7 +231,8 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal.Transports
if (WebSocketCanSend(socket))
{
await socket.SendAsync(buffer, webSocketMessageType);
_connection.StartSendCancellation();
await socket.SendAsync(buffer, webSocketMessageType, _connection.SendingToken);
}
else
{
@ -254,6 +255,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal.Transports
}
finally
{
_connection.StopSendCancellation();
_application.Input.AdvanceTo(buffer.End);
}
}

View File

@ -4,6 +4,7 @@
using System;
using System.Buffers;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Http.Connections
@ -15,19 +16,19 @@ namespace Microsoft.AspNetCore.Http.Connections
private const byte LineFeed = (byte)'\n';
public static async Task WriteMessageAsync(ReadOnlySequence<byte> payload, Stream output)
public static async Task WriteMessageAsync(ReadOnlySequence<byte> payload, Stream output, CancellationToken token)
{
// Payload does not contain a line feed so write it directly to output
if (payload.PositionOf(LineFeed) == null)
{
if (payload.Length > 0)
{
await output.WriteAsync(DataPrefix, 0, DataPrefix.Length);
await output.WriteAsync(payload);
await output.WriteAsync(Newline, 0, Newline.Length);
await output.WriteAsync(DataPrefix, 0, DataPrefix.Length, token);
await output.WriteAsync(payload, token);
await output.WriteAsync(Newline, 0, Newline.Length, token);
}
await output.WriteAsync(Newline, 0, Newline.Length);
await output.WriteAsync(Newline, 0, Newline.Length, token);
return;
}
@ -37,7 +38,7 @@ namespace Microsoft.AspNetCore.Http.Connections
await WriteMessageToMemory(ms, payload);
ms.Position = 0;
await ms.CopyToAsync(output);
await ms.CopyToAsync(output, token);
}
/// <summary>

View File

@ -1050,6 +1050,178 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests
}
}
private class BlockingStream : Stream
{
private readonly SyncPoint _sync;
private bool _isSSE;
public BlockingStream(SyncPoint sync, bool isSSE = false)
{
_sync = sync;
_isSSE = isSSE;
}
public override bool CanRead => throw new NotImplementedException();
public override bool CanSeek => throw new NotImplementedException();
public override bool CanWrite => throw new NotImplementedException();
public override long Length => throw new NotImplementedException();
public override long Position { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public override Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
public override void Flush()
{
}
public override int Read(byte[] buffer, int offset, int count)
{
throw new NotImplementedException();
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotImplementedException();
}
public override void SetLength(long value)
{
throw new NotImplementedException();
}
public override void Write(byte[] buffer, int offset, int count)
{
throw new NotImplementedException();
}
public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
if (_isSSE)
{
// SSE does an initial write of :\r\n that we want to ignore in testing
_isSSE = false;
return;
}
await _sync.WaitToContinue();
cancellationToken.ThrowIfCancellationRequested();
}
#if NETCOREAPP2_1
public override async ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default)
{
if (_isSSE)
{
// SSE does an initial write of :\r\n that we want to ignore in testing
_isSSE = false;
return;
}
await _sync.WaitToContinue();
cancellationToken.ThrowIfCancellationRequested();
}
#endif
}
[Fact]
[LogLevel(LogLevel.Debug)]
public async Task LongPollingConnectionClosesWhenSendTimeoutReached()
{
bool ExpectedErrors(WriteContext writeContext)
{
return (writeContext.LoggerName == typeof(Internal.Transports.LongPollingServerTransport).FullName &&
writeContext.EventId.Name == "LongPollingTerminated") ||
(writeContext.LoggerName == typeof(HttpConnectionManager).FullName && writeContext.EventId.Name == "FailedDispose");
}
using (StartVerifiableLog(expectedErrorsFilter: ExpectedErrors))
{
var manager = CreateConnectionManager(LoggerFactory);
var connection = manager.CreateConnection();
connection.TransportType = HttpTransportType.LongPolling;
var dispatcher = new HttpConnectionDispatcher(manager, LoggerFactory);
var context = MakeRequest("/foo", connection);
var services = new ServiceCollection();
services.AddSingleton<TestConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build();
var options = new HttpConnectionDispatcherOptions();
// First poll completes immediately
await dispatcher.ExecuteAsync(context, options, app).OrTimeout();
var sync = new SyncPoint();
context.Response.Body = new BlockingStream(sync);
var dispatcherTask = dispatcher.ExecuteAsync(context, options, app);
await connection.Transport.Output.WriteAsync(new byte[] { 1 }).OrTimeout();
await sync.WaitForSyncPoint().OrTimeout();
// Cancel write to response body
connection.TryCancelSend(long.MaxValue);
sync.Continue();
await dispatcherTask.OrTimeout();
// Connection should be removed on canceled write
Assert.False(manager.TryGetConnection(connection.ConnectionId, out var _));
}
}
[Fact]
[LogLevel(LogLevel.Debug)]
public async Task SSEConnectionClosesWhenSendTimeoutReached()
{
using (StartVerifiableLog())
{
var manager = CreateConnectionManager(LoggerFactory);
var connection = manager.CreateConnection();
connection.TransportType = HttpTransportType.ServerSentEvents;
var dispatcher = new HttpConnectionDispatcher(manager, LoggerFactory);
var context = MakeRequest("/foo", connection);
SetTransport(context, connection.TransportType);
var services = new ServiceCollection();
services.AddSingleton<TestConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build();
var sync = new SyncPoint();
context.Response.Body = new BlockingStream(sync, isSSE: true);
var options = new HttpConnectionDispatcherOptions();
var dispatcherTask = dispatcher.ExecuteAsync(context, options, app);
await connection.Transport.Output.WriteAsync(new byte[] { 1 }).OrTimeout();
await sync.WaitForSyncPoint().OrTimeout();
// Cancel write to response body
connection.TryCancelSend(long.MaxValue);
sync.Continue();
await dispatcherTask.OrTimeout();
// Connection should be removed on canceled write
Assert.False(manager.TryGetConnection(connection.ConnectionId, out var _));
}
}
[Fact]
[LogLevel(LogLevel.Debug)]
public async Task WebSocketConnectionClosesWhenSendTimeoutReached()
{
bool ExpectedErrors(WriteContext writeContext)
{
return writeContext.LoggerName == typeof(Internal.Transports.WebSocketsServerTransport).FullName &&
writeContext.EventId.Name == "ErrorWritingFrame";
}
using (StartVerifiableLog(expectedErrorsFilter: ExpectedErrors))
{
var manager = CreateConnectionManager(LoggerFactory);
var connection = manager.CreateConnection();
connection.TransportType = HttpTransportType.WebSockets;
var dispatcher = new HttpConnectionDispatcher(manager, LoggerFactory);
var sync = new SyncPoint();
var context = MakeRequest("/foo", connection);
SetTransport(context, connection.TransportType, sync);
var services = new ServiceCollection();
services.AddSingleton<TestConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseConnectionHandler<TestConnectionHandler>();
var app = builder.Build();
var options = new HttpConnectionDispatcherOptions();
options.WebSockets.CloseTimeout = TimeSpan.FromSeconds(0);
var dispatcherTask = dispatcher.ExecuteAsync(context, options, app);
await connection.Transport.Output.WriteAsync(new byte[] { 1 }).OrTimeout();
await sync.WaitForSyncPoint().OrTimeout();
// Cancel write to response body
connection.TryCancelSend(long.MaxValue);
sync.Continue();
await dispatcherTask.OrTimeout();
// Connection should be removed on canceled write
Assert.False(manager.TryGetConnection(connection.ConnectionId, out var _));
}
}
[Fact]
[LogLevel(LogLevel.Trace)]
public async Task WebSocketTransportTimesOutWhenCloseFrameNotReceived()
@ -1622,6 +1794,8 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests
Assert.Equal(StatusCodes.Status202Accepted, deleteContext.Response.StatusCode);
Assert.Equal("text/plain", deleteContext.Response.ContentType);
await connection.DisposeAndRemoveTask.OrTimeout();
// Verify the connection was removed from the manager
Assert.False(manager.TryGetConnection(connection.ConnectionToken, out _));
}
@ -1675,6 +1849,110 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests
}
}
[Fact]
public async Task DeleteEndpointTerminatesLongPollingWithHangingApplication()
{
using (StartVerifiableLog())
{
var manager = CreateConnectionManager(LoggerFactory);
var pipeOptions = new PipeOptions(pauseWriterThreshold: 2, resumeWriterThreshold: 1);
var connection = manager.CreateConnection(pipeOptions, pipeOptions);
connection.TransportType = HttpTransportType.LongPolling;
var dispatcher = new HttpConnectionDispatcher(manager, LoggerFactory);
var context = MakeRequest("/foo", connection);
var services = new ServiceCollection();
services.AddSingleton<NeverEndingConnectionHandler>();
var builder = new ConnectionBuilder(services.BuildServiceProvider());
builder.UseConnectionHandler<NeverEndingConnectionHandler>();
var app = builder.Build();
var options = new HttpConnectionDispatcherOptions();
var pollTask = dispatcher.ExecuteAsync(context, options, app);
Assert.True(pollTask.IsCompleted);
// Now send the second poll
pollTask = dispatcher.ExecuteAsync(context, options, app);
// Issue the delete request and make sure the poll completes
var deleteContext = new DefaultHttpContext();
deleteContext.Request.Path = "/foo";
deleteContext.Request.QueryString = new QueryString($"?id={connection.ConnectionId}");
deleteContext.Request.Method = "DELETE";
Assert.False(pollTask.IsCompleted);
await dispatcher.ExecuteAsync(deleteContext, options, app).OrTimeout();
await pollTask.OrTimeout();
// Verify that transport shuts down
await connection.TransportTask.OrTimeout();
// Verify the response from the DELETE request
Assert.Equal(StatusCodes.Status202Accepted, deleteContext.Response.StatusCode);
Assert.Equal("text/plain", deleteContext.Response.ContentType);
Assert.Equal(HttpConnectionStatus.Disposed, connection.Status);
// Verify the connection not removed because application is hanging
Assert.True(manager.TryGetConnection(connection.ConnectionId, out _));
}
}
[Fact]
public async Task PollCanReceiveFinalMessageAfterAppCompletes()
{
using (StartVerifiableLog())
{
var transportType = HttpTransportType.LongPolling;
var manager = CreateConnectionManager(LoggerFactory);
var dispatcher = new HttpConnectionDispatcher(manager, LoggerFactory);
var connection = manager.CreateConnection();
connection.TransportType = transportType;
var waitForMessageTcs1 = new TaskCompletionSource<object>();
var messageTcs1 = new TaskCompletionSource<object>();
var waitForMessageTcs2 = new TaskCompletionSource<object>();
var messageTcs2 = new TaskCompletionSource<object>();
ConnectionDelegate connectionDelegate = async c =>
{
await waitForMessageTcs1.Task.OrTimeout();
await c.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes("Message1")).OrTimeout();
messageTcs1.TrySetResult(null);
await waitForMessageTcs2.Task.OrTimeout();
await c.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes("Message2")).OrTimeout();
messageTcs2.TrySetResult(null);
};
{
var options = new HttpConnectionDispatcherOptions();
var context = MakeRequest("/foo", connection);
await dispatcher.ExecuteAsync(context, options, connectionDelegate).OrTimeout();
// second poll should have data
waitForMessageTcs1.SetResult(null);
await messageTcs1.Task.OrTimeout();
var ms = new MemoryStream();
context.Response.Body = ms;
// Now send the second poll
await dispatcher.ExecuteAsync(context, options, connectionDelegate).OrTimeout();
Assert.Equal("Message1", Encoding.UTF8.GetString(ms.ToArray()));
waitForMessageTcs2.SetResult(null);
await messageTcs2.Task.OrTimeout();
context = MakeRequest("/foo", connection);
ms.Seek(0, SeekOrigin.Begin);
context.Response.Body = ms;
// This is the third poll which gets the final message after the app is complete
await dispatcher.ExecuteAsync(context, options, connectionDelegate).OrTimeout();
Assert.Equal("Message2", Encoding.UTF8.GetString(ms.ToArray()));
}
}
}
[Fact]
public async Task NegotiateDoesNotReturnWebSocketsWhenNotAvailable()
{
@ -1987,12 +2265,12 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests
return context;
}
private static void SetTransport(HttpContext context, HttpTransportType transportType)
private static void SetTransport(HttpContext context, HttpTransportType transportType, SyncPoint sync = null)
{
switch (transportType)
{
case HttpTransportType.WebSockets:
context.Features.Set<IHttpWebSocketFeature>(new TestWebSocketConnectionFeature());
context.Features.Set<IHttpWebSocketFeature>(new TestWebSocketConnectionFeature(sync));
break;
case HttpTransportType.ServerSentEvents:
context.Request.Headers["Accept"] = "text/event-stream";

View File

@ -235,9 +235,6 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests
try
{
Assert.True(result.IsCompleted);
// We should be able to write
await connection.Transport.Output.WriteAsync(new byte[] { 1 });
}
finally
{
@ -248,13 +245,9 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests
connection.TransportTask = Task.Run(async () =>
{
var result = await connection.Application.Input.ReadAsync();
Assert.Equal(new byte[] { 1 }, result.Buffer.ToArray());
connection.Application.Input.AdvanceTo(result.Buffer.End);
result = await connection.Application.Input.ReadAsync();
try
{
Assert.True(result.IsCompleted);
Assert.True(result.IsCanceled);
}
finally
{

View File

@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests
var buffer = new ReadOnlySequence<byte>(Encoding.UTF8.GetBytes(payload));
var output = new MemoryStream();
await ServerSentEventsMessageFormatter.WriteMessageAsync(buffer, output);
await ServerSentEventsMessageFormatter.WriteMessageAsync(buffer, output, default);
Assert.Equal(encoded, Encoding.UTF8.GetString(output.ToArray()));
}
@ -32,7 +32,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests
var buffer = ReadOnlySequenceFactory.SegmentPerByteFactory.CreateWithContent(Encoding.UTF8.GetBytes(payload));
var output = new MemoryStream();
await ServerSentEventsMessageFormatter.WriteMessageAsync(buffer, output);
await ServerSentEventsMessageFormatter.WriteMessageAsync(buffer, output, default);
Assert.Equal(encoded, Encoding.UTF8.GetString(output.ToArray()));
}

View File

@ -5,11 +5,21 @@ using System.Threading;
using System.Threading.Channels;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Internal;
using Microsoft.AspNetCore.SignalR.Tests;
namespace Microsoft.AspNetCore.Http.Connections.Tests
{
internal class TestWebSocketConnectionFeature : IHttpWebSocketFeature, IDisposable
{
public TestWebSocketConnectionFeature()
{ }
public TestWebSocketConnectionFeature(SyncPoint sync)
{
_sync = sync;
}
private readonly SyncPoint _sync;
private readonly TaskCompletionSource<object> _accepted = new TaskCompletionSource<object>();
public bool IsWebSocketRequest => true;
@ -27,8 +37,8 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests
var clientToServer = Channel.CreateUnbounded<WebSocketMessage>();
var serverToClient = Channel.CreateUnbounded<WebSocketMessage>();
var clientSocket = new WebSocketChannel(serverToClient.Reader, clientToServer.Writer);
var serverSocket = new WebSocketChannel(clientToServer.Reader, serverToClient.Writer);
var clientSocket = new WebSocketChannel(serverToClient.Reader, clientToServer.Writer, _sync);
var serverSocket = new WebSocketChannel(clientToServer.Reader, serverToClient.Writer, _sync);
Client = clientSocket;
SubProtocol = context.SubProtocol;
@ -45,16 +55,18 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests
{
private readonly ChannelReader<WebSocketMessage> _input;
private readonly ChannelWriter<WebSocketMessage> _output;
private readonly SyncPoint _sync;
private WebSocketCloseStatus? _closeStatus;
private string _closeStatusDescription;
private WebSocketState _state;
private WebSocketMessage _internalBuffer = new WebSocketMessage();
public WebSocketChannel(ChannelReader<WebSocketMessage> input, ChannelWriter<WebSocketMessage> output)
public WebSocketChannel(ChannelReader<WebSocketMessage> input, ChannelWriter<WebSocketMessage> output, SyncPoint sync = null)
{
_input = input;
_output = output;
_sync = sync;
}
public override WebSocketCloseStatus? CloseStatus => _closeStatus;
@ -173,11 +185,17 @@ namespace Microsoft.AspNetCore.Http.Connections.Tests
throw new InvalidOperationException("Unexpected close");
}
public override Task SendAsync(ArraySegment<byte> buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken)
public override async Task SendAsync(ArraySegment<byte> buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken)
{
if (_sync != null)
{
await _sync.WaitToContinue();
}
cancellationToken.ThrowIfCancellationRequested();
var copy = new byte[buffer.Count];
Buffer.BlockCopy(buffer.Array, buffer.Offset, copy, 0, buffer.Count);
return SendMessageAsync(new WebSocketMessage
await SendMessageAsync(new WebSocketMessage
{
Buffer = copy,
MessageType = messageType,

View File

@ -74,7 +74,16 @@ namespace System.IO.Pipelines
_length += source.Length;
var task = _pipeWriter.WriteAsync(source);
if (!task.IsCompletedSuccessfully)
if (task.IsCompletedSuccessfully)
{
// Cancellation can be triggered by PipeWriter.CancelPendingFlush
if (task.Result.IsCanceled)
{
throw new OperationCanceledException();
}
}
else
{
return WriteSlowAsync(task);
}

View File

@ -37,9 +37,10 @@ namespace Microsoft.AspNetCore.SignalR.Tests
public TransferFormat ActiveFormat { get; set; }
public TestClient(IHubProtocol protocol = null, IInvocationBinder invocationBinder = null, string userIdentifier = null)
public TestClient(IHubProtocol protocol = null, IInvocationBinder invocationBinder = null, string userIdentifier = null, long pauseWriterThreshold = 32768)
{
var options = new PipeOptions(readerScheduler: PipeScheduler.Inline, writerScheduler: PipeScheduler.Inline, useSynchronizationContext: false);
var options = new PipeOptions(readerScheduler: PipeScheduler.Inline, writerScheduler: PipeScheduler.Inline, useSynchronizationContext: false,
pauseWriterThreshold: pauseWriterThreshold, resumeWriterThreshold: pauseWriterThreshold / 2);
var pair = DuplexPipe.CreateConnectionPair(options, options);
Connection = new DefaultConnectionContext(Guid.NewGuid().ToString(), pair.Transport, pair.Application);
@ -70,16 +71,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
{
if (sendHandshakeRequestMessage)
{
var memoryBufferWriter = MemoryBufferWriter.Get();
try
{
HandshakeProtocol.WriteRequestMessage(new HandshakeRequestMessage(_protocol.Name, _protocol.Version), memoryBufferWriter);
await Connection.Application.Output.WriteAsync(memoryBufferWriter.ToArray());
}
finally
{
MemoryBufferWriter.Return(memoryBufferWriter);
}
await Connection.Application.Output.WriteAsync(GetHandshakeRequestMessage());
}
var connection = handler.OnConnectedAsync(Connection);
@ -257,7 +249,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
}
else
{
// read first message out of the incoming data
// read first message out of the incoming data
if (HandshakeProtocol.TryParseResponseMessage(ref buffer, out var responseMessage))
{
return responseMessage;
@ -312,6 +304,20 @@ namespace Microsoft.AspNetCore.SignalR.Tests
}
}
public byte[] GetHandshakeRequestMessage()
{
var memoryBufferWriter = MemoryBufferWriter.Get();
try
{
HandshakeProtocol.WriteRequestMessage(new HandshakeRequestMessage(_protocol.Name, _protocol.Version), memoryBufferWriter);
return memoryBufferWriter.ToArray();
}
finally
{
MemoryBufferWriter.Return(memoryBufferWriter);
}
}
private class DefaultInvocationBinder : IInvocationBinder
{
public IReadOnlyList<Type> GetParameterTypes(string methodName)

View File

@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.SignalR.Microbenchmarks
_parser = new ServerSentEventsMessageParser();
_rawData = new ReadOnlySequence<byte>(protocol.GetMessageBytes(hubMessage));
var ms = new MemoryStream();
ServerSentEventsMessageFormatter.WriteMessageAsync(_rawData, ms).GetAwaiter().GetResult();
ServerSentEventsMessageFormatter.WriteMessageAsync(_rawData, ms, default).GetAwaiter().GetResult();
_sseFormattedData = ms.ToArray();
}
@ -81,7 +81,7 @@ namespace Microsoft.AspNetCore.SignalR.Microbenchmarks
[Benchmark]
public Task WriteSingleMessage()
{
return ServerSentEventsMessageFormatter.WriteMessageAsync(_rawData, Stream.Null);
return ServerSentEventsMessageFormatter.WriteMessageAsync(_rawData, Stream.Null, default);
}
public enum Message

View File

@ -82,10 +82,10 @@ namespace Microsoft.AspNetCore.SignalR
/// <inheritdoc />
public override Task SendAllAsync(string methodName, object[] args, CancellationToken cancellationToken = default)
{
return SendToAllConnections(methodName, args, null);
return SendToAllConnections(methodName, args, include: null, cancellationToken);
}
private Task SendToAllConnections(string methodName, object[] args, Func<HubConnectionContext, bool> include)
private Task SendToAllConnections(string methodName, object[] args, Func<HubConnectionContext, bool> include, CancellationToken cancellationToken)
{
List<Task> tasks = null;
SerializedHubMessage message = null;
@ -103,7 +103,7 @@ namespace Microsoft.AspNetCore.SignalR
message = CreateSerializedInvocationMessage(methodName, args);
}
var task = connection.WriteAsync(message);
var task = connection.WriteAsync(message, cancellationToken);
if (!task.IsCompletedSuccessfully)
{
@ -127,7 +127,8 @@ namespace Microsoft.AspNetCore.SignalR
// Tasks and message are passed by ref so they can be lazily created inside the method post-filtering,
// while still being re-usable when sending to multiple groups
private void SendToGroupConnections(string methodName, object[] args, ConcurrentDictionary<string, HubConnectionContext> connections, Func<HubConnectionContext, bool> include, ref List<Task> tasks, ref SerializedHubMessage message)
private void SendToGroupConnections(string methodName, object[] args, ConcurrentDictionary<string, HubConnectionContext> connections, Func<HubConnectionContext, bool> include,
ref List<Task> tasks, ref SerializedHubMessage message, CancellationToken cancellationToken)
{
// foreach over ConcurrentDictionary avoids allocating an enumerator
foreach (var connection in connections)
@ -142,7 +143,7 @@ namespace Microsoft.AspNetCore.SignalR
message = CreateSerializedInvocationMessage(methodName, args);
}
var task = connection.Value.WriteAsync(message);
var task = connection.Value.WriteAsync(message, cancellationToken);
if (!task.IsCompletedSuccessfully)
{
@ -175,7 +176,7 @@ namespace Microsoft.AspNetCore.SignalR
// Write message directly to connection without caching it in memory
var message = CreateInvocationMessage(methodName, args);
return connection.WriteAsync(message).AsTask();
return connection.WriteAsync(message, cancellationToken).AsTask();
}
/// <inheritdoc />
@ -193,7 +194,7 @@ namespace Microsoft.AspNetCore.SignalR
// group might be modified inbetween checking and sending
List<Task> tasks = null;
SerializedHubMessage message = null;
SendToGroupConnections(methodName, args, group, null, ref tasks, ref message);
SendToGroupConnections(methodName, args, group, null, ref tasks, ref message, cancellationToken);
if (tasks != null)
{
@ -221,7 +222,7 @@ namespace Microsoft.AspNetCore.SignalR
var group = _groups[groupName];
if (group != null)
{
SendToGroupConnections(methodName, args, group, null, ref tasks, ref message);
SendToGroupConnections(methodName, args, group, null, ref tasks, ref message, cancellationToken);
}
}
@ -247,7 +248,7 @@ namespace Microsoft.AspNetCore.SignalR
List<Task> tasks = null;
SerializedHubMessage message = null;
SendToGroupConnections(methodName, args, group, connection => !excludedConnectionIds.Contains(connection.ConnectionId), ref tasks, ref message);
SendToGroupConnections(methodName, args, group, connection => !excludedConnectionIds.Contains(connection.ConnectionId), ref tasks, ref message, cancellationToken);
if (tasks != null)
{
@ -271,7 +272,7 @@ namespace Microsoft.AspNetCore.SignalR
/// <inheritdoc />
public override Task SendUserAsync(string userId, string methodName, object[] args, CancellationToken cancellationToken = default)
{
return SendToAllConnections(methodName, args, connection => string.Equals(connection.UserIdentifier, userId, StringComparison.Ordinal));
return SendToAllConnections(methodName, args, connection => string.Equals(connection.UserIdentifier, userId, StringComparison.Ordinal), cancellationToken);
}
/// <inheritdoc />
@ -292,19 +293,19 @@ namespace Microsoft.AspNetCore.SignalR
/// <inheritdoc />
public override Task SendAllExceptAsync(string methodName, object[] args, IReadOnlyList<string> excludedConnectionIds, CancellationToken cancellationToken = default)
{
return SendToAllConnections(methodName, args, connection => !excludedConnectionIds.Contains(connection.ConnectionId));
return SendToAllConnections(methodName, args, connection => !excludedConnectionIds.Contains(connection.ConnectionId), cancellationToken);
}
/// <inheritdoc />
public override Task SendConnectionsAsync(IReadOnlyList<string> connectionIds, string methodName, object[] args, CancellationToken cancellationToken = default)
{
return SendToAllConnections(methodName, args, connection => connectionIds.Contains(connection.ConnectionId));
return SendToAllConnections(methodName, args, connection => connectionIds.Contains(connection.ConnectionId), cancellationToken);
}
/// <inheritdoc />
public override Task SendUsersAsync(IReadOnlyList<string> userIds, string methodName, object[] args, CancellationToken cancellationToken = default)
{
return SendToAllConnections(methodName, args, connection => userIds.Contains(connection.UserIdentifier));
return SendToAllConnections(methodName, args, connection => userIds.Contains(connection.UserIdentifier), cancellationToken);
}
}
}

View File

@ -34,6 +34,8 @@ namespace Microsoft.AspNetCore.SignalR
private readonly long _keepAliveInterval;
private readonly long _clientTimeoutInterval;
private readonly SemaphoreSlim _writeLock = new SemaphoreSlim(1);
private readonly bool _useAbsoluteClientTimeout;
private readonly object _receiveMessageTimeoutLock = new object();
private StreamTracker _streamTracker;
private long _lastSendTimeStamp = DateTime.UtcNow.Ticks;
@ -41,10 +43,13 @@ namespace Microsoft.AspNetCore.SignalR
private bool _receivedMessageThisInterval = false;
private ReadOnlyMemory<byte> _cachedPingMessage;
private bool _clientTimeoutActive;
private bool _connectionAborted;
private volatile bool _connectionAborted;
private volatile bool _allowReconnect = true;
private int _streamBufferCapacity;
private long? _maxMessageSize;
private bool _receivedMessageTimeoutEnabled = false;
private long _receivedMessageElapsedTicks = 0;
private long _receivedMessageTimestamp;
/// <summary>
/// Initializes a new instance of the <see cref="HubConnectionContext"/> class.
@ -64,6 +69,11 @@ namespace Microsoft.AspNetCore.SignalR
ConnectionAborted = _connectionAbortedTokenSource.Token;
HubCallerContext = new DefaultHubCallerContext(this);
if (AppContext.TryGetSwitch("Microsoft.AspNetCore.SignalR.UseAbsoluteClientTimeout", out var useAbsoluteClientTimeout))
{
_useAbsoluteClientTimeout = useAbsoluteClientTimeout;
}
}
internal StreamTracker StreamTracker
@ -131,7 +141,7 @@ namespace Microsoft.AspNetCore.SignalR
// Try to grab the lock synchronously, if we fail, go to the slower path
if (!_writeLock.Wait(0))
{
return new ValueTask(WriteSlowAsync(message));
return new ValueTask(WriteSlowAsync(message, cancellationToken));
}
if (_connectionAborted)
@ -141,7 +151,7 @@ namespace Microsoft.AspNetCore.SignalR
}
// This method should never throw synchronously
var task = WriteCore(message);
var task = WriteCore(message, cancellationToken);
// The write didn't complete synchronously so await completion
if (!task.IsCompletedSuccessfully)
@ -167,7 +177,7 @@ namespace Microsoft.AspNetCore.SignalR
// Try to grab the lock synchronously, if we fail, go to the slower path
if (!_writeLock.Wait(0))
{
return new ValueTask(WriteSlowAsync(message));
return new ValueTask(WriteSlowAsync(message, cancellationToken));
}
if (_connectionAborted)
@ -177,7 +187,7 @@ namespace Microsoft.AspNetCore.SignalR
}
// This method should never throw synchronously
var task = WriteCore(message);
var task = WriteCore(message, cancellationToken);
// The write didn't complete synchronously so await completion
if (!task.IsCompletedSuccessfully)
@ -191,7 +201,7 @@ namespace Microsoft.AspNetCore.SignalR
return default;
}
private ValueTask<FlushResult> WriteCore(HubMessage message)
private ValueTask<FlushResult> WriteCore(HubMessage message, CancellationToken cancellationToken)
{
try
{
@ -199,7 +209,7 @@ namespace Microsoft.AspNetCore.SignalR
// write it without caching.
Protocol.WriteMessage(message, _connectionContext.Transport.Output);
return _connectionContext.Transport.Output.FlushAsync();
return _connectionContext.Transport.Output.FlushAsync(cancellationToken);
}
catch (Exception ex)
{
@ -211,14 +221,14 @@ namespace Microsoft.AspNetCore.SignalR
}
}
private ValueTask<FlushResult> WriteCore(SerializedHubMessage message)
private ValueTask<FlushResult> WriteCore(SerializedHubMessage message, CancellationToken cancellationToken)
{
try
{
// Grab a preserialized buffer for this protocol.
var buffer = message.GetSerializedMessage(Protocol);
return _connectionContext.Transport.Output.WriteAsync(buffer);
return _connectionContext.Transport.Output.WriteAsync(buffer, cancellationToken);
}
catch (Exception ex)
{
@ -249,10 +259,10 @@ namespace Microsoft.AspNetCore.SignalR
}
}
private async Task WriteSlowAsync(HubMessage message)
private async Task WriteSlowAsync(HubMessage message, CancellationToken cancellationToken)
{
// Failed to get the lock immediately when entering WriteAsync so await until it is available
await _writeLock.WaitAsync();
await _writeLock.WaitAsync(cancellationToken);
try
{
@ -261,7 +271,7 @@ namespace Microsoft.AspNetCore.SignalR
return;
}
await WriteCore(message);
await WriteCore(message, cancellationToken);
}
catch (Exception ex)
{
@ -274,7 +284,7 @@ namespace Microsoft.AspNetCore.SignalR
}
}
private async Task WriteSlowAsync(SerializedHubMessage message)
private async Task WriteSlowAsync(SerializedHubMessage message, CancellationToken cancellationToken)
{
// Failed to get the lock immediately when entering WriteAsync so await until it is available
await _writeLock.WaitAsync();
@ -286,7 +296,7 @@ namespace Microsoft.AspNetCore.SignalR
return;
}
await WriteCore(message);
await WriteCore(message, cancellationToken);
}
catch (Exception ex)
{
@ -370,6 +380,9 @@ namespace Microsoft.AspNetCore.SignalR
private void AbortAllowReconnect()
{
_connectionAborted = true;
// Cancel any current writes or writes that are about to happen and have already gone past the _connectionAborted bool
// We have to do this outside of the lock otherwise it could hang if the write is observing backpressure
_connectionContext.Transport.Output.CancelPendingFlush();
// If we already triggered the token then noop, this isn't thread safe but it's good enough
// to avoid spawning a new task in the most common cases
@ -525,9 +538,23 @@ namespace Microsoft.AspNetCore.SignalR
internal Task AbortAsync()
{
AbortAllowReconnect();
// Acquire lock to make sure all writes are completed
if (!_writeLock.Wait(0))
{
return AbortAsyncSlow();
}
_writeLock.Release();
return _abortCompletedTcs.Task;
}
private async Task AbortAsyncSlow()
{
await _writeLock.WaitAsync();
_writeLock.Release();
await _abortCompletedTcs.Task;
}
private void KeepAliveTick()
{
var currentTime = DateTime.UtcNow.Ticks;
@ -564,17 +591,41 @@ namespace Microsoft.AspNetCore.SignalR
private void CheckClientTimeout()
{
// If it's been too long since we've heard from the client, then close this
if (DateTime.UtcNow.Ticks - Volatile.Read(ref _lastReceivedTimeStamp) > _clientTimeoutInterval)
if (Debugger.IsAttached)
{
if (!_receivedMessageThisInterval)
{
Log.ClientTimeout(_logger, TimeSpan.FromTicks(_clientTimeoutInterval));
AbortAllowReconnect();
}
return;
}
_receivedMessageThisInterval = false;
Volatile.Write(ref _lastReceivedTimeStamp, DateTime.UtcNow.Ticks);
if (_useAbsoluteClientTimeout)
{
// If it's been too long since we've heard from the client, then close this
if (DateTime.UtcNow.Ticks - Volatile.Read(ref _lastReceivedTimeStamp) > _clientTimeoutInterval)
{
if (!_receivedMessageThisInterval)
{
Log.ClientTimeout(_logger, TimeSpan.FromTicks(_clientTimeoutInterval));
AbortAllowReconnect();
}
_receivedMessageThisInterval = false;
Volatile.Write(ref _lastReceivedTimeStamp, DateTime.UtcNow.Ticks);
}
}
else
{
lock (_receiveMessageTimeoutLock)
{
if (_receivedMessageTimeoutEnabled)
{
_receivedMessageElapsedTicks = DateTime.UtcNow.Ticks - _receivedMessageTimestamp;
if (_receivedMessageElapsedTicks >= _clientTimeoutInterval)
{
Log.ClientTimeout(_logger, TimeSpan.FromTicks(_clientTimeoutInterval));
AbortAllowReconnect();
}
}
}
}
}
@ -623,6 +674,35 @@ namespace Microsoft.AspNetCore.SignalR
_receivedMessageThisInterval = true;
}
internal void BeginClientTimeout()
{
// check if new timeout behavior is in use
if (!_useAbsoluteClientTimeout)
{
lock (_receiveMessageTimeoutLock)
{
_receivedMessageTimeoutEnabled = true;
_receivedMessageTimestamp = DateTime.UtcNow.Ticks;
}
}
}
internal void StopClientTimeout()
{
// check if new timeout behavior is in use
if (!_useAbsoluteClientTimeout)
{
lock (_receiveMessageTimeoutLock)
{
// we received a message so stop the timer and reset it
// it will resume after the message has been processed
_receivedMessageElapsedTicks = 0;
_receivedMessageTimestamp = 0;
_receivedMessageTimeoutEnabled = false;
}
}
}
private static class Log
{
// Category: HubConnectionContext

View File

@ -213,6 +213,8 @@ namespace Microsoft.AspNetCore.SignalR
{
var input = connection.Input;
var protocol = connection.Protocol;
connection.BeginClientTimeout();
var binder = new HubConnectionBinder<THub>(_dispatcher, connection);
@ -221,6 +223,8 @@ namespace Microsoft.AspNetCore.SignalR
var result = await input.ReadAsync();
var buffer = result.Buffer;
connection.ResetClientTimeout();
try
{
if (result.IsCanceled)
@ -230,15 +234,21 @@ namespace Microsoft.AspNetCore.SignalR
if (!buffer.IsEmpty)
{
connection.ResetClientTimeout();
bool messageReceived = false;
// No message limit, just parse and dispatch
if (_maximumMessageSize == null)
{
while (protocol.TryParseMessage(ref buffer, binder, out var message))
{
messageReceived = true;
connection.StopClientTimeout();
await _dispatcher.DispatchMessageAsync(connection, message);
}
if (messageReceived)
{
connection.BeginClientTimeout();
}
}
else
{
@ -258,6 +268,9 @@ namespace Microsoft.AspNetCore.SignalR
if (protocol.TryParseMessage(ref segment, binder, out var message))
{
messageReceived = true;
connection.StopClientTimeout();
await _dispatcher.DispatchMessageAsync(connection, message);
}
else if (overLength)
@ -273,6 +286,11 @@ namespace Microsoft.AspNetCore.SignalR
// Update the buffer to the remaining segment
buffer = buffer.Slice(segment.Start);
}
if (messageReceived)
{
connection.BeginClientTimeout();
}
}
}

View File

@ -105,7 +105,7 @@ namespace Microsoft.AspNetCore.SignalR.Internal
public Task SendCoreAsync(string method, object[] args, CancellationToken cancellationToken = default)
{
return _lifetimeManager.SendAllAsync(method, args);
return _lifetimeManager.SendAllAsync(method, args, cancellationToken);
}
}

View File

@ -1,9 +1,14 @@
// 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.Generic;
using System.Threading.Tasks;
using System.Threading;
using Microsoft.AspNetCore.SignalR.Protocol;
using Microsoft.AspNetCore.SignalR.Specification.Tests;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.AspNetCore.SignalR.Specification.Tests;
using Xunit;
namespace Microsoft.AspNetCore.SignalR.Tests
{
@ -13,5 +18,241 @@ namespace Microsoft.AspNetCore.SignalR.Tests
{
return new DefaultHubLifetimeManager<MyHub>(new Logger<DefaultHubLifetimeManager<MyHub>>(NullLoggerFactory.Instance));
}
[Fact]
public async Task SendAllAsyncWillCancelWithToken()
{
using (var client1 = new TestClient())
using (var client2 = new TestClient(pauseWriterThreshold: 2))
{
var manager = CreateNewHubLifetimeManager();
var connection1 = HubConnectionContextUtils.Create(client1.Connection);
var connection2 = HubConnectionContextUtils.Create(client2.Connection);
await manager.OnConnectedAsync(connection1).OrTimeout();
await manager.OnConnectedAsync(connection2).OrTimeout();
var cts = new CancellationTokenSource();
var sendTask = manager.SendAllAsync("Hello", new object[] { "World" }, cts.Token).OrTimeout();
Assert.False(sendTask.IsCompleted);
cts.Cancel();
await sendTask.OrTimeout();
var message = Assert.IsType<InvocationMessage>(client1.TryRead());
Assert.Equal("Hello", message.Target);
Assert.Single(message.Arguments);
Assert.Equal("World", (string)message.Arguments[0]);
var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
connection2.ConnectionAborted.Register(t =>
{
((TaskCompletionSource<object>)t).SetResult(null);
}, tcs);
await tcs.Task.OrTimeout();
Assert.False(connection1.ConnectionAborted.IsCancellationRequested);
}
}
[Fact]
public async Task SendAllExceptAsyncWillCancelWithToken()
{
using (var client1 = new TestClient())
using (var client2 = new TestClient(pauseWriterThreshold: 2))
{
var manager = CreateNewHubLifetimeManager();
var connection1 = HubConnectionContextUtils.Create(client1.Connection);
var connection2 = HubConnectionContextUtils.Create(client2.Connection);
await manager.OnConnectedAsync(connection1).OrTimeout();
await manager.OnConnectedAsync(connection2).OrTimeout();
var cts = new CancellationTokenSource();
var sendTask = manager.SendAllExceptAsync("Hello", new object[] { "World" }, new List<string> { connection1.ConnectionId }, cts.Token).OrTimeout();
Assert.False(sendTask.IsCompleted);
cts.Cancel();
await sendTask.OrTimeout();
var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
connection2.ConnectionAborted.Register(t =>
{
((TaskCompletionSource<object>)t).SetResult(null);
}, tcs);
await tcs.Task.OrTimeout();
Assert.False(connection1.ConnectionAborted.IsCancellationRequested);
Assert.Null(client1.TryRead());
}
}
[Fact]
public async Task SendConnectionAsyncWillCancelWithToken()
{
using (var client1 = new TestClient(pauseWriterThreshold: 2))
{
var manager = CreateNewHubLifetimeManager();
var connection1 = HubConnectionContextUtils.Create(client1.Connection);
await manager.OnConnectedAsync(connection1).OrTimeout();
var cts = new CancellationTokenSource();
var sendTask = manager.SendConnectionAsync(connection1.ConnectionId, "Hello", new object[] { "World" }, cts.Token).OrTimeout();
Assert.False(sendTask.IsCompleted);
cts.Cancel();
await sendTask.OrTimeout();
var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
connection1.ConnectionAborted.Register(t =>
{
((TaskCompletionSource<object>)t).SetResult(null);
}, tcs);
await tcs.Task.OrTimeout();
}
}
[Fact]
public async Task SendConnectionsAsyncWillCancelWithToken()
{
using (var client1 = new TestClient(pauseWriterThreshold: 2))
{
var manager = CreateNewHubLifetimeManager();
var connection1 = HubConnectionContextUtils.Create(client1.Connection);
await manager.OnConnectedAsync(connection1).OrTimeout();
var cts = new CancellationTokenSource();
var sendTask = manager.SendConnectionsAsync(new List<string> { connection1.ConnectionId }, "Hello", new object[] { "World" }, cts.Token).OrTimeout();
Assert.False(sendTask.IsCompleted);
cts.Cancel();
await sendTask.OrTimeout();
var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
connection1.ConnectionAborted.Register(t =>
{
((TaskCompletionSource<object>)t).SetResult(null);
}, tcs);
await tcs.Task.OrTimeout();
}
}
[Fact]
public async Task SendGroupAsyncWillCancelWithToken()
{
using (var client1 = new TestClient(pauseWriterThreshold: 2))
{
var manager = CreateNewHubLifetimeManager();
var connection1 = HubConnectionContextUtils.Create(client1.Connection);
await manager.OnConnectedAsync(connection1).OrTimeout();
await manager.AddToGroupAsync(connection1.ConnectionId, "group").OrTimeout();
var cts = new CancellationTokenSource();
var sendTask = manager.SendGroupAsync("group", "Hello", new object[] { "World" }, cts.Token).OrTimeout();
Assert.False(sendTask.IsCompleted);
cts.Cancel();
await sendTask.OrTimeout();
var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
connection1.ConnectionAborted.Register(t =>
{
((TaskCompletionSource<object>)t).SetResult(null);
}, tcs);
await tcs.Task.OrTimeout();
}
}
[Fact]
public async Task SendGroupExceptAsyncWillCancelWithToken()
{
using (var client1 = new TestClient())
using (var client2 = new TestClient(pauseWriterThreshold: 2))
{
var manager = CreateNewHubLifetimeManager();
var connection1 = HubConnectionContextUtils.Create(client1.Connection);
var connection2 = HubConnectionContextUtils.Create(client2.Connection);
await manager.OnConnectedAsync(connection1).OrTimeout();
await manager.OnConnectedAsync(connection2).OrTimeout();
await manager.AddToGroupAsync(connection1.ConnectionId, "group").OrTimeout();
await manager.AddToGroupAsync(connection2.ConnectionId, "group").OrTimeout();
var cts = new CancellationTokenSource();
var sendTask = manager.SendGroupExceptAsync("group", "Hello", new object[] { "World" }, new List<string> { connection1.ConnectionId }, cts.Token).OrTimeout();
Assert.False(sendTask.IsCompleted);
cts.Cancel();
await sendTask.OrTimeout();
var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
connection2.ConnectionAborted.Register(t =>
{
((TaskCompletionSource<object>)t).SetResult(null);
}, tcs);
await tcs.Task.OrTimeout();
Assert.False(connection1.ConnectionAborted.IsCancellationRequested);
Assert.Null(client1.TryRead());
}
}
[Fact]
public async Task SendGroupsAsyncWillCancelWithToken()
{
using (var client1 = new TestClient(pauseWriterThreshold: 2))
{
var manager = CreateNewHubLifetimeManager();
var connection1 = HubConnectionContextUtils.Create(client1.Connection);
await manager.OnConnectedAsync(connection1).OrTimeout();
await manager.AddToGroupAsync(connection1.ConnectionId, "group").OrTimeout();
var cts = new CancellationTokenSource();
var sendTask = manager.SendGroupsAsync(new List<string> { "group" }, "Hello", new object[] { "World" }, cts.Token).OrTimeout();
Assert.False(sendTask.IsCompleted);
cts.Cancel();
await sendTask.OrTimeout();
var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
connection1.ConnectionAborted.Register(t =>
{
((TaskCompletionSource<object>)t).SetResult(null);
}, tcs);
await tcs.Task.OrTimeout();
}
}
[Fact]
public async Task SendUserAsyncWillCancelWithToken()
{
using (var client1 = new TestClient())
using (var client2 = new TestClient(pauseWriterThreshold: 2))
{
var manager = CreateNewHubLifetimeManager();
var connection1 = HubConnectionContextUtils.Create(client1.Connection, userIdentifier: "user");
var connection2 = HubConnectionContextUtils.Create(client2.Connection, userIdentifier: "user");
await manager.OnConnectedAsync(connection1).OrTimeout();
await manager.OnConnectedAsync(connection2).OrTimeout();
var cts = new CancellationTokenSource();
var sendTask = manager.SendUserAsync("user", "Hello", new object[] { "World" }, cts.Token).OrTimeout();
Assert.False(sendTask.IsCompleted);
cts.Cancel();
await sendTask.OrTimeout();
var message = Assert.IsType<InvocationMessage>(client1.TryRead());
Assert.Equal("Hello", message.Target);
Assert.Single(message.Arguments);
Assert.Equal("World", (string)message.Arguments[0]);
var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
connection2.ConnectionAborted.Register(t =>
{
((TaskCompletionSource<object>)t).SetResult(null);
}, tcs);
await tcs.Task.OrTimeout();
Assert.False(connection1.ConnectionAborted.IsCancellationRequested);
}
}
[Fact]
public async Task SendUsersAsyncWillCancelWithToken()
{
using (var client1 = new TestClient())
using (var client2 = new TestClient(pauseWriterThreshold: 2))
{
var manager = CreateNewHubLifetimeManager();
var connection1 = HubConnectionContextUtils.Create(client1.Connection, userIdentifier: "user1");
var connection2 = HubConnectionContextUtils.Create(client2.Connection, userIdentifier: "user2");
await manager.OnConnectedAsync(connection1).OrTimeout();
await manager.OnConnectedAsync(connection2).OrTimeout();
var cts = new CancellationTokenSource();
var sendTask = manager.SendUsersAsync(new List<string> { "user1", "user2" }, "Hello", new object[] { "World" }, cts.Token).OrTimeout();
Assert.False(sendTask.IsCompleted);
cts.Cancel();
await sendTask.OrTimeout();
var message = Assert.IsType<InvocationMessage>(client1.TryRead());
Assert.Equal("Hello", message.Target);
Assert.Single(message.Arguments);
Assert.Equal("World", (string)message.Arguments[0]);
var tcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
connection2.ConnectionAborted.Register(t =>
{
((TaskCompletionSource<object>)t).SetResult(null);
}, tcs);
await tcs.Task.OrTimeout();
Assert.False(connection1.ConnectionAborted.IsCancellationRequested);
}
}
}
}

View File

@ -2797,6 +2797,47 @@ namespace Microsoft.AspNetCore.SignalR.Tests
}
}
[Fact]
public async Task HubMethodInvokeDoesNotCountTowardsClientTimeout()
{
using (StartVerifiableLog())
{
var tcsService = new TcsService();
var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(services =>
{
services.Configure<HubOptions>(options =>
options.ClientTimeoutInterval = TimeSpan.FromMilliseconds(0));
services.AddSingleton(tcsService);
}, LoggerFactory);
var connectionHandler = serviceProvider.GetService<HubConnectionHandler<LongRunningHub>>();
using (var client = new TestClient(new JsonHubProtocol()))
{
var connectionHandlerTask = await client.ConnectAsync(connectionHandler);
// This starts the timeout logic
await client.SendHubMessageAsync(PingMessage.Instance);
// Call long running hub method
var hubMethodTask = client.InvokeAsync(nameof(LongRunningHub.LongRunningMethod));
await tcsService.StartedMethod.Task.OrTimeout();
// Tick heartbeat while hub method is running to show that close isn't triggered
client.TickHeartbeat();
// Unblock long running hub method
tcsService.EndMethod.SetResult(null);
await hubMethodTask.OrTimeout();
// Tick heartbeat again now that we're outside of the hub method
client.TickHeartbeat();
// Connection is closed
await connectionHandlerTask.OrTimeout();
}
}
}
[Fact]
public async Task EndingConnectionSendsCloseMessageWithNoError()
{