Merge branch 'master' into merge/release/3.0-preview4-to-master

This commit is contained in:
Doug Bunting 2019-04-16 11:35:02 -07:00 committed by GitHub
commit 4977a4d196
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
369 changed files with 7313 additions and 29841 deletions

View File

@ -303,15 +303,10 @@ jobs:
displayName: Install SQL Server 2016 Express LocalDB
- powershell: "& ./src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/Servers/IIS/tools/update_schema.ps1"
displayName: Setup IISExpress test certificates and schema
- powershell: "& ./.azure/pipelines/tools/SetupTestEnvironment.ps1 Setup signalrclienttests.exe"
displayName: Start AppVerifier
afterBuild:
- powershell: "& ./build.ps1 -CI -NoBuild -Test /p:RunFlakyTests=true"
displayName: Run Flaky Tests
continueOnError: true
- powershell: "& ./.azure/pipelines/tools/SetupTestEnvironment.ps1 Shutdown signalrclienttests.exe"
displayName: Stop AppVerifier
condition: always()
artifacts:
- name: Windows_Test_Logs
path: artifacts/logs/

View File

@ -189,13 +189,21 @@ jobs:
buildConfiguration: $(BuildConfiguration)
buildPlatform: $(AgentOsName)
- task: PublishTestResults@2
displayName: Publish junit test results
displayName: Publish js test results
condition: always()
inputs:
testRunner: junit
testResultsFiles: '**/artifacts/logs/**/*.junit.xml'
buildConfiguration: $(BuildConfiguration)
buildPlatform: $(AgentOsName)
- task: PublishTestResults@2
displayName: Publish Java test results
condition: always()
inputs:
testRunner: junit
testResultsFiles: '**/TEST-com.microsoft.signalr*.xml'
buildConfiguration: $(BuildConfiguration)
buildPlatform: $(AgentOsName)
- ${{ each artifact in parameters.artifacts }}:
- task: PublishBuildArtifacts@1
displayName: Upload artifacts from ${{ artifact.path }}

View File

@ -14,11 +14,4 @@ jobs:
agentOs: Windows
jobName: SignalRDailyTests
jobDisplayName: "SignalR Daily Tests"
beforeBuild:
- powershell: "& ./.azure/pipelines/tools/SetupTestEnvironment.ps1 Setup signalrclienttests.exe"
displayName: Start AppVerifier
afterBuild:
- powershell: "& ./.azure/pipelines/tools/SetupTestEnvironment.ps1 Shutdown signalrclienttests.exe"
displayName: Stop AppVerifier
condition: always()

30
.github/CODEOWNERS vendored
View File

@ -1,18 +1,18 @@
# Users referenced in this file will automatically be requested as reviewers for PRs that modify the given paths.
# See https://help.github.com/articles/about-code-owners/
/.azure/ @dougbu
/.config/ @dougbu
/build/ @dougbu
/eng/ @dougbu
/src/Components/ @SteveSandersonMS
/src/DefaultBuilder/ @tratcher @anurse
/src/Hosting/ @tratcher @anurse
/src/Http/ @tratcher @jkotalik @anurse
/src/Middleware/ @tratcher @anurse
/src/ProjectTemplates/ @ryanbrandenburg
/src/Security/ @tratcher @anurse
/src/Servers/ @tratcher @jkotalik @anurse
/src/Middleware/Rewrite @jkotalik @anurse
/src/Middleware/HttpsPolicy @jkotalik @anurse
/src/SignalR/ @mikaelm12 @BrennanConroy @halter73 @anurse
/.azure/ @aspnet/build
/.config/ @aspnet/build
/build/ @aspnet/build
/eng/ @aspnet/build
/src/Components/ @SteveSandersonMS
/src/DefaultBuilder/ @tratcher @anurse
/src/Hosting/ @tratcher @anurse
/src/Http/ @tratcher @jkotalik @anurse
/src/Middleware/ @tratcher @anurse
/src/ProjectTemplates/ @ryanbrandenburg
/src/Security/ @tratcher @anurse
/src/Servers/ @tratcher @jkotalik @anurse
/src/Middleware/Rewrite @jkotalik @anurse
/src/Middleware/HttpsPolicy @jkotalik @anurse
/src/SignalR/ @mikaelm12 @BrennanConroy @halter73 @anurse

View File

@ -98,6 +98,35 @@
</ItemGroup>
<!-- Copied from https://github.com/dotnet/arcade/blob/9d0fd805448082c8d55e2434607b481bca70a146/src/Microsoft.DotNet.Arcade.Sdk/tools/RepositoryInfo.targets#L12-L38 -->
<Target Name="_TranslateAzureDevOpsUrlToGitHubUrl"
DependsOnTargets="$(SourceControlManagerUrlTranslationTargets)"
BeforeTargets="SourceControlManagerPublishTranslatedUrls">
<!-- The convention for names of Azure DevOps repositories mirrored from GitHub is "{GitHub org name}-{GitHub repository name}" -->
<PropertyGroup>
<!-- There are quite a few git repo forms:
https://dnceng@dev.azure.com/dnceng/internal/_git/dotnet-arcade-services
https://dev.azure.com/dnceng/internal/_git/dotnet-arcade-services
https://dnceng.visualstudio.com/internal/_git/dotnet-arcade-services
dnceng@vs-ssh.visualstudio.com:v3/dnceng/internal/dotnet-arcade-services
git@ssh.dev.azure.com:v3/dnceng/internal/dotnet-arcade-services
-->
<_Pattern>(https://dnceng%40dev\.azure\.com/dnceng/internal/_git|https://dev\.azure\.com/dnceng/internal/_git|https://dnceng\.visualstudio\.com/internal/_git|dnceng%40vs-ssh\.visualstudio\.com:v3/dnceng/internal|git%40ssh\.dev\.azure\.com:v3/dnceng/internal)/([^/-]+)-(.+)</_Pattern>
<_Replacement>https://github.com/$2/$3</_Replacement>
</PropertyGroup>
<PropertyGroup>
<ScmRepositoryUrl>$([System.Text.RegularExpressions.Regex]::Replace($(ScmRepositoryUrl), $(_Pattern), $(_Replacement)))</ScmRepositoryUrl>
</PropertyGroup>
<ItemGroup>
<SourceRoot Update="@(SourceRoot)">
<ScmRepositoryUrl>$([System.Text.RegularExpressions.Regex]::Replace(%(SourceRoot.ScmRepositoryUrl), $(_Pattern), $(_Replacement)))</ScmRepositoryUrl>
</SourceRoot>
</ItemGroup>
</Target>
<Import Project="eng\Workarounds.targets" />
<Import Project="eng\targets\ResolveIisReferences.targets" Condition=" '$(MSBuildProjectExtension)' != '.vcxproj' " />
<Import Project="eng\targets\Cpp.Common.targets" Condition="'$(MSBuildProjectExtension)' == '.vcxproj'" />

View File

@ -54,8 +54,6 @@
$(RepositoryRoot)src\Tools\dotnet-watch\test\TestProjects\**\*.csproj;
$(RepositoryRoot)src\Razor\Razor.Design\test\testassets\**\*.*proj;
$(RepositoryRoot)src\submodules\**\*.*proj;
$(RepositoryRoot)src\SignalR\clients\cpp\samples\**\*.*proj;
$(RepositoryRoot)src\SignalR\clients\cpp\test\signalrclient-testhost\**\*.*proj;
$(RepositoryRoot)src\Installers\**\*.*proj;
$(RepositoryRoot)src\SignalR\clients\ts\**\node_modules\**\*.*proj;
$(RepositoryRoot)src\Components\Blazor\Templates\src\content\**\*.*proj;

View File

@ -20,6 +20,7 @@
https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json;
https://dotnet.myget.org/F/blazor-dev/api/v3/index.json;
https://dotnet.myget.org/F/dotnet-core/api/v3/index.json;
https://dotnet.myget.org/F/nuget-build/api/v3/index.json;
https://dotnet.myget.org/F/roslyn-tools/api/v3/index.json;
https://dotnet.myget.org/F/roslyn/api/v3/index.json;
https://vside.myget.org/F/devcore/api/v3/index.json;

View File

@ -12,7 +12,7 @@
<ItemGroup>
<PackageReference Remove="Internal.AspNetCore.Sdk" />
<PackageReference Include="NuGet.Build.Tasks" Version="4.9.3" />
<PackageReference Include="NuGet.Build.Tasks" Version="5.1.0-rtm.5921" />
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="2.1.0" />
<PackageReference Include="Yarn.MSBuild" Version="1.13.0" />
</ItemGroup>

17
docs/BuildErrors.md Normal file
View File

@ -0,0 +1,17 @@
Build Errors
------------
This document is for common build errors and how to resolve them.
### Warning BUILD001
> warning BUILD001: Package references changed since the last release...
This warning indicates a breaking change might have been made to a package or assembly due to the removal of a reference which was used
in a previous release of this assembly. See <./ReferenceResolution.md> for how to suppress.
### Error BUILD002
> error BUILD002: Package references changed since the last release...
Similar to BUILD001, but this error is not suppressable. This error only appears in servicing builds, which should not change references between assemblies or packages.

View File

@ -19,9 +19,8 @@ Building ASP.NET Core on Windows requires:
PS> ./eng/scripts/InstallVisualStudio.ps1
```
* Git. <https://git-scm.org>
* (Optional) some optional components, like the SignalR Java client, may require
* NodeJS. LTS version of 10.14.2 or newer recommended <https://nodejs.org>
* Java Development Kit (JDK) v8 with Java Runtime Environment (JRE) v8. See https://www.oracle.com/technetwork/java/javase/downloads/index.html
* NodeJS. LTS version of 10.14.2 or newer <https://nodejs.org>
* Java Development Kit (JDK) v8 with Java Runtime Environment (JRE) v8. See https://www.oracle.com/technetwork/java/javase/downloads/index.html
### macOS/Linux
@ -31,11 +30,10 @@ Building ASP.NET Core on macOS or Linux requires:
* If using Linux, you need a machine with all .NET Core Linux prerequisites: <https://docs.microsoft.com/en-us/dotnet/core/linux-prerequisites>
* At least 10 GB of disk space and a good internet connection (our build scripts download a lot of tools and dependencies)
* Git <https://git-scm.org>
* (Optional) some optional components, like the SignalR Java client, may require
* NodeJS. LTS version of 10.14.2 or newer recommended <https://nodejs.org>
* Java Development Kit 10 or newer. Either:
* OpenJDK <http://jdk.java.net/10/>
* Oracle's JDK <https://www.oracle.com/technetwork/java/javase/downloads/index.html>
* NodeJS. LTS version of 10.14.2 or newer <https://nodejs.org>
* Java Development Kit 10 or newer. Either:
* OpenJDK <http://jdk.java.net/10/>
* Oracle's JDK <https://www.oracle.com/technetwork/java/javase/downloads/index.html>
## Clone the source code

View File

@ -14,6 +14,10 @@ If you want to download the latest daily build and use it in a project, then you
<packageSources>
<clear />
<add key="dotnet-core" value="https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json" />
<add key="extensions" value="https://dotnetfeed.blob.core.windows.net/aspnet-extensions/index.json" />
<add key="entityframeworkcore" value="https://dotnetfeed.blob.core.windows.net/aspnet-entityframeworkcore/index.json" />
<add key="aspnetcore-tooling" value="https://dotnetfeed.blob.core.windows.net/aspnet-aspnetcore-tooling/index.json" />
<add key="aspnetcore" value="https://dotnetfeed.blob.core.windows.net/aspnet-aspnetcore/index.json" />
<add key="NuGet.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>
</configuration>
@ -23,3 +27,10 @@ If you want to download the latest daily build and use it in a project, then you
Some features, such as new target frameworks, may require prerelease tooling builds for Visual Studio.
These are available in the [Visual Studio Preview](https://www.visualstudio.com/vs/preview/).
#### To debug daily builds using Visual Studio
* *Enable Source Link support* in Visual Studio should be enabled.
* *Enable source server support* in Visual should be enabled.
* *Enable Just My Code* should be disabled
* Add https://dotnet.myget.org/F/aspnetcore-dev/symbols to the list of symbol servers in the Visual Studio Debugging options

View File

@ -25,6 +25,7 @@ The requirements that led to this system are:
* Name the .csproj file to match the assembly name.
* Run `build.cmd /t:GenerateProjectList` when adding new projects
* Use [eng/tools/BaseLineGenerator/](/eng/tools/BaselineGenerator/README.md) if you need to update baselines.
* If you need to make a breaking change to dependencies, you may need to add `<SuppressBaselineReference>`.
## Important files
@ -67,3 +68,16 @@ Steps for adding a new package dependency to an existing project. Let's say I'm
If you don't know the commit hash of the source code used to produce "0.0.1-beta-1", you can use `000000` as a placeholder for `Sha`
as its value is unimportant and will be updated the next time the bot runs.
## Example: make a breaking change to references
If Microsoft.AspNetCore.Banana in 2.1 had a reference to `Microsoft.AspNetCore.Orange`, but in 3.0 this reference is changing to `Microsoft.AspNetCore.BetterThanOrange`, you would need to make these changes to the .csproj file
```diff
<!-- in Microsoft.AspNetCore.Banana.csproj -->
<ItemGroup>
- <Reference Include="Microsoft.AspNetCore.Orange" /> <!-- the old dependency -->
+ <Reference Include="Microsoft.AspNetCore.BetterThanOrange" /> <!-- the new dependency -->
+ <SuppressBaselineReference Include="Microsoft.AspNetCore.Orange" /> <!-- suppress as a known breaking change -->
</ItemGroup>
```

View File

@ -2,7 +2,7 @@
<Project>
<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
<AspNetCoreBaselineVersion>2.2.3</AspNetCoreBaselineVersion>
<AspNetCoreBaselineVersion>2.2.4</AspNetCoreBaselineVersion>
</PropertyGroup>
<!-- Package: dotnet-dev-certs-->
<PropertyGroup Condition=" '$(PackageId)' == 'dotnet-dev-certs' ">
@ -81,7 +81,7 @@
</PropertyGroup>
<!-- Package: Microsoft.AspNetCore.AspNetCoreModuleV2-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.AspNetCoreModuleV2' ">
<BaselinePackageVersion>2.2.2</BaselinePackageVersion>
<BaselinePackageVersion>2.2.4</BaselinePackageVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.AspNetCoreModuleV2' AND '$(TargetFramework)' == 'netcoreapp2.2' " />
<!-- Package: Microsoft.AspNetCore.Authentication.Abstractions-->

View File

@ -4,7 +4,7 @@ This file contains a list of all the packages and their versions which were rele
build of ASP.NET Core 2.2.x. Update this list when preparing for a new patch.
-->
<Baseline Version="2.2.3">
<Baseline Version="2.2.4">
<Package Id="dotnet-dev-certs" Version="2.2.0" />
<Package Id="dotnet-sql-cache" Version="2.2.0" />
<Package Id="dotnet-user-secrets" Version="2.2.0" />
@ -13,7 +13,7 @@ build of ASP.NET Core 2.2.x. Update this list when preparing for a new patch.
<Package Id="Microsoft.AspNetCore.ApiAuthorization.IdentityServer" Version="2.2.0-preview-35687" />
<Package Id="Microsoft.AspNetCore.ApplicationInsights.HostingStartup" Version="2.2.0" />
<Package Id="Microsoft.AspNetCore.AspNetCoreModule" Version="2.2.1" />
<Package Id="Microsoft.AspNetCore.AspNetCoreModuleV2" Version="2.2.2" />
<Package Id="Microsoft.AspNetCore.AspNetCoreModuleV2" Version="2.2.4" />
<Package Id="Microsoft.AspNetCore.Authentication.Abstractions" Version="2.2.0" />
<Package Id="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="2.2.0" />
<Package Id="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" Version="2.2.0" />

View File

@ -36,6 +36,15 @@ Later on, this will be checked using this condition:
<PropertyGroup Condition=" '$(VersionPrefix)' == '2.2.4' ">
<PackagesInPatch>
@aspnet/signalr;
Microsoft.AspNetCore.AspNetCoreModuleV2;
</PackagesInPatch>
</PropertyGroup>
<PropertyGroup Condition=" '$(VersionPrefix)' == '2.2.5' ">
<PackagesInPatch>
Microsoft.AspNetCore.AspNetCoreModule;
Microsoft.AspNetCore.AspNetCoreModuleV2;
java:signalr;
</PackagesInPatch>
</PropertyGroup>
</Project>

View File

@ -119,6 +119,7 @@
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Http.Connections.Client" ProjectPath="$(RepositoryRoot)src\SignalR\clients\csharp\Http.Connections.Client\src\Microsoft.AspNetCore.Http.Connections.Client.csproj" RefProjectPath="$(RepositoryRoot)src\SignalR\clients\csharp\Http.Connections.Client\ref\Microsoft.AspNetCore.Http.Connections.Client.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Http.Connections.Common" ProjectPath="$(RepositoryRoot)src\SignalR\common\Http.Connections.Common\src\Microsoft.AspNetCore.Http.Connections.Common.csproj" RefProjectPath="$(RepositoryRoot)src\SignalR\common\Http.Connections.Common\ref\Microsoft.AspNetCore.Http.Connections.Common.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Http.Connections" ProjectPath="$(RepositoryRoot)src\SignalR\common\Http.Connections\src\Microsoft.AspNetCore.Http.Connections.csproj" RefProjectPath="$(RepositoryRoot)src\SignalR\common\Http.Connections\ref\Microsoft.AspNetCore.Http.Connections.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR.Protocols.Json" ProjectPath="$(RepositoryRoot)src\SignalR\common\Protocols.Json\src\Microsoft.AspNetCore.SignalR.Protocols.Json.csproj" RefProjectPath="$(RepositoryRoot)src\SignalR\common\Protocols.Json\ref\Microsoft.AspNetCore.SignalR.Protocols.Json.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" ProjectPath="$(RepositoryRoot)src\SignalR\common\Protocols.MessagePack\src\Microsoft.AspNetCore.SignalR.Protocols.MessagePack.csproj" RefProjectPath="$(RepositoryRoot)src\SignalR\common\Protocols.MessagePack\ref\Microsoft.AspNetCore.SignalR.Protocols.MessagePack.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" ProjectPath="$(RepositoryRoot)src\SignalR\common\Protocols.NewtonsoftJson\src\Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson.csproj" RefProjectPath="$(RepositoryRoot)src\SignalR\common\Protocols.NewtonsoftJson\ref\Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR.Common" ProjectPath="$(RepositoryRoot)src\SignalR\common\SignalR.Common\src\Microsoft.AspNetCore.SignalR.Common.csproj" RefProjectPath="$(RepositoryRoot)src\SignalR\common\SignalR.Common\ref\Microsoft.AspNetCore.SignalR.Common.csproj" />

View File

@ -11,6 +11,7 @@
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Http.Features" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Connections.Abstractions" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Http.Connections.Common" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.SignalR.Protocols.Json" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.SignalR.Common" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Components.Browser" />

View File

@ -9,384 +9,384 @@
-->
<Dependencies>
<ProductDependencies>
<Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="3.0.0-preview4.19216.2">
<Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="3.0.0-preview5.19214.1">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>5ec5b0c8894e758ef2a41fd534746500bbcf00ad</Sha>
<Sha>d4ef2a1d4a68428e29a86cafc24837a45aef7e0d</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="3.0.0-preview4.19216.2">
<Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="3.0.0-preview5.19214.1">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>5ec5b0c8894e758ef2a41fd534746500bbcf00ad</Sha>
<Sha>d4ef2a1d4a68428e29a86cafc24837a45aef7e0d</Sha>
</Dependency>
<Dependency Name="Microsoft.CodeAnalysis.Razor" Version="3.0.0-preview4.19216.2">
<Dependency Name="Microsoft.CodeAnalysis.Razor" Version="3.0.0-preview5.19214.1">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>5ec5b0c8894e758ef2a41fd534746500bbcf00ad</Sha>
<Sha>d4ef2a1d4a68428e29a86cafc24837a45aef7e0d</Sha>
</Dependency>
<Dependency Name="Microsoft.NET.Sdk.Razor" Version="3.0.0-preview4.19216.2">
<Dependency Name="Microsoft.NET.Sdk.Razor" Version="3.0.0-preview5.19214.1">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>5ec5b0c8894e758ef2a41fd534746500bbcf00ad</Sha>
<Sha>d4ef2a1d4a68428e29a86cafc24837a45aef7e0d</Sha>
</Dependency>
<Dependency Name="dotnet-ef" Version="3.0.0-preview4.19216.3">
<Dependency Name="dotnet-ef" Version="3.0.0-preview5.19213.2">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha>
<Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="3.0.0-preview4.19216.3">
<Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="3.0.0-preview5.19213.2">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha>
<Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="3.0.0-preview4.19216.3">
<Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="3.0.0-preview5.19213.2">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha>
<Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0-preview4.19216.3">
<Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0-preview5.19213.2">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha>
<Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview4.19216.3">
<Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview5.19213.2">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha>
<Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0-preview4.19216.3">
<Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0-preview5.19213.2">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha>
<Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore" Version="3.0.0-preview4.19216.3">
<Dependency Name="Microsoft.EntityFrameworkCore" Version="3.0.0-preview5.19213.2">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha>
<Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.ActivatorUtilities.Sources" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.ActivatorUtilities.Sources" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.Memory" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Caching.Memory" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.CommandLineUtils.Sources" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.CommandLineUtils.Sources" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Json" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.Json" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.KeyPerFile" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.KeyPerFile" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DependencyInjection" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.DependencyInjection" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Embedded" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.FileProviders.Embedded" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.HashCodeCombiner.Sources" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.HashCodeCombiner.Sources" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Hosting" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Hosting" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Http" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Http" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Localization.Abstractions" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Localization.Abstractions" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Localization" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Localization" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Console" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.Console" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Debug" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.Debug" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Testing" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.Testing" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.ObjectPool" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.ObjectPool" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Options" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Options" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.ParameterDefaultValue.Sources" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.ParameterDefaultValue.Sources" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Primitives" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Primitives" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.TypeNameHelper.Sources" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.TypeNameHelper.Sources" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.ValueStopwatch.Sources" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.ValueStopwatch.Sources" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.WebEncoders" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.WebEncoders" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Internal.Extensions.Refs" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Internal.Extensions.Refs" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.JSInterop" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.JSInterop" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Mono.WebAssembly.Interop" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Mono.WebAssembly.Interop" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.Bcl.Json.Sources" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="Microsoft.Bcl.Json.Sources" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="Microsoft.CSharp" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="Microsoft.CSharp" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="Microsoft.Win32.Registry" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="Microsoft.Win32.Registry" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.ComponentModel.Annotations" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.ComponentModel.Annotations" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.Data.SqlClient" Version="4.7.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Data.SqlClient" Version="4.7.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.Diagnostics.EventLog" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Diagnostics.EventLog" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.IO.Pipelines" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.IO.Pipelines" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.Net.Http.WinHttpHandler" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Net.Http.WinHttpHandler" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.Reflection.Metadata" Version="1.7.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Reflection.Metadata" Version="1.7.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.Security.Cryptography.Cng" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Security.Cryptography.Cng" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.Security.Cryptography.Pkcs" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Security.Cryptography.Pkcs" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.Security.Cryptography.Xml" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Security.Cryptography.Xml" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.Security.Permissions" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Security.Permissions" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.Security.Principal.Windows" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Security.Principal.Windows" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.ServiceProcess.ServiceController" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.ServiceProcess.ServiceController" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.Text.Encodings.Web" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Text.Encodings.Web" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="System.Threading.Channels" Version="4.6.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Threading.Channels" Version="4.6.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DependencyModel" Version="3.0.0-preview4-27615-11" CoherentParentDependency="Microsoft.Extensions.Logging">
<Dependency Name="Microsoft.Extensions.DependencyModel" Version="3.0.0-preview5-27611-18" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>ee54d4cbd2b305eadf6f341bdc9d4abccdb50559</Sha>
<Sha>b159f4bf9614203a0c60a20f5469d5226f3f12e7</Sha>
</Dependency>
<Dependency Name="Microsoft.NETCore.App" Version="3.0.0-preview4-27615-11" CoherentParentDependency="Microsoft.Extensions.Logging">
<Dependency Name="Microsoft.NETCore.App" Version="3.0.0-preview5-27611-18" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>ee54d4cbd2b305eadf6f341bdc9d4abccdb50559</Sha>
<Sha>b159f4bf9614203a0c60a20f5469d5226f3f12e7</Sha>
</Dependency>
</ProductDependencies>
<ToolsetDependencies>
<!-- Listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
<Dependency Name="Microsoft.NETCore.Platforms" Version="3.0.0-preview4.19212.13" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="Microsoft.NETCore.Platforms" Version="3.0.0-preview5.19211.22" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha>
<Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency>
<Dependency Name="Internal.AspNetCore.Analyzers" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Internal.AspNetCore.Analyzers" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
<Dependency Name="Microsoft.DotNet.GenAPI" Version="1.0.0-beta.19207.1">
<Dependency Name="Microsoft.DotNet.GenAPI" Version="1.0.0-beta.19215.12">
<Uri>https://github.com/dotnet/arcade</Uri>
<Sha>b1f9e12fe3ee71c48ea60b15968745850ac0a4a7</Sha>
<Sha>517bf671ea342965d007aa48f5bfd4926e58d582</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Testing" Version="3.0.0-preview4.19216.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.AspNetCore.Testing" Version="3.0.0-preview5.19212.9" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha>
<Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency>
</ToolsetDependencies>
</Dependencies>

View File

@ -17,106 +17,106 @@
-->
<PropertyGroup Label="Automated">
<!-- Packages from dotnet/arcade -->
<MicrosoftDotNetGenAPIPackageVersion>1.0.0-beta.19207.1</MicrosoftDotNetGenAPIPackageVersion>
<MicrosoftDotNetGenAPIPackageVersion>1.0.0-beta.19215.12</MicrosoftDotNetGenAPIPackageVersion>
<!-- Packages from dotnet/core-setup -->
<MicrosoftExtensionsDependencyModelPackageVersion>3.0.0-preview4-27615-11</MicrosoftExtensionsDependencyModelPackageVersion>
<MicrosoftNETCoreAppPackageVersion>3.0.0-preview4-27615-11</MicrosoftNETCoreAppPackageVersion>
<MicrosoftExtensionsDependencyModelPackageVersion>3.0.0-preview5-27611-18</MicrosoftExtensionsDependencyModelPackageVersion>
<MicrosoftNETCoreAppPackageVersion>3.0.0-preview5-27611-18</MicrosoftNETCoreAppPackageVersion>
<!-- Packages from dotnet/corefx -->
<MicrosoftBclJsonSourcesPackageVersion>4.6.0-preview4.19212.13</MicrosoftBclJsonSourcesPackageVersion>
<MicrosoftCSharpPackageVersion>4.6.0-preview4.19212.13</MicrosoftCSharpPackageVersion>
<MicrosoftWin32RegistryPackageVersion>4.6.0-preview4.19212.13</MicrosoftWin32RegistryPackageVersion>
<SystemComponentModelAnnotationsPackageVersion>4.6.0-preview4.19212.13</SystemComponentModelAnnotationsPackageVersion>
<SystemDataSqlClientPackageVersion>4.7.0-preview4.19212.13</SystemDataSqlClientPackageVersion>
<SystemDiagnosticsEventLogPackageVersion>4.6.0-preview4.19212.13</SystemDiagnosticsEventLogPackageVersion>
<SystemIOPipelinesPackageVersion>4.6.0-preview4.19212.13</SystemIOPipelinesPackageVersion>
<SystemNetHttpWinHttpHandlerPackageVersion>4.6.0-preview4.19212.13</SystemNetHttpWinHttpHandlerPackageVersion>
<SystemNetWebSocketsWebSocketProtocolPackageVersion>4.6.0-preview4.19212.13</SystemNetWebSocketsWebSocketProtocolPackageVersion>
<SystemReflectionMetadataPackageVersion>1.7.0-preview4.19212.13</SystemReflectionMetadataPackageVersion>
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.6.0-preview4.19212.13</SystemRuntimeCompilerServicesUnsafePackageVersion>
<SystemSecurityCryptographyCngPackageVersion>4.6.0-preview4.19212.13</SystemSecurityCryptographyCngPackageVersion>
<SystemSecurityCryptographyPkcsPackageVersion>4.6.0-preview4.19212.13</SystemSecurityCryptographyPkcsPackageVersion>
<SystemSecurityCryptographyXmlPackageVersion>4.6.0-preview4.19212.13</SystemSecurityCryptographyXmlPackageVersion>
<SystemSecurityPermissionsPackageVersion>4.6.0-preview4.19212.13</SystemSecurityPermissionsPackageVersion>
<SystemSecurityPrincipalWindowsPackageVersion>4.6.0-preview4.19212.13</SystemSecurityPrincipalWindowsPackageVersion>
<SystemServiceProcessServiceControllerPackageVersion>4.6.0-preview4.19212.13</SystemServiceProcessServiceControllerPackageVersion>
<SystemTextEncodingsWebPackageVersion>4.6.0-preview4.19212.13</SystemTextEncodingsWebPackageVersion>
<SystemThreadingChannelsPackageVersion>4.6.0-preview4.19212.13</SystemThreadingChannelsPackageVersion>
<MicrosoftBclJsonSourcesPackageVersion>4.6.0-preview5.19211.22</MicrosoftBclJsonSourcesPackageVersion>
<MicrosoftCSharpPackageVersion>4.6.0-preview5.19211.22</MicrosoftCSharpPackageVersion>
<MicrosoftWin32RegistryPackageVersion>4.6.0-preview5.19211.22</MicrosoftWin32RegistryPackageVersion>
<SystemComponentModelAnnotationsPackageVersion>4.6.0-preview5.19211.22</SystemComponentModelAnnotationsPackageVersion>
<SystemDataSqlClientPackageVersion>4.7.0-preview5.19211.22</SystemDataSqlClientPackageVersion>
<SystemDiagnosticsEventLogPackageVersion>4.6.0-preview5.19211.22</SystemDiagnosticsEventLogPackageVersion>
<SystemIOPipelinesPackageVersion>4.6.0-preview5.19211.22</SystemIOPipelinesPackageVersion>
<SystemNetHttpWinHttpHandlerPackageVersion>4.6.0-preview5.19211.22</SystemNetHttpWinHttpHandlerPackageVersion>
<SystemNetWebSocketsWebSocketProtocolPackageVersion>4.6.0-preview5.19211.22</SystemNetWebSocketsWebSocketProtocolPackageVersion>
<SystemReflectionMetadataPackageVersion>1.7.0-preview5.19211.22</SystemReflectionMetadataPackageVersion>
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.6.0-preview5.19211.22</SystemRuntimeCompilerServicesUnsafePackageVersion>
<SystemSecurityCryptographyCngPackageVersion>4.6.0-preview5.19211.22</SystemSecurityCryptographyCngPackageVersion>
<SystemSecurityCryptographyPkcsPackageVersion>4.6.0-preview5.19211.22</SystemSecurityCryptographyPkcsPackageVersion>
<SystemSecurityCryptographyXmlPackageVersion>4.6.0-preview5.19211.22</SystemSecurityCryptographyXmlPackageVersion>
<SystemSecurityPermissionsPackageVersion>4.6.0-preview5.19211.22</SystemSecurityPermissionsPackageVersion>
<SystemSecurityPrincipalWindowsPackageVersion>4.6.0-preview5.19211.22</SystemSecurityPrincipalWindowsPackageVersion>
<SystemServiceProcessServiceControllerPackageVersion>4.6.0-preview5.19211.22</SystemServiceProcessServiceControllerPackageVersion>
<SystemTextEncodingsWebPackageVersion>4.6.0-preview5.19211.22</SystemTextEncodingsWebPackageVersion>
<SystemThreadingChannelsPackageVersion>4.6.0-preview5.19211.22</SystemThreadingChannelsPackageVersion>
<!-- Only listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
<MicrosoftNETCorePlatformsPackageVersion>3.0.0-preview4.19212.13</MicrosoftNETCorePlatformsPackageVersion>
<MicrosoftNETCorePlatformsPackageVersion>3.0.0-preview5.19211.22</MicrosoftNETCorePlatformsPackageVersion>
<!-- Packages from aspnet/Extensions -->
<InternalAspNetCoreAnalyzersPackageVersion>3.0.0-preview4.19216.2</InternalAspNetCoreAnalyzersPackageVersion>
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.0.0-preview4.19216.2</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>3.0.0-preview4.19216.2</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
<MicrosoftAspNetCoreTestingPackageVersion>3.0.0-preview4.19216.2</MicrosoftAspNetCoreTestingPackageVersion>
<MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>
<MicrosoftExtensionsCachingAbstractionsPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsCachingAbstractionsPackageVersion>
<MicrosoftExtensionsCachingMemoryPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsCachingMemoryPackageVersion>
<MicrosoftExtensionsCachingSqlServerPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsCachingSqlServerPackageVersion>
<MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>
<MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>
<MicrosoftExtensionsConfigurationAbstractionsPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
<MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>
<MicrosoftExtensionsConfigurationBinderPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsConfigurationBinderPackageVersion>
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
<MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>
<MicrosoftExtensionsConfigurationIniPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsConfigurationIniPackageVersion>
<MicrosoftExtensionsConfigurationJsonPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsConfigurationJsonPackageVersion>
<MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>
<MicrosoftExtensionsConfigurationPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsConfigurationPackageVersion>
<MicrosoftExtensionsConfigurationUserSecretsPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsConfigurationUserSecretsPackageVersion>
<MicrosoftExtensionsConfigurationXmlPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsConfigurationXmlPackageVersion>
<MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>
<MicrosoftExtensionsDependencyInjectionPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsDependencyInjectionPackageVersion>
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
<MicrosoftExtensionsFileProvidersCompositePackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsFileProvidersCompositePackageVersion>
<MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>
<MicrosoftExtensionsFileProvidersPhysicalPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsFileProvidersPhysicalPackageVersion>
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
<MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>
<MicrosoftExtensionsHostingAbstractionsPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsHostingAbstractionsPackageVersion>
<MicrosoftExtensionsHostingPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsHostingPackageVersion>
<MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>
<MicrosoftExtensionsHttpPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsHttpPackageVersion>
<MicrosoftExtensionsLocalizationAbstractionsPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsLocalizationAbstractionsPackageVersion>
<MicrosoftExtensionsLocalizationPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsLocalizationPackageVersion>
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
<MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>
<MicrosoftExtensionsLoggingConfigurationPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsLoggingConfigurationPackageVersion>
<MicrosoftExtensionsLoggingConsolePackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsLoggingConsolePackageVersion>
<MicrosoftExtensionsLoggingDebugPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsLoggingDebugPackageVersion>
<MicrosoftExtensionsLoggingEventSourcePackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsLoggingEventSourcePackageVersion>
<MicrosoftExtensionsLoggingPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsLoggingPackageVersion>
<MicrosoftExtensionsLoggingTestingPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsLoggingTestingPackageVersion>
<MicrosoftExtensionsLoggingTraceSourcePackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsLoggingTraceSourcePackageVersion>
<MicrosoftExtensionsObjectPoolPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsObjectPoolPackageVersion>
<MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>
<MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>
<MicrosoftExtensionsOptionsPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsOptionsPackageVersion>
<MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>
<MicrosoftExtensionsPrimitivesPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsPrimitivesPackageVersion>
<MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>
<MicrosoftExtensionsValueStopwatchSourcesPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsValueStopwatchSourcesPackageVersion>
<MicrosoftExtensionsWebEncodersPackageVersion>3.0.0-preview4.19216.2</MicrosoftExtensionsWebEncodersPackageVersion>
<MicrosoftInternalExtensionsRefsPackageVersion>3.0.0-preview4.19216.2</MicrosoftInternalExtensionsRefsPackageVersion>
<MicrosoftJSInteropPackageVersion>3.0.0-preview4.19216.2</MicrosoftJSInteropPackageVersion>
<MonoWebAssemblyInteropPackageVersion>3.0.0-preview4.19216.2</MonoWebAssemblyInteropPackageVersion>
<InternalAspNetCoreAnalyzersPackageVersion>3.0.0-preview5.19212.9</InternalAspNetCoreAnalyzersPackageVersion>
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.0.0-preview5.19212.9</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>3.0.0-preview5.19212.9</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
<MicrosoftAspNetCoreTestingPackageVersion>3.0.0-preview5.19212.9</MicrosoftAspNetCoreTestingPackageVersion>
<MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>
<MicrosoftExtensionsCachingAbstractionsPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsCachingAbstractionsPackageVersion>
<MicrosoftExtensionsCachingMemoryPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsCachingMemoryPackageVersion>
<MicrosoftExtensionsCachingSqlServerPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsCachingSqlServerPackageVersion>
<MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>
<MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>
<MicrosoftExtensionsConfigurationAbstractionsPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
<MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>
<MicrosoftExtensionsConfigurationBinderPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsConfigurationBinderPackageVersion>
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
<MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>
<MicrosoftExtensionsConfigurationIniPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsConfigurationIniPackageVersion>
<MicrosoftExtensionsConfigurationJsonPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsConfigurationJsonPackageVersion>
<MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>
<MicrosoftExtensionsConfigurationPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsConfigurationPackageVersion>
<MicrosoftExtensionsConfigurationUserSecretsPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsConfigurationUserSecretsPackageVersion>
<MicrosoftExtensionsConfigurationXmlPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsConfigurationXmlPackageVersion>
<MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>
<MicrosoftExtensionsDependencyInjectionPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsDependencyInjectionPackageVersion>
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
<MicrosoftExtensionsFileProvidersCompositePackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsFileProvidersCompositePackageVersion>
<MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>
<MicrosoftExtensionsFileProvidersPhysicalPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsFileProvidersPhysicalPackageVersion>
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
<MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>
<MicrosoftExtensionsHostingAbstractionsPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsHostingAbstractionsPackageVersion>
<MicrosoftExtensionsHostingPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsHostingPackageVersion>
<MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>
<MicrosoftExtensionsHttpPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsHttpPackageVersion>
<MicrosoftExtensionsLocalizationAbstractionsPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsLocalizationAbstractionsPackageVersion>
<MicrosoftExtensionsLocalizationPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsLocalizationPackageVersion>
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
<MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>
<MicrosoftExtensionsLoggingConfigurationPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsLoggingConfigurationPackageVersion>
<MicrosoftExtensionsLoggingConsolePackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsLoggingConsolePackageVersion>
<MicrosoftExtensionsLoggingDebugPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsLoggingDebugPackageVersion>
<MicrosoftExtensionsLoggingEventSourcePackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsLoggingEventSourcePackageVersion>
<MicrosoftExtensionsLoggingPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsLoggingPackageVersion>
<MicrosoftExtensionsLoggingTestingPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsLoggingTestingPackageVersion>
<MicrosoftExtensionsLoggingTraceSourcePackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsLoggingTraceSourcePackageVersion>
<MicrosoftExtensionsObjectPoolPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsObjectPoolPackageVersion>
<MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>
<MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>
<MicrosoftExtensionsOptionsPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsOptionsPackageVersion>
<MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>
<MicrosoftExtensionsPrimitivesPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsPrimitivesPackageVersion>
<MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>
<MicrosoftExtensionsValueStopwatchSourcesPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsValueStopwatchSourcesPackageVersion>
<MicrosoftExtensionsWebEncodersPackageVersion>3.0.0-preview5.19212.9</MicrosoftExtensionsWebEncodersPackageVersion>
<MicrosoftInternalExtensionsRefsPackageVersion>3.0.0-preview5.19212.9</MicrosoftInternalExtensionsRefsPackageVersion>
<MicrosoftJSInteropPackageVersion>3.0.0-preview5.19212.9</MicrosoftJSInteropPackageVersion>
<MonoWebAssemblyInteropPackageVersion>3.0.0-preview5.19212.9</MonoWebAssemblyInteropPackageVersion>
<!-- Packages from aspnet/EntityFrameworkCore -->
<dotnetefPackageVersion>3.0.0-preview4.19216.3</dotnetefPackageVersion>
<MicrosoftEntityFrameworkCoreInMemoryPackageVersion>3.0.0-preview4.19216.3</MicrosoftEntityFrameworkCoreInMemoryPackageVersion>
<MicrosoftEntityFrameworkCoreRelationalPackageVersion>3.0.0-preview4.19216.3</MicrosoftEntityFrameworkCoreRelationalPackageVersion>
<MicrosoftEntityFrameworkCoreSqlitePackageVersion>3.0.0-preview4.19216.3</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
<MicrosoftEntityFrameworkCoreSqlServerPackageVersion>3.0.0-preview4.19216.3</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
<MicrosoftEntityFrameworkCoreToolsPackageVersion>3.0.0-preview4.19216.3</MicrosoftEntityFrameworkCoreToolsPackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>3.0.0-preview4.19216.3</MicrosoftEntityFrameworkCorePackageVersion>
<dotnetefPackageVersion>3.0.0-preview5.19213.2</dotnetefPackageVersion>
<MicrosoftEntityFrameworkCoreInMemoryPackageVersion>3.0.0-preview5.19213.2</MicrosoftEntityFrameworkCoreInMemoryPackageVersion>
<MicrosoftEntityFrameworkCoreRelationalPackageVersion>3.0.0-preview5.19213.2</MicrosoftEntityFrameworkCoreRelationalPackageVersion>
<MicrosoftEntityFrameworkCoreSqlitePackageVersion>3.0.0-preview5.19213.2</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
<MicrosoftEntityFrameworkCoreSqlServerPackageVersion>3.0.0-preview5.19213.2</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
<MicrosoftEntityFrameworkCoreToolsPackageVersion>3.0.0-preview5.19213.2</MicrosoftEntityFrameworkCoreToolsPackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>3.0.0-preview5.19213.2</MicrosoftEntityFrameworkCorePackageVersion>
<!-- Packages from aspnet/AspNetCore-Tooling -->
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.0.0-preview4.19216.2</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
<MicrosoftAspNetCoreRazorLanguagePackageVersion>3.0.0-preview4.19216.2</MicrosoftAspNetCoreRazorLanguagePackageVersion>
<MicrosoftCodeAnalysisRazorPackageVersion>3.0.0-preview4.19216.2</MicrosoftCodeAnalysisRazorPackageVersion>
<MicrosoftNETSdkRazorPackageVersion>3.0.0-preview4.19216.2</MicrosoftNETSdkRazorPackageVersion>
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.0.0-preview5.19214.1</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
<MicrosoftAspNetCoreRazorLanguagePackageVersion>3.0.0-preview5.19214.1</MicrosoftAspNetCoreRazorLanguagePackageVersion>
<MicrosoftCodeAnalysisRazorPackageVersion>3.0.0-preview5.19214.1</MicrosoftCodeAnalysisRazorPackageVersion>
<MicrosoftNETSdkRazorPackageVersion>3.0.0-preview5.19214.1</MicrosoftNETSdkRazorPackageVersion>
</PropertyGroup>
<!--

View File

@ -25,7 +25,6 @@
.\InstallVisualStudio.ps1
#>
[CmdletBinding(DefaultParameterSetName = 'Default')]
param(
[ValidateSet('BuildTools','Community', 'Professional', 'Enterprise')]
[string]$Edition = 'Enterprise',
@ -35,8 +34,8 @@ param(
)
if ($Passive -and $Quiet) {
Write-Host "The -Passive and -Quiet options cannot be used together." -f Red
Write-Host "Run ``Get-Help $PSCommandPath`` for more details." -f Red
Write-Host -ForegroundColor Red "Error: The -Passive and -Quiet options cannot be used together."
Write-Host -ForegroundColor Red "Run ``Get-Help $PSCommandPath`` for more details."
exit 1
}
@ -98,15 +97,61 @@ if ($Quiet) {
$arguments += '--quiet', '--wait'
}
Write-Host ""
Write-Host
Write-Host "Installing Visual Studio 2019 $Edition" -f Magenta
Write-Host ""
Write-Host
Write-Host "Running '$bootstrapper $arguments'"
$process = Start-Process -FilePath "$bootstrapper" -ArgumentList $arguments `
-PassThru -RedirectStandardError "$intermedateDir\errors.txt" -Verbose -Wait
if ($process.ExitCode -ne 0) {
Get-Content "$intermedateDir\errors.txt" | Write-Error
foreach ($i in 0, 1, 2) {
if ($i -ne 0) {
Write-Host "Retrying..."
}
$process = Start-Process -FilePath "$bootstrapper" -ArgumentList $arguments -ErrorAction Continue -PassThru `
-RedirectStandardError "$intermedateDir\errors.txt" -Verbose -Wait
Write-Host "Exit code = $($process.ExitCode)."
if ($process.ExitCode -eq 0) {
break
} else {
# https://docs.microsoft.com/en-us/visualstudio/install/use-command-line-parameters-to-install-visual-studio#error-codes
if ($process.ExitCode -eq 3010) {
Write-Host -ForegroundColor Red "Error: Installation requires restart to finish the VS update."
break
}
elseif ($process.ExitCode -eq 5007) {
Write-Host -ForegroundColor Red "Error: Operation was blocked - the computer does not meet the requirements."
break
}
elseif (($process.ExitCode -eq 5004) -or ($process.ExitCode -eq 1602)) {
Write-Host -ForegroundColor Red "Error: Operation was canceled."
}
else {
Write-Host -ForegroundColor Red "Error: Installation failed for an unknown reason."
}
Write-Host
Write-Host "Errors:"
Get-Content "$intermedateDir\errors.txt" | Write-Warning
Write-Host
Get-ChildItem $env:Temp\dd_bootstrapper_*.log |Sort-Object CreationTime -Descending |Select-Object -First 1 |% {
Write-Host "${_}:"
Get-Content "$_"
Write-Host
}
$clientLogs = Get-ChildItem $env:Temp\dd_client_*.log |Sort-Object CreationTime -Descending |Select-Object -First 1 |% {
Write-Host "${_}:"
Get-Content "$_"
Write-Host
}
$setupLogs = Get-ChildItem $env:Temp\dd_setup_*.log |Sort-Object CreationTime -Descending |Select-Object -First 1 |% {
Write-Host "${_}:"
Get-Content "$_"
Write-Host
}
}
}
Remove-Item "$intermedateDir\errors.txt" -errorAction SilentlyContinue

View File

@ -18,12 +18,7 @@
<Target Name="Restore">
<Message Importance="High" Text="Running yarn install on $(MSBuildProjectFullPath)" />
<Yarn Command="install $(InstallArgs)" ContinueOnError="true">
<Output TaskParameter="ExitCode" PropertyName="_YarnExitCode"/>
</Yarn>
<Yarn Command="install $(InstallArgs)" Condition="'$(_YarnExitCode)' != '0'">
<Output TaskParameter="ExitCode" PropertyName="_YarnExitCode"/>
</Yarn>
<Yarn Command="install $(InstallArgs)" />
</Target>
<Target Name="PrepareForBuild">

View File

@ -148,6 +148,8 @@
<!-- Identify if any references were present in the last release of this package, but have been removed. -->
<UnusedBaselinePackageReference Include="@(BaselinePackageReference)" Exclude="@(Reference);@(_ProjectReferenceByAssemblyName);@(PackageReference)" />
<!-- Only allow suppressing baseline changes in non-servicing builds. -->
<UnusedBaselinePackageReference Remove="@(SuppressBaselineReference)" Condition="'$(IsServicingBuild)' != 'true'"/>
<!--
MSBuild does not provide a way to join on matching identities in a Condition,
@ -201,8 +203,13 @@
<_ExplicitPackageReference Remove="@(_ExplicitPackageReference)" />
</ItemGroup>
<Warning Condition="@(UnusedBaselinePackageReference->Count()) != 0"
Text="Package references changed since the last release. This could be a breaking change. References removed:%0A - @(UnusedBaselinePackageReference, '%0A -')" />
<Warning Condition="'$(IsReferenceAssemblyProject)' != 'true' AND '$(IsServicingBuild)' != 'true' AND '%(UnusedBaselinePackageReference.Identity)' != ''"
Code="BUILD001"
Text="Reference to '%(UnusedBaselinePackageReference.Identity)' was removed since the last stable release of this package. This could be a breaking change. See docs/ReferenceResolution.md for instructions on how to update changes to references or suppress this warning if the error was intentional." />
<Error Condition="'$(IsReferenceAssemblyProject)' != 'true' AND '$(IsServicingBuild)' == 'true' AND @(UnusedBaselinePackageReference->Count()) != 0"
Code="BUILD002"
Text="Package references changed since the last release. This could be a breaking change and is not allowed in a servicing update. References removed:%0A - @(UnusedBaselinePackageReference, '%0A -')" />
<Error Condition="'$(TargetFrameworkIdentifier)' != '.NETFramework' AND '%(Reference.Identity)' != '' AND ! Exists('%(Reference.Identity)') AND '$(DisablePackageReferenceRestrictions)' != 'true'"
Code="MSB3245"

View File

@ -1,6 +1,6 @@
{
"sdk": {
"version": "3.0.100-preview4-010309"
"version": "3.0.100-preview4-011136"
},
"msbuild-sdks": {
"Yarn.MSBuild": "1.13.0"

View File

@ -1,2 +1,2 @@
version:3.0.0-build-20190322.1
commithash:c38761a564c72b5bc96356ec99c89de5f281a358
version:3.0.0-build-20190412.2
commithash:0e543fb8761394491250585d3811bdbb62e350e8

View File

@ -2,8 +2,6 @@
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<!-- https://github.com/aspnet/AspNetCore/issues/6549 -->
<BuildHelixPayload>false</BuildHelixPayload>
</PropertyGroup>
<ItemGroup>
@ -19,5 +17,25 @@
<Reference Include="Microsoft.Extensions.Logging.Testing" />
</ItemGroup>
<Target Name="PublishAssets" AfterTargets="Publish">
<ItemGroup>
<_PublishFiles Include="$(MSBuildThisFileDirectory)..\testassets\AzureAD.WebSite\bin\$(Configuration)\netcoreapp3.0\AzureAD.WebSite.deps.json" />
</ItemGroup>
<Copy
SourceFiles="@(_PublishFiles)"
DestinationFolder="$(PublishDir)" />
<!-- Drop a dummy sln to specify content root location -->
<WriteLinesToFile
File="$(PublishDir)\contentroot.sln"
Lines="Ignored"
Overwrite="true"
Encoding="Unicode"/>
<WriteLinesToFile
File="$(PublishDir)\AzureAD.WebSite\ignored.txt"
Lines="Ignored"
Overwrite="true"
Encoding="Unicode"/>
</Target>
<Import Project="$(MvcTestingTargets)" Condition="'$(MvcTestingTargets)' != ''" />
</Project>

View File

@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Components.Forms
[Parameter] public Expression<Func<T>> For { get; private set; }
/// <summary>`
/// Constructs an instance of <see cref="ValidationSummary"/>.
/// Constructs an instance of <see cref="ValidationMessage{T}"/>.
/// </summary>
public ValidationMessage()
{

View File

@ -10,6 +10,7 @@
<Reference Include="Microsoft.AspNetCore.Mvc.Components.Prerendering" />
<Reference Include="Microsoft.AspNetCore.Components.Server" />
<Reference Include="Microsoft.AspNetCore.Mvc" />
<Reference Include="Newtonsoft.Json" />
<ProjectReference Include="..\ComponentsApp.App\ComponentsApp.App.csproj" />
</ItemGroup>

View File

@ -268,7 +268,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
// _builder.ConfigureContainer<T>(ConfigureContainer);
typeof(IHostBuilder).GetMethods().First(m => m.Name == nameof(IHostBuilder.ConfigureContainer))
.MakeGenericMethod(containerType)
.Invoke(_builder, new object[] { configureCallback });
.InvokeWithoutWrappingExceptions(_builder, new object[] { configureCallback });
}
// Resolve Configure after calling ConfigureServices and ConfigureContainer

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Globalization;
using System.Reflection;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
@ -52,8 +53,9 @@ namespace Microsoft.AspNetCore.Hosting.Internal
}
}
}
MethodInfo.Invoke(instance, parameters);
MethodInfo.InvokeWithoutWrappingExceptions(instance, parameters);
}
}
}
}
}

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// 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;
@ -46,7 +46,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
var arguments = new object[1] { container };
MethodInfo.Invoke(instance, arguments);
MethodInfo.InvokeWithoutWrappingExceptions(instance, arguments);
}
}
}
}

View File

@ -50,7 +50,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
arguments[0] = services;
}
return MethodInfo.Invoke(instance, arguments) as IServiceProvider;
return MethodInfo.InvokeWithoutWrappingExceptions(instance, arguments) as IServiceProvider;
}
}
}
}

View File

@ -273,6 +273,8 @@ namespace Microsoft.AspNetCore.Hosting.Internal
}
}
_diagnosticListener.OnActivityImport(activity, httpContext);
if (_diagnosticListener.IsEnabled(ActivityStartKey))
{
_diagnosticListener.StartActivity(activity, new { HttpContext = httpContext });

View File

@ -0,0 +1,20 @@
// 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.Reflection;
namespace Microsoft.AspNetCore.Hosting.Internal
{
internal static class MethodInfoExtensions
{
// This version of MethodInfo.Invoke removes TargetInvocationExceptions
public static object InvokeWithoutWrappingExceptions(this MethodInfo methodInfo, object obj, object[] parameters)
{
// These are the default arguments passed when methodInfo.Invoke(obj, parameters) are called. We do the same
// here but specify BindingFlags.DoNotWrapExceptions to avoid getting TAE (TargetInvocationException)
// methodInfo.Invoke(obj, BindingFlags.Default, binder: null, parameters: parameters, culture: null)
return methodInfo.Invoke(obj, BindingFlags.DoNotWrapExceptions, binder: null, parameters: parameters, culture: null);
}
}
}

View File

@ -175,6 +175,10 @@ namespace Microsoft.AspNetCore.Hosting
{
host.Initialize();
// resolve configuration explicitly once to mark it as resolved within the
// service provider, ensuring it will be properly disposed with the provider
_ = host.Services.GetService<IConfiguration>();
var logger = host.Services.GetRequiredService<ILogger<WebHost>>();
// Warn about duplicate HostingStartupAssemblies
@ -264,12 +268,13 @@ namespace Microsoft.AspNetCore.Hosting
var builder = new ConfigurationBuilder()
.SetBasePath(_hostingEnvironment.ContentRootPath)
.AddConfiguration(_config);
.AddConfiguration(_config, shouldDisposeConfiguration: true);
_configureAppConfigurationBuilder?.Invoke(_context, builder);
var configuration = builder.Build();
services.AddSingleton<IConfiguration>(configuration);
// register configuration as factory to make it dispose with the service provider
services.AddSingleton<IConfiguration>(_ => configuration);
_context.Configuration = configuration;
var listener = new DiagnosticListener("Microsoft.AspNetCore");

View File

@ -11,8 +11,6 @@ using Microsoft.AspNetCore.Hosting.Internal;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.ObjectPool;
using Microsoft.Extensions.Options;
using Moq;
using Xunit;
@ -304,6 +302,34 @@ namespace Microsoft.AspNetCore.Hosting.Tests
Assert.Contains(Activity.Current.Baggage, pair => pair.Key == "Key2" && pair.Value == "value2");
}
[Fact]
public void ActivityOnExportHookIsCalled()
{
var diagnosticSource = new DiagnosticListener("DummySource");
var hostingApplication = CreateApplication(out var features, diagnosticSource: diagnosticSource);
bool onActivityImportCalled = false;
diagnosticSource.Subscribe(
observer: new CallbackDiagnosticListener(pair => { }),
isEnabled: (s, o, _) => true,
onActivityImport: (activity, context) =>
{
onActivityImportCalled = true;
Assert.Null(Activity.Current);
Assert.Equal("Microsoft.AspNetCore.Hosting.HttpRequestIn", activity.OperationName);
Assert.NotNull(context);
Assert.IsAssignableFrom<HttpContext>(context);
activity.ActivityTraceFlags = ActivityTraceFlags.Recorded;
});
hostingApplication.CreateContext(features);
Assert.True(onActivityImportCalled);
Assert.NotNull(Activity.Current);
Assert.True(Activity.Current.Recorded);
}
private static void AssertProperty<T>(object o, string name)
{

View File

@ -500,8 +500,36 @@ namespace Microsoft.AspNetCore.Hosting.Tests
var app = new ApplicationBuilder(services);
app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection);
var ex = Assert.Throws<TargetInvocationException>(() => startup.ConfigureDelegate(app));
Assert.IsAssignableFrom<InvalidOperationException>(ex.InnerException);
Assert.Throws<InvalidOperationException>(() => startup.ConfigureDelegate(app));
}
[Fact]
public void ConfigureServicesThrowingDoesNotThrowTargetInvocationException()
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<IServiceProviderFactory<IServiceCollection>, DefaultServiceProviderFactory>();
var services = serviceCollection.BuildServiceProvider();
var startup = StartupLoader.LoadMethods(services, typeof(StartupConfigureServicesThrows), environmentName: null);
var app = new ApplicationBuilder(services);
Assert.Throws<Exception>(() => startup.ConfigureServicesDelegate(serviceCollection));
}
[Fact]
public void ConfigureThrowingDoesNotThrowTargetInvocationException()
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<IServiceProviderFactory<IServiceCollection>, DefaultServiceProviderFactory>();
var services = serviceCollection.BuildServiceProvider();
var startup = StartupLoader.LoadMethods(services, typeof(StartupConfigureThrows), environmentName: null);
var app = new ApplicationBuilder(services);
app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection);
Assert.Throws<Exception>(() => startup.ConfigureDelegate(app));
}
[Fact]

View File

@ -975,6 +975,54 @@ namespace Microsoft.AspNetCore.Hosting
Assert.Contains("ConfigureServices", ex.Message);
}
[Fact]
public void Dispose_DisposesAppConfiguration()
{
var providerMock = new Mock<ConfigurationProvider>().As<IDisposable>();
providerMock.Setup(d => d.Dispose());
var sourceMock = new Mock<IConfigurationSource>();
sourceMock.Setup(s => s.Build(It.IsAny<IConfigurationBuilder>()))
.Returns((ConfigurationProvider)providerMock.Object);
var host = CreateBuilder()
.ConfigureAppConfiguration(configuration =>
{
configuration.Add(sourceMock.Object);
})
.Build();
providerMock.Verify(c => c.Dispose(), Times.Never);
host.Dispose();
providerMock.Verify(c => c.Dispose(), Times.AtLeastOnce());
}
[Fact]
public async Task DisposeAsync_DisposesAppConfiguration()
{
var providerMock = new Mock<ConfigurationProvider>().As<IDisposable>();
providerMock.Setup(d => d.Dispose());
var sourceMock = new Mock<IConfigurationSource>();
sourceMock.Setup(s => s.Build(It.IsAny<IConfigurationBuilder>()))
.Returns((ConfigurationProvider)providerMock.Object);
var host = CreateBuilder()
.ConfigureAppConfiguration(configuration =>
{
configuration.Add(sourceMock.Object);
})
.Build();
providerMock.Verify(c => c.Dispose(), Times.Never);
await ((IAsyncDisposable)host).DisposeAsync();
providerMock.Verify(c => c.Dispose(), Times.AtLeastOnce());
}
public class BadConfigureServicesStartup
{
public void ConfigureServices(IServiceCollection services, int gunk) { }

View File

@ -19,11 +19,9 @@ namespace Microsoft.AspNetCore.Http.Internal
public static StringValues GetHeaderSplit(IHeaderDictionary headers, string key)
{
var values = GetHeaderUnmodified(headers, key);
return new StringValues(GetHeaderSplitImplementation(values).ToArray());
}
private static IEnumerable<string> GetHeaderSplitImplementation(StringValues values)
{
StringValues result = default;
foreach (var segment in new HeaderSegmentCollection(values))
{
if (!StringSegment.IsNullOrEmpty(segment.Data))
@ -31,10 +29,12 @@ namespace Microsoft.AspNetCore.Http.Internal
var value = DeQuote(segment.Data.Value);
if (!string.IsNullOrEmpty(value))
{
yield return value;
result = StringValues.Concat(in result, value);
}
}
}
return result;
}
public static StringValues GetHeaderUnmodified(IHeaderDictionary headers, string key)

View File

@ -406,7 +406,7 @@ namespace Microsoft.AspNetCore.Http.Internal
{
public ItemsDictionary() { }
public ItemsDictionary(System.Collections.Generic.IDictionary<object, object> items) { }
public System.Collections.Generic.IDictionary<object, object> Items { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public System.Collections.Generic.IDictionary<object, object> Items { get { throw null; } }
int System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<System.Object,System.Object>>.Count { get { throw null; } }
bool System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<System.Object,System.Object>>.IsReadOnly { get { throw null; } }
object System.Collections.Generic.IDictionary<System.Object,System.Object>.this[object key] { get { throw null; } set { } }

View File

@ -8,111 +8,155 @@ namespace Microsoft.AspNetCore.Http.Internal
{
public class ItemsDictionary : IDictionary<object, object>
{
private IDictionary<object, object> _items;
public ItemsDictionary()
: this(new Dictionary<object, object>())
{
}
{}
public ItemsDictionary(IDictionary<object, object> items)
{
Items = items;
_items = items;
}
public IDictionary<object, object> Items { get; }
public IDictionary<object, object> Items => this;
// Replace the indexer with one that returns null for missing values
object IDictionary<object, object>.this[object key]
{
get
{
object value;
if (Items.TryGetValue(key, out value))
if (_items != null && _items.TryGetValue(key, out var value))
{
return value;
}
return null;
}
set { Items[key] = value; }
set
{
EnsureDictionary();
_items[key] = value;
}
}
void IDictionary<object, object>.Add(object key, object value)
{
Items.Add(key, value);
EnsureDictionary();
_items.Add(key, value);
}
bool IDictionary<object, object>.ContainsKey(object key)
{
return Items.ContainsKey(key);
}
=> _items != null && _items.ContainsKey(key);
ICollection<object> IDictionary<object, object>.Keys
{
get { return Items.Keys; }
get
{
if (_items == null)
{
return EmptyDictionary.Dictionary.Keys;
}
return _items.Keys;
}
}
bool IDictionary<object, object>.Remove(object key)
{
return Items.Remove(key);
}
=> _items != null && _items.Remove(key);
bool IDictionary<object, object>.TryGetValue(object key, out object value)
{
return Items.TryGetValue(key, out value);
value = null;
return _items != null && _items.TryGetValue(key, out value);
}
ICollection<object> IDictionary<object, object>.Values
{
get { return Items.Values; }
get
{
if (_items == null)
{
return EmptyDictionary.Dictionary.Values;
}
return _items.Values;
}
}
void ICollection<KeyValuePair<object, object>>.Add(KeyValuePair<object, object> item)
{
Items.Add(item);
EnsureDictionary();
_items.Add(item);
}
void ICollection<KeyValuePair<object, object>>.Clear()
{
Items.Clear();
}
void ICollection<KeyValuePair<object, object>>.Clear() => _items?.Clear();
bool ICollection<KeyValuePair<object, object>>.Contains(KeyValuePair<object, object> item)
{
return Items.Contains(item);
}
=> _items != null && _items.Contains(item);
void ICollection<KeyValuePair<object, object>>.CopyTo(KeyValuePair<object, object>[] array, int arrayIndex)
{
Items.CopyTo(array, arrayIndex);
if (_items == null)
{
//Delegate to Empty Dictionary to do the argument checking.
EmptyDictionary.Collection.CopyTo(array, arrayIndex);
}
_items.CopyTo(array, arrayIndex);
}
int ICollection<KeyValuePair<object, object>>.Count
{
get { return Items.Count; }
}
int ICollection<KeyValuePair<object, object>>.Count => _items?.Count ?? 0;
bool ICollection<KeyValuePair<object, object>>.IsReadOnly
{
get { return Items.IsReadOnly; }
}
bool ICollection<KeyValuePair<object, object>>.IsReadOnly => _items?.IsReadOnly ?? false;
bool ICollection<KeyValuePair<object, object>>.Remove(KeyValuePair<object, object> item)
{
object value;
if (Items.TryGetValue(item.Key, out value) && Equals(item.Value, value))
if (_items == null)
{
return Items.Remove(item.Key);
return false;
}
if (_items.TryGetValue(item.Key, out var value) && Equals(item.Value, value))
{
return _items.Remove(item.Key);
}
return false;
}
IEnumerator<KeyValuePair<object, object>> IEnumerable<KeyValuePair<object, object>>.GetEnumerator()
private void EnsureDictionary()
{
return Items.GetEnumerator();
if (_items == null)
{
_items = new Dictionary<object, object>();
}
}
IEnumerator IEnumerable.GetEnumerator()
IEnumerator<KeyValuePair<object, object>> IEnumerable<KeyValuePair<object, object>>.GetEnumerator()
=> _items?.GetEnumerator() ?? EmptyEnumerator.Instance;
IEnumerator IEnumerable.GetEnumerator() => _items.GetEnumerator() ?? EmptyEnumerator.Instance;
private class EmptyEnumerator : IEnumerator<KeyValuePair<object, object>>
{
return Items.GetEnumerator();
// In own class so only initalized if GetEnumerator is called on an empty ItemsDictionary
public readonly static IEnumerator<KeyValuePair<object, object>> Instance = new EmptyEnumerator();
public KeyValuePair<object, object> Current => default;
object IEnumerator.Current => null;
public void Dispose()
{ }
public bool MoveNext() => false;
public void Reset()
{ }
}
private static class EmptyDictionary
{
// In own class so only initalized if CopyTo is called on an empty ItemsDictionary
public readonly static IDictionary<object, object> Dictionary = new Dictionary<object, object>();
public static ICollection<KeyValuePair<object, object>> Collection => Dictionary;
}
}
}

View File

@ -491,71 +491,19 @@ namespace Microsoft.AspNetCore.Routing.Constraints
}
namespace Microsoft.AspNetCore.Routing.Internal
{
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public readonly partial struct BufferValue
{
private readonly object _dummy;
private readonly int _dummyPrimitive;
public BufferValue(string value, bool requiresEncoding) { throw null; }
public bool RequiresEncoding { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public string Value { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
}
public partial class DfaGraphWriter
{
public DfaGraphWriter(System.IServiceProvider services) { }
public void Write(Microsoft.AspNetCore.Routing.EndpointDataSource dataSource, System.IO.TextWriter writer) { }
}
[System.Diagnostics.DebuggerDisplayAttribute("{DebuggerDisplayString,nq}")]
public partial class LinkGenerationDecisionTree
{
public LinkGenerationDecisionTree(System.Collections.Generic.IReadOnlyList<Microsoft.AspNetCore.Routing.Tree.OutboundMatch> entries) { }
public System.Collections.Generic.IList<Microsoft.AspNetCore.Routing.Internal.OutboundMatchResult> GetMatches(Microsoft.AspNetCore.Routing.RouteValueDictionary values, Microsoft.AspNetCore.Routing.RouteValueDictionary ambientValues) { throw null; }
}
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public readonly partial struct OutboundMatchResult
{
private readonly object _dummy;
private readonly int _dummyPrimitive;
public OutboundMatchResult(Microsoft.AspNetCore.Routing.Tree.OutboundMatch match, bool isFallbackMatch) { throw null; }
public bool IsFallbackMatch { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public Microsoft.AspNetCore.Routing.Tree.OutboundMatch Match { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
}
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public partial struct PathTokenizer : System.Collections.Generic.IEnumerable<Microsoft.Extensions.Primitives.StringSegment>, System.Collections.Generic.IReadOnlyCollection<Microsoft.Extensions.Primitives.StringSegment>, System.Collections.Generic.IReadOnlyList<Microsoft.Extensions.Primitives.StringSegment>, System.Collections.IEnumerable
{
private object _dummy;
private int _dummyPrimitive;
public PathTokenizer(Microsoft.AspNetCore.Http.PathString path) { throw null; }
public int Count { get { throw null; } }
public Microsoft.Extensions.Primitives.StringSegment this[int index] { get { throw null; } }
public Microsoft.AspNetCore.Routing.Internal.PathTokenizer.Enumerator GetEnumerator() { throw null; }
System.Collections.Generic.IEnumerator<Microsoft.Extensions.Primitives.StringSegment> System.Collections.Generic.IEnumerable<Microsoft.Extensions.Primitives.StringSegment>.GetEnumerator() { throw null; }
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { throw null; }
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public partial struct Enumerator : System.Collections.Generic.IEnumerator<Microsoft.Extensions.Primitives.StringSegment>, System.Collections.IEnumerator, System.IDisposable
{
private object _dummy;
private int _dummyPrimitive;
public Enumerator(Microsoft.AspNetCore.Routing.Internal.PathTokenizer tokenizer) { throw null; }
public Microsoft.Extensions.Primitives.StringSegment Current { get { throw null; } }
object System.Collections.IEnumerator.Current { get { throw null; } }
public void Dispose() { }
public bool MoveNext() { throw null; }
public void Reset() { }
}
}
[System.ObsoleteAttribute("This type will be marked as internal in a future release.")]
public enum SegmentState
{
Beginning = 0,
Inside = 1,
}
public partial class UriBuilderContextPooledObjectPolicy : Microsoft.Extensions.ObjectPool.IPooledObjectPolicy<Microsoft.AspNetCore.Routing.Internal.UriBuildingContext>
{
public UriBuilderContextPooledObjectPolicy() { }
public Microsoft.AspNetCore.Routing.Internal.UriBuildingContext Create() { throw null; }
public bool Return(Microsoft.AspNetCore.Routing.Internal.UriBuildingContext obj) { throw null; }
}
[System.Diagnostics.DebuggerDisplayAttribute("{DebuggerToString(),nq}")]
[System.ObsoleteAttribute("This type will be marked as internal in a future release.")]
public partial class UriBuildingContext
{
public UriBuildingContext(System.Text.Encodings.Web.UrlEncoder urlEncoder) { }
@ -808,13 +756,21 @@ namespace Microsoft.AspNetCore.Routing.Template
}
public partial class TemplateBinder
{
[System.ObsoleteAttribute("This constructor is obsolete and will be marked internal in a future release. Use the TemplateBinderFactory service to create TemplateBinder instances.")]
public TemplateBinder(System.Text.Encodings.Web.UrlEncoder urlEncoder, Microsoft.Extensions.ObjectPool.ObjectPool<Microsoft.AspNetCore.Routing.Internal.UriBuildingContext> pool, Microsoft.AspNetCore.Routing.Patterns.RoutePattern pattern, Microsoft.AspNetCore.Routing.RouteValueDictionary defaults, System.Collections.Generic.IEnumerable<string> requiredKeys, System.Collections.Generic.IEnumerable<System.ValueTuple<string, Microsoft.AspNetCore.Routing.IParameterPolicy>> parameterPolicies) { }
[System.ObsoleteAttribute("This constructor is obsolete and will be marked internal in a furture release. Use the TemplateBinderFactory service to create TemplateBinder instances.")]
public TemplateBinder(System.Text.Encodings.Web.UrlEncoder urlEncoder, Microsoft.Extensions.ObjectPool.ObjectPool<Microsoft.AspNetCore.Routing.Internal.UriBuildingContext> pool, Microsoft.AspNetCore.Routing.Template.RouteTemplate template, Microsoft.AspNetCore.Routing.RouteValueDictionary defaults) { }
public string BindValues(Microsoft.AspNetCore.Routing.RouteValueDictionary acceptedValues) { throw null; }
public Microsoft.AspNetCore.Routing.Template.TemplateValuesResult GetValues(Microsoft.AspNetCore.Routing.RouteValueDictionary ambientValues, Microsoft.AspNetCore.Routing.RouteValueDictionary values) { throw null; }
public static bool RoutePartsEqual(object a, object b) { throw null; }
public bool TryProcessConstraints(Microsoft.AspNetCore.Http.HttpContext httpContext, Microsoft.AspNetCore.Routing.RouteValueDictionary combinedValues, out string parameterName, out Microsoft.AspNetCore.Routing.IRouteConstraint constraint) { throw null; }
}
public abstract partial class TemplateBinderFactory
{
protected TemplateBinderFactory() { }
public abstract Microsoft.AspNetCore.Routing.Template.TemplateBinder Create(Microsoft.AspNetCore.Routing.Patterns.RoutePattern pattern);
public abstract Microsoft.AspNetCore.Routing.Template.TemplateBinder Create(Microsoft.AspNetCore.Routing.Template.RouteTemplate template, Microsoft.AspNetCore.Routing.RouteValueDictionary defaults);
}
public partial class TemplateMatcher
{
public TemplateMatcher(Microsoft.AspNetCore.Routing.Template.RouteTemplate template, Microsoft.AspNetCore.Routing.RouteValueDictionary defaults) { }
@ -901,6 +857,7 @@ namespace Microsoft.AspNetCore.Routing.Tree
}
public partial class TreeRouteBuilder
{
[System.ObsoleteAttribute("This constructor will be marked internal in a future release. Use the service provider to create instances of TreeRouteBuilder.")]
public TreeRouteBuilder(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.Extensions.ObjectPool.ObjectPool<Microsoft.AspNetCore.Routing.Internal.UriBuildingContext> objectPool, Microsoft.AspNetCore.Routing.IInlineConstraintResolver constraintResolver) { }
public System.Collections.Generic.IList<Microsoft.AspNetCore.Routing.Tree.InboundRouteEntry> InboundEntries { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public System.Collections.Generic.IList<Microsoft.AspNetCore.Routing.Tree.OutboundRouteEntry> OutboundEntries { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
@ -913,6 +870,7 @@ namespace Microsoft.AspNetCore.Routing.Tree
public partial class TreeRouter : Microsoft.AspNetCore.Routing.IRouter
{
public static readonly string RouteGroupKey;
[System.ObsoleteAttribute("This constructor will be marked obsolete in a future release. Use the TreeRouterBuilder to create instances of TreeRouter.")]
public TreeRouter(Microsoft.AspNetCore.Routing.Tree.UrlMatchingTree[] trees, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Routing.Tree.OutboundRouteEntry> linkGenerationEntries, System.Text.Encodings.Web.UrlEncoder urlEncoder, Microsoft.Extensions.ObjectPool.ObjectPool<Microsoft.AspNetCore.Routing.Internal.UriBuildingContext> objectPool, Microsoft.Extensions.Logging.ILogger routeLogger, Microsoft.Extensions.Logging.ILogger constraintLogger, int version) { }
public int Version { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public Microsoft.AspNetCore.Routing.VirtualPathData GetVirtualPath(Microsoft.AspNetCore.Routing.VirtualPathContext context) { throw null; }

View File

@ -1,4 +1,4 @@
// Licensed to the .NET Foundation under one or more agreements.
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
@ -10,7 +10,7 @@
using System;
using System.Diagnostics;
namespace Microsoft.AspNetCore.Routing.Internal
namespace Microsoft.AspNetCore.Routing
{
/// <summary>
/// Helper type for avoiding allocations while building arrays.
@ -166,4 +166,4 @@ namespace Microsoft.AspNetCore.Routing.Internal
_array = next;
}
}
}
}

View File

@ -22,7 +22,7 @@ namespace Microsoft.AspNetCore.Routing
internal sealed class DefaultLinkGenerator : LinkGenerator, IDisposable
{
private readonly ParameterPolicyFactory _parameterPolicyFactory;
private readonly ObjectPool<UriBuildingContext> _uriBuildingContextPool;
private readonly TemplateBinderFactory _binderFactory;
private readonly ILogger<DefaultLinkGenerator> _logger;
private readonly IServiceProvider _serviceProvider;
@ -38,14 +38,14 @@ namespace Microsoft.AspNetCore.Routing
public DefaultLinkGenerator(
ParameterPolicyFactory parameterPolicyFactory,
TemplateBinderFactory binderFactory,
EndpointDataSource dataSource,
ObjectPool<UriBuildingContext> uriBuildingContextPool,
IOptions<RouteOptions> routeOptions,
ILogger<DefaultLinkGenerator> logger,
IServiceProvider serviceProvider)
{
_parameterPolicyFactory = parameterPolicyFactory;
_uriBuildingContextPool = uriBuildingContextPool;
_binderFactory = binderFactory;
_logger = logger;
_serviceProvider = serviceProvider;
@ -282,40 +282,7 @@ namespace Microsoft.AspNetCore.Routing
private TemplateBinder CreateTemplateBinder(RouteEndpoint endpoint)
{
// Now create the constraints and parameter transformers from the pattern
var policies = new List<(string parameterName, IParameterPolicy policy)>();
foreach (var kvp in endpoint.RoutePattern.ParameterPolicies)
{
var parameterName = kvp.Key;
// It's possible that we don't have an actual route parameter, we need to support that case.
var parameter = endpoint.RoutePattern.GetParameter(parameterName);
// Use the first parameter transformer per parameter
var foundTransformer = false;
for (var i = 0; i < kvp.Value.Count; i++)
{
var parameterPolicy = _parameterPolicyFactory.Create(parameter, kvp.Value[i]);
if (!foundTransformer && parameterPolicy is IOutboundParameterTransformer parameterTransformer)
{
policies.Add((parameterName, parameterTransformer));
foundTransformer = true;
}
if (parameterPolicy is IRouteConstraint constraint)
{
policies.Add((parameterName, constraint));
}
}
}
return new TemplateBinder(
UrlEncoder.Default,
_uriBuildingContextPool,
endpoint.RoutePattern,
new RouteValueDictionary(endpoint.RoutePattern.Defaults),
endpoint.RoutePattern.RequiredValues.Keys,
policies);
return _binderFactory.Create(endpoint.RoutePattern);
}
// Internal for testing

View File

@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Routing.Internal;
using Microsoft.AspNetCore.Routing.Matching;
using Microsoft.AspNetCore.Routing.Patterns;
using Microsoft.AspNetCore.Routing.Template;
using Microsoft.AspNetCore.Routing.Tree;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging;
@ -34,6 +35,7 @@ namespace Microsoft.Extensions.DependencyInjection
services.TryAddTransient<IInlineConstraintResolver, DefaultInlineConstraintResolver>();
services.TryAddTransient<ObjectPoolProvider, DefaultObjectPoolProvider>();
#pragma warning disable CS0618 // Type or member is obsolete
services.TryAddSingleton<ObjectPool<UriBuildingContext>>(s =>
{
var provider = s.GetRequiredService<ObjectPoolProvider>();
@ -49,6 +51,7 @@ namespace Microsoft.Extensions.DependencyInjection
var constraintResolver = s.GetRequiredService<IInlineConstraintResolver>();
return new TreeRouteBuilder(loggerFactory, objectPool, constraintResolver);
}));
#pragma warning restore CS0618 // Type or member is obsolete
services.TryAddSingleton(typeof(RoutingMarkerService));
@ -88,6 +91,7 @@ namespace Microsoft.Extensions.DependencyInjection
//
// Misc infrastructure
//
services.TryAddSingleton<TemplateBinderFactory, DefaultTemplateBinderFactory>();
services.TryAddSingleton<RoutePatternTransformer, DefaultRoutePatternTransformer>();
return services;
}

View File

@ -1,18 +0,0 @@
// 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.
namespace Microsoft.AspNetCore.Routing.Internal
{
public readonly struct BufferValue
{
public BufferValue(string value, bool requiresEncoding)
{
Value = value;
RequiresEncoding = requiresEncoding;
}
public bool RequiresEncoding { get; }
public string Value { get; }
}
}

View File

@ -1,6 +1,8 @@
// 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;
namespace Microsoft.AspNetCore.Routing.Internal
{
// Segments are treated as all-or-none. We should never output a partial segment.
@ -9,6 +11,7 @@ namespace Microsoft.AspNetCore.Routing.Internal
// used a value for {p1}, we have to output the entire segment up to the next "/".
// Otherwise we could end up with the partial segment "v1" instead of the entire
// segment "v1-v2.xml".
[Obsolete("This type will be marked as internal in a future release.")]
public enum SegmentState
{
Beginning,

View File

@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
@ -10,6 +11,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Routing.Internal
{
[Obsolete("This type will be marked as internal in a future release.")]
[DebuggerDisplay("{DebuggerToString(),nq}")]
public class UriBuildingContext
{
@ -321,5 +323,18 @@ namespace Microsoft.AspNetCore.Routing.Internal
{
return string.Format("{{Accepted: '{0}' Buffered: '{1}'}}", _path, string.Join("", _buffer));
}
private readonly struct BufferValue
{
public BufferValue(string value, bool requiresEncoding)
{
Value = value;
RequiresEncoding = requiresEncoding;
}
public bool RequiresEncoding { get; }
public string Value { get; }
}
}
}

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// 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;
@ -9,7 +9,7 @@ using System.Reflection;
using System.Text;
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Routing.Internal
namespace Microsoft.AspNetCore.Routing
{
internal static class ParameterPolicyActivator
{

View File

@ -8,9 +8,9 @@ using System.Diagnostics;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Routing.Internal
namespace Microsoft.AspNetCore.Routing
{
public struct PathTokenizer : IReadOnlyList<StringSegment>
internal struct PathTokenizer : IReadOnlyList<StringSegment>
{
private readonly string _path;
private int _count;

View File

@ -246,14 +246,16 @@ namespace Microsoft.AspNetCore.Routing
}
}
#pragma warning disable CS0618 // Type or member is obsolete
private void EnsureBinder(HttpContext context)
{
if (_binder == null)
{
var pool = context.RequestServices.GetRequiredService<ObjectPool<UriBuildingContext>>();
_binder = new TemplateBinder(UrlEncoder.Default, pool, ParsedTemplate, Defaults);
var binderFactory = context.RequestServices.GetRequiredService<TemplateBinderFactory>();
_binder = binderFactory.Create(ParsedTemplate, Defaults);
}
}
#pragma warning restore CS0618 // Type or member is obsolete
private void EnsureLoggers(HttpContext context)
{

View File

@ -3,7 +3,7 @@
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Routing.Internal
namespace Microsoft.AspNetCore.Routing
{
/// <summary>
/// A marker class used to determine if all the routing services were added
@ -12,4 +12,4 @@ namespace Microsoft.AspNetCore.Routing.Internal
internal class RoutingMarkerService
{
}
}
}

View File

@ -0,0 +1,95 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Routing.Internal;
using Microsoft.AspNetCore.Routing.Patterns;
using Microsoft.Extensions.ObjectPool;
namespace Microsoft.AspNetCore.Routing.Template
{
internal sealed class DefaultTemplateBinderFactory : TemplateBinderFactory
{
private readonly ParameterPolicyFactory _policyFactory;
#pragma warning disable CS0618 // Type or member is obsolete
private readonly ObjectPool<UriBuildingContext> _pool;
#pragma warning restore CS0618 // Type or member is obsolete
public DefaultTemplateBinderFactory(
ParameterPolicyFactory policyFactory,
#pragma warning disable CS0618 // Type or member is obsolete
ObjectPool<UriBuildingContext> pool)
#pragma warning restore CS0618 // Type or member is obsolete
{
if (policyFactory == null)
{
throw new ArgumentNullException(nameof(policyFactory));
}
if (pool == null)
{
throw new ArgumentNullException(nameof(pool));
}
_policyFactory = policyFactory;
_pool = pool;
}
public override TemplateBinder Create(RouteTemplate template, RouteValueDictionary defaults)
{
if (template == null)
{
throw new ArgumentNullException(nameof(template));
}
if (defaults == null)
{
throw new ArgumentNullException(nameof(defaults));
}
#pragma warning disable CS0618 // Type or member is obsolete
return new TemplateBinder(UrlEncoder.Default, _pool, template, defaults);
#pragma warning restore CS0618 // Type or member is obsolete
}
public override TemplateBinder Create(RoutePattern pattern)
{
if (pattern == null)
{
throw new ArgumentNullException(nameof(pattern));
}
// Now create the constraints and parameter transformers from the pattern
var policies = new List<(string parameterName, IParameterPolicy policy)>();
foreach (var kvp in pattern.ParameterPolicies)
{
var parameterName = kvp.Key;
// It's possible that we don't have an actual route parameter, we need to support that case.
var parameter = pattern.GetParameter(parameterName);
// Use the first parameter transformer per parameter
var foundTransformer = false;
for (var i = 0; i < kvp.Value.Count; i++)
{
var parameterPolicy = _policyFactory.Create(parameter, kvp.Value[i]);
if (!foundTransformer && parameterPolicy is IOutboundParameterTransformer parameterTransformer)
{
policies.Add((parameterName, parameterTransformer));
foundTransformer = true;
}
if (parameterPolicy is IRouteConstraint constraint)
{
policies.Add((parameterName, constraint));
}
}
}
return new TemplateBinder(UrlEncoder.Default, _pool, pattern, policies);
}
}
}

View File

@ -19,7 +19,9 @@ namespace Microsoft.AspNetCore.Routing.Template
public class TemplateBinder
{
private readonly UrlEncoder _urlEncoder;
#pragma warning disable CS0618 // Type or member is obsolete
private readonly ObjectPool<UriBuildingContext> _pool;
#pragma warning restore CS0618 // Type or member is obsolete
private readonly (string parameterName, IRouteConstraint constraint)[] _constraints;
private readonly RouteValueDictionary _defaults;
@ -40,6 +42,9 @@ namespace Microsoft.AspNetCore.Routing.Template
/// <param name="pool">The <see cref="ObjectPool{T}"/>.</param>
/// <param name="template">The <see cref="RouteTemplate"/> to bind values to.</param>
/// <param name="defaults">The default values for <paramref name="template"/>.</param>
[Obsolete(
"This constructor is obsolete and will be marked internal in a furture release. Use the TemplateBinderFactory service " +
"to create TemplateBinder instances.")]
public TemplateBinder(
UrlEncoder urlEncoder,
ObjectPool<UriBuildingContext> pool,
@ -60,6 +65,9 @@ namespace Microsoft.AspNetCore.Routing.Template
/// <param name="parameterPolicies">
/// A list of (<see cref="string"/>, <see cref="IParameterPolicy"/>) pairs to evalute when producing a URI.
/// </param>
[Obsolete(
"This constructor is obsolete and will be marked internal in a future release. Use the TemplateBinderFactory service " +
"to create TemplateBinder instances.")]
public TemplateBinder(
UrlEncoder urlEncoder,
ObjectPool<UriBuildingContext> pool,
@ -110,6 +118,58 @@ namespace Microsoft.AspNetCore.Routing.Template
_slots = AssignSlots(_pattern, _filters);
}
internal TemplateBinder(
UrlEncoder urlEncoder,
#pragma warning disable CS0618 // Type or member is obsolete
ObjectPool<UriBuildingContext> pool,
#pragma warning restore CS0618 // Type or member is obsolete
RoutePattern pattern,
IEnumerable<(string parameterName, IParameterPolicy policy)> parameterPolicies)
{
if (urlEncoder == null)
{
throw new ArgumentNullException(nameof(urlEncoder));
}
if (pool == null)
{
throw new ArgumentNullException(nameof(pool));
}
if (pattern == null)
{
throw new ArgumentNullException(nameof(pattern));
}
// Parameter policies can be null.
_urlEncoder = urlEncoder;
_pool = pool;
_pattern = pattern;
_defaults = new RouteValueDictionary(pattern.Defaults);
_requiredKeys = pattern.RequiredValues.Keys.ToArray();
// Any default that doesn't have a corresponding parameter is a 'filter' and if a value
// is provided for that 'filter' it must match the value in defaults.
var filters = new RouteValueDictionary(_defaults);
for (var i = 0; i < pattern.Parameters.Count; i++)
{
filters.Remove(pattern.Parameters[i].Name);
}
_filters = filters.ToArray();
_constraints = parameterPolicies
?.Where(p => p.policy is IRouteConstraint)
.Select(p => (p.parameterName, (IRouteConstraint)p.policy))
.ToArray() ?? Array.Empty<(string, IRouteConstraint)>();
_parameterTransformers = parameterPolicies
?.Where(p => p.policy is IOutboundParameterTransformer)
.Select(p => (p.parameterName, (IOutboundParameterTransformer)p.policy))
.ToArray() ?? Array.Empty<(string, IOutboundParameterTransformer)>();
_slots = AssignSlots(_pattern, _filters);
}
// Step 1: Get the list of values we're going to try to use to match and generate this URI
public TemplateValuesResult GetValues(RouteValueDictionary ambientValues, RouteValueDictionary values)
{
@ -442,6 +502,7 @@ namespace Microsoft.AspNetCore.Routing.Template
}
}
#pragma warning disable CS0618 // Type or member is obsolete
private bool TryBindValuesCore(UriBuildingContext context, RouteValueDictionary acceptedValues)
{
// If we have any output parameter transformers, allow them a chance to influence the parameter values
@ -578,6 +639,7 @@ namespace Microsoft.AspNetCore.Routing.Template
}
return false;
}
#pragma warning restore CS0618 // Type or member is obsolete
/// <summary>
/// Compares two objects for equality as parts of a case-insensitive path.

View File

@ -0,0 +1,29 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Routing.Patterns;
namespace Microsoft.AspNetCore.Routing.Template
{
/// <summary>
/// A factory used to create <see cref="TemplateBinder"/> instances.
/// </summary>
public abstract class TemplateBinderFactory
{
/// <summary>
/// Creates a new <see cref="TemplateBinder"/> from the provided <paramref name="template"/> and
/// <paramref name="defaults"/>.
/// </summary>
/// <param name="template">The route template.</param>
/// <param name="defaults">A collection of extra default values that do not appear in the route template.</param>
/// <returns>A <see cref="TemplateBinder"/>.</returns>
public abstract TemplateBinder Create(RouteTemplate template, RouteValueDictionary defaults);
/// <summary>
/// Creates a new <see cref="TemplateBinder"/> from the provided <paramref name="pattern"/>.
/// </summary>
/// <param name="pattern">The <see cref="RoutePattern"/>.</param>
/// <returns>A <see cref="TemplateBinder"/>.</returns>
public abstract TemplateBinder Create(RoutePattern pattern);
}
}

View File

@ -8,13 +8,12 @@ using System.Linq;
using System.Text;
using Microsoft.AspNetCore.Routing.DecisionTree;
using Microsoft.AspNetCore.Routing.Patterns;
using Microsoft.AspNetCore.Routing.Tree;
namespace Microsoft.AspNetCore.Routing.Internal
namespace Microsoft.AspNetCore.Routing.Tree
{
// A decision tree that matches link generation entries based on route data.
[DebuggerDisplay("{DebuggerDisplayString,nq}")]
public class LinkGenerationDecisionTree
internal class LinkGenerationDecisionTree
{
// Fallback value for cases where the ambient values weren't provided.
//

View File

@ -1,11 +1,9 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Routing.Tree;
namespace Microsoft.AspNetCore.Routing.Internal
namespace Microsoft.AspNetCore.Routing.Tree
{
public readonly struct OutboundMatchResult
internal readonly struct OutboundMatchResult
{
public OutboundMatchResult(OutboundMatch match, bool isFallbackMatch)
{

View File

@ -3,7 +3,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Routing.Internal;
@ -21,7 +20,9 @@ namespace Microsoft.AspNetCore.Routing.Tree
private readonly ILogger _logger;
private readonly ILogger _constraintLogger;
private readonly UrlEncoder _urlEncoder;
#pragma warning disable CS0618 // Type or member is obsolete
private readonly ObjectPool<UriBuildingContext> _objectPool;
#pragma warning restore CS0618 // Type or member is obsolete
private readonly IInlineConstraintResolver _constraintResolver;
/// <summary>
@ -30,9 +31,12 @@ namespace Microsoft.AspNetCore.Routing.Tree
/// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param>
/// <param name="objectPool">The <see cref="ObjectPool{UrlBuildingContext}"/>.</param>
/// <param name="constraintResolver">The <see cref="IInlineConstraintResolver"/>.</param>
[Obsolete("This constructor will be marked internal in a future release. Use the service provider to create instances of TreeRouteBuilder.")]
public TreeRouteBuilder(
ILoggerFactory loggerFactory,
#pragma warning disable CS0618 // Type or member is obsolete
ObjectPool<UriBuildingContext> objectPool,
#pragma warning restore CS0618 // Type or member is obsolete
IInlineConstraintResolver constraintResolver)
{
if (loggerFactory == null)
@ -240,6 +244,7 @@ namespace Microsoft.AspNetCore.Routing.Tree
tree.AddEntry(entry);
}
#pragma warning disable CS0618 // Type or member is obsolete
return new TreeRouter(
trees.Values.OrderBy(tree => tree.Order).ToArray(),
OutboundEntries,
@ -248,6 +253,7 @@ namespace Microsoft.AspNetCore.Routing.Tree
_logger,
_constraintLogger,
version);
#pragma warning restore CS0618 // Type or member is obsolete
}
/// <summary>

View File

@ -40,11 +40,14 @@ namespace Microsoft.AspNetCore.Routing.Tree
/// <param name="constraintLogger">The <see cref="ILogger"/> instance used
/// in <see cref="RouteConstraintMatcher"/>.</param>
/// <param name="version">The version of this route.</param>
[Obsolete("This constructor will be marked obsolete in a future release. Use the TreeRouterBuilder to create instances of TreeRouter.")]
public TreeRouter(
UrlMatchingTree[] trees,
IEnumerable<OutboundRouteEntry> linkGenerationEntries,
UrlEncoder urlEncoder,
#pragma warning disable CS0618 // Type or member is obsolete
ObjectPool<UriBuildingContext> objectPool,
#pragma warning restore CS0618 // Type or member is obsolete
ILogger routeLogger,
ILogger constraintLogger,
int version)

View File

@ -2,11 +2,13 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Routing.Internal;
using Microsoft.Extensions.ObjectPool;
namespace Microsoft.AspNetCore.Routing.Internal
namespace Microsoft.AspNetCore.Routing
{
public class UriBuilderContextPooledObjectPolicy : IPooledObjectPolicy<UriBuildingContext>
#pragma warning disable CS0618 // Type or member is obsolete
internal class UriBuilderContextPooledObjectPolicy : IPooledObjectPolicy<UriBuildingContext>
{
public UriBuildingContext Create()
{
@ -19,4 +21,5 @@ namespace Microsoft.AspNetCore.Routing.Internal
return true;
}
}
#pragma warning restore CS0618 // Type or member is obsolete
}

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.Extensions.WebEncoders.Testing;
@ -6,6 +6,7 @@ using Xunit;
namespace Microsoft.AspNetCore.Routing.Internal
{
#pragma warning disable CS0618 // Type or member is obsolete
public class UriBuildingContextTest
{
[Fact]
@ -16,7 +17,7 @@ namespace Microsoft.AspNetCore.Routing.Internal
var value = "a/b b1/c";
var expected = "/UrlEncode[[a/b b1/c]]";
var uriBuilldingContext = new UriBuildingContext(urlTestEncoder);
// Act
uriBuilldingContext.EncodeValue(value, 0, value.Length, encodeSlashes: true);
@ -97,4 +98,5 @@ namespace Microsoft.AspNetCore.Routing.Internal
Assert.Equal(expected, uriBuilldingContext.ToPathString().Value);
}
}
#pragma warning restore CS0618 // Type or member is obsolete
}

View File

@ -5,6 +5,7 @@ using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Routing.Internal;
using Microsoft.AspNetCore.Routing.Template;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.ObjectPool;
@ -82,8 +83,8 @@ namespace Microsoft.AspNetCore.Routing
return new DefaultLinkGenerator(
new DefaultParameterPolicyFactory(routeOptions, serviceProvider),
serviceProvider.GetRequiredService<TemplateBinderFactory>(),
new CompositeEndpointDataSource(routeOptions.Value.EndpointDataSources),
new DefaultObjectPool<UriBuildingContext>(new UriBuilderContextPooledObjectPolicy()),
routeOptions,
NullLogger<DefaultLinkGenerator>.Instance,
serviceProvider);

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// 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;
@ -32,10 +32,12 @@ namespace Microsoft.AspNetCore.Routing.Matching
public override Matcher Build()
{
#pragma warning disable CS0618 // Type or member is obsolete
var builder = new TreeRouteBuilder(
NullLoggerFactory.Instance,
new DefaultObjectPool<UriBuildingContext>(new UriBuilderContextPooledObjectPolicy()),
new DefaultInlineConstraintResolver(Options.Create(new RouteOptions()), new TestServiceProvider()));
#pragma warning restore CS0618 // Type or member is obsolete
var selector = new DefaultEndpointSelector();

View File

@ -658,6 +658,7 @@ namespace Microsoft.AspNetCore.Routing
var expected = "/Home/Index?name=" + UrlEncoder.Default.Encode(nameRouteValue);
var services = new ServiceCollection();
services.AddSingleton<ILoggerFactory>(NullLoggerFactory.Instance);
services.AddOptions();
services.AddRouting();
// This test encoder should not be used by Routing and should always use the default one.
services.AddSingleton<UrlEncoder>(new UrlTestEncoder());
@ -1520,6 +1521,7 @@ namespace Microsoft.AspNetCore.Routing
{
var services = new ServiceCollection();
services.AddSingleton<ILoggerFactory>(NullLoggerFactory.Instance);
services.AddOptions();
services.AddRouting();
var context = new DefaultHttpContext

View File

@ -16,6 +16,7 @@ using Xunit;
namespace Microsoft.AspNetCore.Routing.Template.Tests
{
#pragma warning disable CS0618 // Type or member is obsolete
public class TemplateBinderTests
{
private readonly IInlineConstraintResolver _inlineConstraintResolver = GetInlineConstraintResolver();
@ -1480,4 +1481,5 @@ namespace Microsoft.AspNetCore.Routing.Template.Tests
public Dictionary<string, string> Parameters { get; private set; }
}
}
#pragma warning restore CS0618 // Type or member is obsolete
}

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// 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.Text.Encodings.Web;
@ -248,10 +248,12 @@ namespace Microsoft.AspNetCore.Routing.Tree
var objectPool = objectPoolProvider.Create(objectPolicy);
var constraintResolver = GetInlineConstraintResolver();
#pragma warning disable CS0618 // Type or member is obsolete
var builder = new TreeRouteBuilder(
NullLoggerFactory.Instance,
objectPool,
constraintResolver);
#pragma warning restore CS0618 // Type or member is obsolete
return builder;
}

View File

@ -23,8 +23,10 @@ namespace Microsoft.AspNetCore.Routing.Tree
{
private static readonly RequestDelegate NullHandler = (c) => Task.CompletedTask;
#pragma warning disable CS0618 // Type or member is obsolete
private static ObjectPool<UriBuildingContext> Pool = new DefaultObjectPoolProvider().Create(
new UriBuilderContextPooledObjectPolicy());
#pragma warning restore CS0618 // Type or member is obsolete
[Theory]
[InlineData("template/5", "template/{parameter:int}")]
@ -2073,6 +2075,7 @@ namespace Microsoft.AspNetCore.Routing.Tree
return new DefaultInlineConstraintResolver(optionsMock.Object, new TestServiceProvider());
}
#pragma warning disable CS0618 // Type or member is obsolete
private static TreeRouteBuilder CreateBuilder()
{
var objectPoolProvider = new DefaultObjectPoolProvider();
@ -2086,6 +2089,7 @@ namespace Microsoft.AspNetCore.Routing.Tree
constraintResolver);
return builder;
}
#pragma warning restore CS0618 // Type or member is obsolete
private static TreeRouter CreateTreeRouter(
string firstTemplate,

View File

@ -0,0 +1 @@
[assembly: BenchmarkDotNet.Attributes.AspNetCoreBenchmark]

View File

@ -0,0 +1,63 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using Microsoft.AspNetCore.Http.Internal;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Http.Abstractions.Microbenchmarks
{
public class GetHeaderSplitBenchmark
{
HeaderDictionary _dictionary;
[GlobalSetup]
public void GlobalSetup()
{
var dict = new Dictionary<string, StringValues>()
{
{ "singleValue", new StringValues("single") },
{ "singleValueQuoted", new StringValues("\"single\"") },
{ "doubleValue", new StringValues(new [] { "first", "second" }) },
{ "manyValue", new StringValues(new [] { "first", "second", "third", "fourth", "fifth", "sixth" }) }
};
_dictionary = new HeaderDictionary(dict);
}
[Benchmark]
public void SplitSingleHeader()
{
var values = ParsingHelpers.GetHeaderSplit(_dictionary, "singleValue");
if (values.Count != 1)
throw new Exception();
}
[Benchmark]
public void SplitSingleQuotedHeader()
{
var values = ParsingHelpers.GetHeaderSplit(_dictionary, "singleValueQuoted");
if (values.Count != 1)
throw new Exception();
}
[Benchmark]
public void SplitDoubleHeader()
{
var values = ParsingHelpers.GetHeaderSplit(_dictionary, "doubleValue");
if (values.Count != 2)
throw new Exception();
}
[Benchmark]
public void SplitManyHeaders()
{
var values = ParsingHelpers.GetHeaderSplit(_dictionary, "manyValue");
if (values.Count != 6)
throw new Exception();
}
}
}

View File

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Reference Include="BenchmarkDotNet" />
<Reference Include="Microsoft.AspNetCore.BenchmarkRunner.Sources" />
<Reference Include="Microsoft.AspNetCore.Http.Abstractions" />
<Reference Include="Microsoft.AspNetCore.Http" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,12 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "3.0.0-preview3.19153.1",
"commands": [
"dotnet-ef"
]
}
}
}

View File

@ -4,28 +4,26 @@ using IdentitySample.DefaultUI.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.Storage.Internal;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace IdentitySample.DefaultUI.Data.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20180126174859_CreateIdentitySchema")]
[Migration("20190411154115_CreateIdentitySchema")]
partial class CreateIdentitySchema
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "2.1.0-preview1-28153")
.HasAnnotation("ProductVersion", "3.0.0-preview5.19209.2")
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("IdentitySample.DefaultUI.Data.ApplicationUser", b =>
{
b.Property<string>("Id")
.ValueGeneratedOnAdd();
b.Property<string>("Id");
b.Property<int>("AccessFailedCount");
@ -79,8 +77,7 @@ namespace IdentitySample.DefaultUI.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.ValueGeneratedOnAdd();
b.Property<string>("Id");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken();
@ -104,7 +101,8 @@ namespace IdentitySample.DefaultUI.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("ClaimType");
@ -123,7 +121,8 @@ namespace IdentitySample.DefaultUI.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("ClaimType");
@ -191,47 +190,53 @@ namespace IdentitySample.DefaultUI.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser")
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser")
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser")
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser")
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618
}

View File

@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;

View File

@ -4,10 +4,7 @@ using IdentitySample.DefaultUI.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.Storage.Internal;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace IdentitySample.DefaultUI.Data.Migrations
{
@ -18,13 +15,13 @@ namespace IdentitySample.DefaultUI.Data.Migrations
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "2.1.0-preview1-28153")
.HasAnnotation("ProductVersion", "3.0.0-preview5.19209.2")
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("IdentitySample.DefaultUI.Data.ApplicationUser", b =>
{
b.Property<string>("Id")
.ValueGeneratedOnAdd();
b.Property<string>("Id");
b.Property<int>("AccessFailedCount");
@ -78,8 +75,7 @@ namespace IdentitySample.DefaultUI.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.ValueGeneratedOnAdd();
b.Property<string>("Id");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken();
@ -103,7 +99,8 @@ namespace IdentitySample.DefaultUI.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("ClaimType");
@ -122,7 +119,8 @@ namespace IdentitySample.DefaultUI.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("ClaimType");
@ -190,47 +188,53 @@ namespace IdentitySample.DefaultUI.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser")
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser")
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser")
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser")
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade);
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618
}

View File

@ -31,4 +31,8 @@
<Reference Include="Microsoft.Extensions.Logging.Debug" />
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />
</ItemGroup>
</Project>

View File

@ -1,25 +0,0 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:54840/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"web": {
"commandName": "web",
"environmentVariables": {
"ASPNET_ENVIRONMENT": "Development"
}
}
}
}

View File

@ -11,6 +11,8 @@
<SuppressIces>ICE03</SuppressIces>
<DisableGuidGeneration>true</DisableGuidGeneration>
<SchemaVersion>2.0</SchemaVersion>
<TempPlatform Condition="'$(Platform)' == 'x64'">x64</TempPlatform>
<TempPlatform Condition="'$(Platform)' == 'x86'">Win32</TempPlatform>
</PropertyGroup>
<ItemGroup>
@ -51,6 +53,15 @@
</ProjectReference>
</ItemGroup>
<Target Name="CopyBuildOutputToArtifactDirectory"
Condition=" '$(IsProductInstaller)' == 'true' "
AfterTargets="Build">
<ItemGroup>
<BuildContentForAncm Include="$(RepositoryRoot)src\Servers\IIS\AspNetCoreModuleV2\AspNetCore\bin\$(Configuration)\$(TempPlatform)\*.*" />
</ItemGroup>
<Copy SourceFiles="@(BuildContentForAncm)" DestinationFolder="$(InstallersOutputPath)\IISExpressSymbols\$(TempPlatform)" />
</Target>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), Directory.Build.targets))\Directory.Build.targets" />
<Import Project="..\build\settings.props" />
<Import Project="..\build\versions.props" />

View File

@ -366,66 +366,25 @@
Value="&quot;[IISEXPRESS_INSTALL_PATH]appcmd.exe&quot; set config -section:system.webServer/httpCompression /+&quot;dynamicTypes.[\[]mimeType='text/event-stream',enabled='FALSE'[\]]&quot; /apphostconfig:&quot;[IISEXPRESS_APPHOST_CONFIG_TMP]&quot;"/>
<CustomAction Id="CA_UPDATE_DYNAMIC_COMPRESSION_TMP" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>
<!-- CA to add config section to applicationhost.config -->
<CustomAction Id="CA_ADD_CONFIGSECTION_PROPERTY"
Property="CA_ADD_CONFIGSECTION"
Value="[IISEXPRESS_APPHOST_CONFIG];[IISEXPRESS_APPHOST_CONFIG_TMP]"/>
<CustomAction Id="CA_ADD_CONFIGSECTION" Script="jscript" Execute="deferred" Return="check" Impersonate="no">
<![CDATA[
var caData = Session.Property("CustomActionData");
configfiles = caData.split(';');
for (var i = 0; i < configfiles.length; i++) {
var configfile = configfiles[i];
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");
xmlDoc.async = false;
xmlDoc.preserveWhiteSpace = true;
xmlDoc.load(configfile );
if (xmlDoc.parseError.errorCode == 0) {
xmlDoc.setProperty("SelectionLanguage", "XPath");
var websvrNode = xmlDoc.selectSingleNode("//configuration/configSections/sectionGroup[@name=\"system.webServer\"]");
if (websvrNode != null) {
var ancmNode = xmlDoc.selectSingleNode("//configuration/configSections/sectionGroup[@name=\"system.webServer\"]/section[@name=\"$(var.AspNetCoreSectionName)\"]");
if (ancmNode == null) {
ancmNode = xmlDoc.createElement("section");
ancmNode.setAttribute("name", "$(var.AspNetCoreSectionName)");
ancmNode.setAttribute("overrideModeDefault", "Allow");
websvrNode.appendChild(ancmNode);
xmlDoc.save(configfile );
}
}
}
}
]]>
</CustomAction>
Value="[IISEXPRESS_APPHOST_CONFIG]"/>
<CustomAction BinaryKey="IISCustomActionDll" Id="CA_ADD_CONFIGSECTION" DllEntry="AddConfigSection" Execute="deferred" Return="check" Impersonate="no"/>
<CustomAction Id="CA_ADD_CONFIGSECTION_PROPERTY_TMP"
Property="CA_ADD_CONFIGSECTION_TMP"
Value="[IISEXPRESS_APPHOST_CONFIG_TMP]"/>
<CustomAction BinaryKey="IISCustomActionDll" Id="CA_ADD_CONFIGSECTION_TMP" DllEntry="AddConfigSection" Execute="deferred" Return="check" Impersonate="no"/>
<!-- CA to remove config section to applicationhost.config -->
<CustomAction Id="CA_REMOVE_CONFIGSECTION_PROPERTY"
Property="CA_REMOVE_CONFIGSECTION"
Value="[IISEXPRESS_APPHOST_CONFIG];[IISEXPRESS_APPHOST_CONFIG_TMP]"/>
<CustomAction Id="CA_REMOVE_CONFIGSECTION" Script="jscript" Execute="deferred" Return="check" Impersonate="no">
<![CDATA[
var caData = Session.Property("CustomActionData");
configfiles = caData.split(';');
for (var i = 0; i < configfiles.length; i++) {
var configfile = configfiles[i];
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");
xmlDoc.async = false;
xmlDoc.preserveWhiteSpace = true;
xmlDoc.load(configfile );
if (xmlDoc.parseError.errorCode == 0) {
xmlDoc.setProperty("SelectionLanguage", "XPath");
var websvrNode = xmlDoc.selectSingleNode("//configuration/configSections/sectionGroup[@name=\"system.webServer\"]");
if (websvrNode != null) {
var ancmNode = xmlDoc.selectSingleNode("//configuration/configSections/sectionGroup[@name=\"system.webServer\"]/section[@name=\"$(var.AspNetCoreSectionName)\"]");
if (ancmNode != null) {
websvrNode.removeChild(ancmNode);
xmlDoc.save(configfile );
}
}
}
}
]]>
</CustomAction>
Property="CA_REMOVE_CONFIGSECTION"
Value="[IISEXPRESS_APPHOST_CONFIG]"/>
<CustomAction Id="CA_REMOVE_CONFIGSECTION" BinaryKey="IISCustomActionDll" DllEntry="RemoveConfigSection" Execute="deferred" Return="check" Impersonate="no" />
<CustomAction Id="CA_REMOVE_CONFIGSECTION_PROPERTY_TMP"
Property="CA_REMOVE_CONFIGSECTION_TMP"
Value="[IISEXPRESS_APPHOST_CONFIG_TMP]"/>
<CustomAction Id="CA_REMOVE_CONFIGSECTION_TMP" BinaryKey="IISCustomActionDll" DllEntry="RemoveConfigSection" Execute="deferred" Return="check" Impersonate="no" />
<?if $(var.Platform) = "x64" ?>
<CustomAction Id="CA_UNLOCK_HANDLER32_PROPERTY"
@ -520,68 +479,25 @@
Value="&quot;[IISEXPRESS_INSTALL_PATH32]appcmd.exe&quot; set config -section:system.webServer/httpCompression /+&quot;dynamicTypes.[\[]mimeType='text/event-stream',enabled='FALSE'[\]]&quot; /apphostconfig:&quot;[IISEXPRESS_APPHOST_CONFIG32]&quot;"/>
<CustomAction Id="CA_UPDATE_DYNAMIC_COMPRESSION_TMP32" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>
<!-- CA to add config section to applicationhost.config -->
<CustomAction Id="CA_ADD_CONFIGSECTION32_PROPERTY"
Property="CA_ADD_CONFIGSECTION32"
Value="[IISEXPRESS_APPHOST_CONFIG32];[IISEXPRESS_APPHOST_CONFIG_TMP32]"/>
<CustomAction Id="CA_ADD_CONFIGSECTION32" Script="jscript" Execute="deferred" Return="check" Impersonate="no">
<!-- Warning LGHT1076: ICE03: String overflow. Orca.exe inspection shows the custom action value is populated correctly -->
<![CDATA[
var caData = Session.Property("CustomActionData");
configfiles = caData.split(';');
for (var i = 0; i < configfiles.length; i++) {
var configfile = configfiles[i];
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");
xmlDoc.async = false;
xmlDoc.preserveWhiteSpace = true;
xmlDoc.load(configfile);
if (xmlDoc.parseError.errorCode == 0) {
xmlDoc.setProperty("SelectionLanguage", "XPath");
var websvrNode = xmlDoc.selectSingleNode("//configuration/configSections/sectionGroup[@name=\"system.webServer\"]");
if (websvrNode != null) {
var ancmNode = xmlDoc.selectSingleNode("//configuration/configSections/sectionGroup[@name=\"system.webServer\"]/section[@name=\"$(var.AspNetCoreSectionName)\"]");
if (ancmNode == null) {
ancmNode = xmlDoc.createElement("section");
ancmNode.setAttribute("name", "$(var.AspNetCoreSectionName)");
ancmNode.setAttribute("overrideModeDefault", "Allow");
websvrNode.appendChild(ancmNode);
xmlDoc.save(configfile);
}
}
}
}
]]>
</CustomAction>
Property="CA_ADD_CONFIGSECTION32"
Value="[IISEXPRESS_APPHOST_CONFIG32]"/>
<CustomAction BinaryKey="IISCustomActionDll" Id="CA_ADD_CONFIGSECTION32" DllEntry="AddConfigSection" Execute="deferred" Return="check" Impersonate="no"/>
<CustomAction Id="CA_ADD_CONFIGSECTION32_PROPERTY_TMP"
Property="CA_ADD_CONFIGSECTION32_TMP"
Value="[IISEXPRESS_APPHOST_CONFIG_TMP32]"/>
<CustomAction BinaryKey="IISCustomActionDll" Id="CA_ADD_CONFIGSECTION32_TMP" DllEntry="AddConfigSection" Execute="deferred" Return="check" Impersonate="no"/>
<!-- CA to remove config section to applicationhost.config -->
<CustomAction Id="CA_REMOVE_CONFIGSECTION32_PROPERTY"
Property="CA_REMOVE_CONFIGSECTION32"
Value="[IISEXPRESS_APPHOST_CONFIG32];[IISEXPRESS_APPHOST_CONFIG_TMP32]"/>
<CustomAction Id="CA_REMOVE_CONFIGSECTION32" Script="jscript" Execute="deferred" Return="check" Impersonate="no">
<![CDATA[
var caData = Session.Property("CustomActionData");
configfiles = caData.split(';');
for (var i = 0; i < configfiles.length; i++) {
var configfile = configfiles[i];
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");
xmlDoc.async = false;
xmlDoc.preserveWhiteSpace = true;
xmlDoc.load(configfile);
if (xmlDoc.parseError.errorCode == 0) {
xmlDoc.setProperty("SelectionLanguage", "XPath");
var websvrNode = xmlDoc.selectSingleNode("//configuration/configSections/sectionGroup[@name=\"system.webServer\"]");
if (websvrNode != null) {
var ancmNode = xmlDoc.selectSingleNode("//configuration/configSections/sectionGroup[@name=\"system.webServer\"]/section[@name=\"$(var.AspNetCoreSectionName)\"]");
if (ancmNode != null) {
websvrNode.removeChild(ancmNode);
xmlDoc.save(configfile);
}
}
}
}
]]>
</CustomAction>
Value="[IISEXPRESS_APPHOST_CONFIG32]"/>
<CustomAction Id="CA_REMOVE_CONFIGSECTION32" BinaryKey="IISCustomActionDll" DllEntry="RemoveConfigSection" Execute="deferred" Return="check" Impersonate="no" />
<CustomAction Id="CA_REMOVE_CONFIGSECTION32_PROPERTY_TMP"
Property="CA_REMOVE_CONFIGSECTION32_TMP"
Value="[IISEXPRESS_APPHOST_CONFIG_TMP32]"/>
<CustomAction Id="CA_REMOVE_CONFIGSECTION32_TMP" BinaryKey="IISCustomActionDll" DllEntry="RemoveConfigSection" Execute="deferred" Return="check" Impersonate="no" />
<?endif?>
<InstallExecuteSequence>
@ -600,7 +516,9 @@
<Custom Action="CA_SET_MODULE" After="CA_SET_MODULE_PROPERTY"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_CONFIGSECTION_PROPERTY" After="CA_SET_MODULE"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_CONFIGSECTION" After="CA_ADD_CONFIGSECTION_PROPERTY"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_TRACE_PROVIDER_DEFINITION_PROPERTY" After="CA_ADD_CONFIGSECTION"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_CONFIGSECTION_PROPERTY_TMP" After="CA_ADD_CONFIGSECTION"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_CONFIGSECTION_TMP" After="CA_ADD_CONFIGSECTION_PROPERTY_TMP"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_TRACE_PROVIDER_DEFINITION_PROPERTY" After="CA_ADD_CONFIGSECTION_TMP"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_TRACE_PROVIDER_DEFINITION" After="CA_ADD_TRACE_PROVIDER_DEFINITION_PROPERTY"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_TRACE_PROVIDER_DEFINITION_TMP_PROPERTY" After="CA_ADD_TRACE_PROVIDER_DEFINITION"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_TRACE_PROVIDER_DEFINITION_TMP" After="CA_ADD_TRACE_PROVIDER_DEFINITION_TMP_PROPERTY"><![CDATA[(NOT REMOVE)]]></Custom>
@ -610,6 +528,8 @@
<Custom Action="CA_REMOVE_MODULE" Before="RemoveFiles"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_CONFIGSECTION_PROPERTY" Before="CA_REMOVE_CONFIGSECTION"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_CONFIGSECTION" Before="RemoveFiles"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_CONFIGSECTION_PROPERTY_TMP" Before="CA_REMOVE_CONFIGSECTION_TMP"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_CONFIGSECTION_TMP" Before="RemoveFiles"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_TRACE_PROVIDER_DEFINITION_PROPERTY" Before="CA_REMOVE_TRACE_PROVIDER_DEFINITION"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_TRACE_PROVIDER_DEFINITION" Before="RemoveFiles"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_TRACE_PROVIDER_DEFINITION_TMP_PROPERTY" Before="CA_REMOVE_TRACE_PROVIDER_DEFINITION_TMP"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
@ -640,7 +560,9 @@
<Custom Action="CA_SET_MODULE32" After="CA_ADD_MODULE32_PROPERTY"><![CDATA[(NOT REMOVE AND IISEXPRESS_INSTALL_PATH32)]]></Custom>
<Custom Action="CA_ADD_CONFIGSECTION32_PROPERTY" After="CA_SET_MODULE32"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_CONFIGSECTION32" After="CA_ADD_CONFIGSECTION32_PROPERTY"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_TRACE_PROVIDER_DEFINITION32_PROPERTY" After="CA_ADD_CONFIGSECTION32"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_CONFIGSECTION32_PROPERTY_TMP" After="CA_ADD_CONFIGSECTION32"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_CONFIGSECTION32_TMP" After="CA_ADD_CONFIGSECTION32_PROPERTY_TMP"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_TRACE_PROVIDER_DEFINITION32_PROPERTY" After="CA_ADD_CONFIGSECTION32_TMP"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_TRACE_PROVIDER_DEFINITION32" After="CA_ADD_TRACE_PROVIDER_DEFINITION32_PROPERTY"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_TRACE_PROVIDER_DEFINITION_TMP32_PROPERTY" After="CA_ADD_TRACE_PROVIDER_DEFINITION32"><![CDATA[(NOT REMOVE)]]></Custom>
<Custom Action="CA_ADD_TRACE_PROVIDER_DEFINITION_TMP32" After="CA_ADD_TRACE_PROVIDER_DEFINITION_TMP32_PROPERTY"><![CDATA[(NOT REMOVE)]]></Custom>
@ -650,6 +572,8 @@
<Custom Action="CA_REMOVE_MODULE32" After="CA_REMOVE_MODULE32_PROPERTY"><![CDATA[(REMOVE~="ALL" AND IISEXPRESS_INSTALL_PATH32 AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_CONFIGSECTION32_PROPERTY" Before="CA_REMOVE_CONFIGSECTION32"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_CONFIGSECTION32" Before="RemoveFiles"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_CONFIGSECTION32_PROPERTY_TMP" Before="CA_REMOVE_CONFIGSECTION32_TMP"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_CONFIGSECTION32_TMP" Before="RemoveFiles"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_TRACE_PROVIDER_DEFINITION32_PROPERTY" Before="CA_REMOVE_TRACE_PROVIDER_DEFINITION32"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_TRACE_PROVIDER_DEFINITION32" Before="RemoveFiles"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_TRACE_PROVIDER_DEFINITION_TMP32_PROPERTY" Before="CA_REMOVE_TRACE_PROVIDER_DEFINITION_TMP32"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>

View File

@ -2,6 +2,8 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#include <precomp.h>
#include <MsiQuery.h>
#include <msxml6.h>
DECLARE_DEBUG_PRINT_OBJECT( "proxyCA.dll" );
@ -40,6 +42,137 @@ struct COMPRESSION_MIME_TYPE
COMPRESSION_MIME_TYPE gMimeTypes[] =
{ { L"text/event-stream", FALSE} };
#define _HR_RET(hr) __pragma(warning(push)) \
__pragma(warning(disable:26498)) /*disable constexpr warning */ \
const HRESULT __hrRet = hr; \
__pragma(warning(pop))
#define _GOTO_FINISHED() __pragma(warning(push)) \
__pragma(warning(disable:26438)) /*disable avoid goto warning*/ \
goto Finished \
__pragma(warning(pop))
#define RETURN_IF_FAILED(hrr) do { _HR_RET(hrr); if (FAILED(__hrRet)) { hr = __hrRet; IISLogWrite(SETUP_LOG_SEVERITY_INFORMATION, L"Exiting hr=0x%x", hr); return hr; }} while (0, 0)
// Modifies the configSections to include the aspNetCore section
UINT
WINAPI
AddConfigSection(
IN MSIHANDLE handle
)
{
HRESULT hr;
CComPtr<IXMLDOMDocument2> pXMLDoc;
VARIANT_BOOL variantResult;
IXMLDOMNode* webServerNode;
IXMLDOMNode* aspNetCoreNode;
IXMLDOMNode* tempNode;
IXMLDOMElement* element;
STRU customActionData;
CComBSTR selectLanguage = SysAllocString(L"SelectionLanguage");
CComBSTR xPath = SysAllocString(L"XPath");
CComBSTR webServerPath = SysAllocString(L"//configuration/configSections/sectionGroup[@name=\"system.webServer\"]");
CComBSTR aspNetCorePath = SysAllocString(L"//configuration/configSections/sectionGroup[@name=\"system.webServer\"]/section[@name=\"aspNetCore\"]");
CComBSTR section = SysAllocString(L"section");
CComBSTR name = SysAllocString(L"name");
CComBSTR aspNetCore = SysAllocString(L"aspNetCore");
CComBSTR overrideMode = SysAllocString(L"overrideModeDefault");
CComBSTR allow = SysAllocString(L"Allow");
RETURN_IF_FAILED(CoInitialize(NULL));
hr = MsiUtilGetProperty(handle, TEXT("CustomActionData"), &customActionData);
RETURN_IF_FAILED(hr = pXMLDoc.CoCreateInstance(__uuidof(DOMDocument60)));
RETURN_IF_FAILED(hr = pXMLDoc->put_async(false));
RETURN_IF_FAILED(hr = pXMLDoc->load(CComVariant(customActionData.QueryStr()), &variantResult));
if (variantResult == VARIANT_FALSE)
{
return ERROR_SUCCESS;
}
RETURN_IF_FAILED(hr = pXMLDoc->setProperty(selectLanguage, CComVariant(xPath)));
RETURN_IF_FAILED(hr = pXMLDoc->selectSingleNode(webServerPath, &webServerNode));
RETURN_IF_FAILED(hr = pXMLDoc->selectSingleNode(aspNetCorePath, &aspNetCoreNode));
if (aspNetCoreNode == NULL)
{
RETURN_IF_FAILED(hr = pXMLDoc->createElement(section, &element));
RETURN_IF_FAILED(hr = element->setAttribute(name, CComVariant(aspNetCore)));
RETURN_IF_FAILED(hr = element->setAttribute(overrideMode, CComVariant(allow)));
RETURN_IF_FAILED(hr = webServerNode->appendChild(element, &tempNode));
RETURN_IF_FAILED(hr = pXMLDoc->save(CComVariant(customActionData.QueryStr())));
}
return ERROR_SUCCESS;
}
// Modifies the configSections to remove the aspNetCore section
UINT
WINAPI
RemoveConfigSection(
IN MSIHANDLE handle
)
{
HRESULT hr;
CComPtr<IXMLDOMDocument2> pXMLDoc;
VARIANT_BOOL variantResult;
IXMLDOMNode* webServerNode;
IXMLDOMNode* aspNetCoreNode;
IXMLDOMNode* tempNode;
STRU customActionData;
CComBSTR selectLanguage = SysAllocString(L"SelectionLanguage");
CComBSTR xPath = SysAllocString(L"XPath");
CComBSTR webServerPath = SysAllocString(L"//configuration/configSections/sectionGroup[@name=\"system.webServer\"]");
CComBSTR aspNetCorePath = SysAllocString(L"//configuration/configSections/sectionGroup[@name=\"system.webServer\"]/section[@name=\"aspNetCore\"]");
CComBSTR section = SysAllocString(L"section");
CComBSTR name = SysAllocString(L"name");
CComBSTR aspNetCore = SysAllocString(L"aspNetCore");
CComBSTR overrideMode = SysAllocString(L"overrideModeDefault");
CComBSTR allow = SysAllocString(L"Allow");
RETURN_IF_FAILED(CoInitialize(NULL));
hr = MsiUtilGetProperty(handle, TEXT("CustomActionData"), &customActionData);
RETURN_IF_FAILED(hr = pXMLDoc.CoCreateInstance(__uuidof(DOMDocument60)));
RETURN_IF_FAILED(hr = pXMLDoc->put_async(false));
RETURN_IF_FAILED(hr = pXMLDoc->load(CComVariant(customActionData.QueryStr()), &variantResult));
if (variantResult == VARIANT_FALSE)
{
return ERROR_SUCCESS;
}
RETURN_IF_FAILED(hr = pXMLDoc->setProperty(selectLanguage, CComVariant(xPath)));
RETURN_IF_FAILED(hr = pXMLDoc->selectSingleNode(webServerPath, &webServerNode));
RETURN_IF_FAILED(hr = pXMLDoc->selectSingleNode(aspNetCorePath, &aspNetCoreNode));
if (aspNetCoreNode != NULL)
{
RETURN_IF_FAILED(webServerNode->removeChild(aspNetCoreNode, &tempNode));
RETURN_IF_FAILED(hr = pXMLDoc->save(CComVariant(customActionData.QueryStr())));
}
return ERROR_SUCCESS;
}
UINT
WINAPI
RegisterANCMCompressionCA(

View File

@ -18,6 +18,8 @@ EXPORTS
ExecuteCleanUpWindowsHotfixCA
ScheduleRebootIfRequiredCA
AddConfigSection
RemoveConfigSection
RegisterANCMCompressionCA
CheckForServicesRunningCA

View File

@ -48,6 +48,9 @@
<PropertyGroup Condition="'$(Configuration)'=='Release'">
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Label="Configuration">
<VCToolsVersion />
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<PropertyGroup>
<AdditionalIncludeDirectories>$(IIS-Common)version;$(IIS-Common)Include;$(IIS-Setup)iisca\lib;$(WIX)sdk\$(WixPlatformToolset)\inc;$(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

View File

@ -41,6 +41,9 @@
<IncludePath>$(ProjectDir)..\include;$(IncludePath)</IncludePath>
<TargetName>iiscommon</TargetName>
</PropertyGroup>
<PropertyGroup Label="Configuration">
<VCToolsVersion />
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<SDLCheck>true</SDLCheck>

View File

@ -77,6 +77,9 @@
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<PropertyGroup Label="Configuration">
<VCToolsVersion />
</PropertyGroup>
<PropertyGroup>
<AdditionalIncludeDirectories>$(IIS-Common)version;$(IIS-Common)Include;$(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PrecompiledHeader>Create</PrecompiledHeader>

Binary file not shown.

View File

@ -53,11 +53,31 @@ namespace Microsoft.AspNetCore.HeaderPropagation
{
var outputName = string.IsNullOrEmpty(entry?.OutboundHeaderName) ? headerName : entry.OutboundHeaderName;
if (!request.Headers.Contains(outputName) &&
_values.Headers.TryGetValue(headerName, out var values) &&
!StringValues.IsNullOrEmpty(values))
var hasContent = request.Content != null;
if (!request.Headers.TryGetValues(outputName, out var _) &&
!(hasContent && request.Content.Headers.TryGetValues(outputName, out var _)))
{
request.Headers.TryAddWithoutValidation(outputName, (string[])values);
if (_values.Headers.TryGetValue(headerName, out var stringValues) &&
!StringValues.IsNullOrEmpty(stringValues))
{
if (stringValues.Count == 1)
{
var value = (string)stringValues;
if (!request.Headers.TryAddWithoutValidation(outputName, value) && hasContent)
{
request.Content.Headers.TryAddWithoutValidation(outputName, value);
}
}
else
{
var values = (string[])stringValues;
if (!request.Headers.TryAddWithoutValidation(outputName, values) && hasContent)
{
request.Content.Headers.TryAddWithoutValidation(outputName, values);
}
}
}
}
}

View File

@ -52,6 +52,63 @@ namespace Microsoft.AspNetCore.HeaderPropagation.Tests
Assert.Equal(new[] { "test" }, Handler.Headers.GetValues("out"));
}
[Fact]
public async Task HeaderInState_WithMultipleValues_AddAllValues()
{
// Arrange
Configuration.Headers.Add("in", new HeaderPropagationEntry { OutboundHeaderName = "out" });
State.Headers.Add("in", new[] { "one", "two" });
// Act
await Client.SendAsync(new HttpRequestMessage());
// Assert
Assert.True(Handler.Headers.Contains("out"));
Assert.Equal(new[] { "one", "two" }, Handler.Headers.GetValues("out"));
}
[Fact]
public async Task HeaderInState_RequestWithContent_ContentHeaderPresent_DoesNotAddIt()
{
Configuration.Headers.Add("in", new HeaderPropagationEntry() { OutboundHeaderName = "Content-Type" });
State.Headers.Add("in", "test");
// Act
await Client.SendAsync(new HttpRequestMessage() { Content = new StringContent("test") });
// Assert
Assert.True(Handler.Content.Headers.Contains("Content-Type"));
Assert.Equal(new[] { "text/plain; charset=utf-8" }, Handler.Content.Headers.GetValues("Content-Type"));
}
[Fact]
public async Task HeaderInState_RequestWithContent_ContentHeaderNotPresent_AddValue()
{
Configuration.Headers.Add("in", new HeaderPropagationEntry() { OutboundHeaderName = "Content-Language" });
State.Headers.Add("in", "test");
// Act
await Client.SendAsync(new HttpRequestMessage() { Content = new StringContent("test") });
// Assert
Assert.True(Handler.Content.Headers.Contains("Content-Language"));
Assert.Equal(new[] { "test" }, Handler.Content.Headers.GetValues("Content-Language"));
}
[Fact]
public async Task HeaderInState_WithMultipleValues_RequestWithContent_ContentHeaderNotPresent_AddAllValues()
{
Configuration.Headers.Add("in", new HeaderPropagationEntry() { OutboundHeaderName = "Content-Language" });
State.Headers.Add("in", new[] { "one", "two" });
// Act
await Client.SendAsync(new HttpRequestMessage() { Content = new StringContent("test") });
// Assert
Assert.True(Handler.Content.Headers.Contains("Content-Language"));
Assert.Equal(new[] { "one", "two" }, Handler.Content.Headers.GetValues("Content-Language"));
}
[Fact]
public async Task HeaderInState_NoOutputName_UseInputName()
{
@ -168,11 +225,13 @@ namespace Microsoft.AspNetCore.HeaderPropagation.Tests
private class SimpleHandler : DelegatingHandler
{
public HttpHeaders Headers { get; private set; }
public HttpContent Content { get; private set; }
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
Headers = request.Headers;
Content = request.Content;
return Task.FromResult(new HttpResponseMessage());
}
}

View File

@ -21,12 +21,15 @@
<Target Name="YarnInstall">
<Message Text="Running yarn install on $(MSBuildProjectFile)" Importance="High" />
<Yarn Command="install" ContinueOnError="true">
<Output TaskParameter="ExitCode" PropertyName="_YarnExitCode"/>
</Yarn>
<Yarn Command="install" Condition="'$(_YarnExitCode)' != '0'">
<Output TaskParameter="ExitCode" PropertyName="_YarnExitCode"/>
</Yarn>
<Yarn Command="install" />
</Target>
<Target Name="_IsCustomRestoreTargetSupported" Returns="@(CustomRestoreTargets)" Condition="'$(BuildNodeJs)' == 'true'">
<ItemGroup>
<CustomRestoreTargets Include="$(MSBuildProjectFullPath)">
<Targets>YarnInstall</Targets>
</CustomRestoreTargets>
</ItemGroup>
</Target>
<Target Name="PrepublishScript" DependsOnTargets="YarnInstall" BeforeTargets="PrepareForPublish" Condition=" '$(IsCrossTargetingBuild)' != 'true' ">

View File

@ -25,12 +25,15 @@
<Target Name="YarnInstall">
<Message Text="Running yarn install on $(MSBuildProjectFile)" Importance="High" />
<Yarn Command="install" ContinueOnError="true">
<Output TaskParameter="ExitCode" PropertyName="_YarnExitCode"/>
</Yarn>
<Yarn Command="install" Condition="'$(_YarnExitCode)' != '0'">
<Output TaskParameter="ExitCode" PropertyName="_YarnExitCode"/>
</Yarn>
<Yarn Command="install" />
</Target>
<Target Name="_IsCustomRestoreTargetSupported" Returns="@(CustomRestoreTargets)" Condition="'$(BuildNodeJs)' == 'true'">
<ItemGroup>
<CustomRestoreTargets Include="$(MSBuildProjectFullPath)">
<Targets>YarnInstall</Targets>
</CustomRestoreTargets>
</ItemGroup>
</Target>
<Target Name="PrepublishScript" DependsOnTargets="YarnInstall" BeforeTargets="PrepareForPublish" Condition=" '$(IsCrossTargetingBuild)' != 'true' ">

View File

@ -57,46 +57,133 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
_cursor = new FilterCursor(filters);
}
public virtual async Task InvokeAsync()
public virtual Task InvokeAsync()
{
if (_diagnosticListener.IsEnabled() || _logger.IsEnabled(LogLevel.Information))
{
return Logged(this);
}
_actionContextAccessor.ActionContext = _actionContext;
var scope = _logger.ActionScope(_actionContext.ActionDescriptor);
Task task = null;
try
{
_actionContextAccessor.ActionContext = _actionContext;
task = InvokeFilterPipelineAsync();
}
catch (Exception exception)
{
return Awaited(this, Task.FromException(exception), scope);
}
_diagnosticListener.BeforeAction(
_actionContext.ActionDescriptor,
_actionContext.HttpContext,
_actionContext.RouteData);
Debug.Assert(task != null);
if (!task.IsCompletedSuccessfully)
{
return Awaited(this, task, scope);
}
using (_logger.ActionScope(_actionContext.ActionDescriptor))
Exception releaseException = null;
try
{
ReleaseResources();
}
catch (Exception exception)
{
releaseException = exception;
}
Exception scopeException = null;
try
{
scope.Dispose();
}
catch (Exception exception)
{
scopeException = exception;
}
if (releaseException == null && scopeException == null)
{
return Task.CompletedTask;
}
else if (releaseException != null && scopeException != null)
{
return Task.FromException(new AggregateException(releaseException, scopeException));
}
else if (releaseException != null)
{
return Task.FromException(releaseException);
}
else
{
return Task.FromException(scopeException);
}
static async Task Awaited(ResourceInvoker invoker, Task task, IDisposable scope)
{
try
{
_logger.ExecutingAction(_actionContext.ActionDescriptor);
_logger.AuthorizationFiltersExecutionPlan(_filters);
_logger.ResourceFiltersExecutionPlan(_filters);
_logger.ActionFiltersExecutionPlan(_filters);
_logger.ExceptionFiltersExecutionPlan(_filters);
_logger.ResultFiltersExecutionPlan(_filters);
var stopwatch = ValueStopwatch.StartNew();
try
{
await InvokeFilterPipelineAsync();
await task;
}
finally
{
ReleaseResources();
_logger.ExecutedAction(_actionContext.ActionDescriptor, stopwatch.GetElapsedTime());
invoker.ReleaseResources();
}
}
finally
{
scope.Dispose();
}
}
finally
static async Task Logged(ResourceInvoker invoker)
{
_diagnosticListener.AfterAction(
_actionContext.ActionDescriptor,
_actionContext.HttpContext,
_actionContext.RouteData);
var actionContext = invoker._actionContext;
invoker._actionContextAccessor.ActionContext = actionContext;
try
{
var logger = invoker._logger;
invoker._diagnosticListener.BeforeAction(
actionContext.ActionDescriptor,
actionContext.HttpContext,
actionContext.RouteData);
using (logger.ActionScope(actionContext.ActionDescriptor))
{
logger.ExecutingAction(actionContext.ActionDescriptor);
var filters = invoker._filters;
logger.AuthorizationFiltersExecutionPlan(filters);
logger.ResourceFiltersExecutionPlan(filters);
logger.ActionFiltersExecutionPlan(filters);
logger.ExceptionFiltersExecutionPlan(filters);
logger.ResultFiltersExecutionPlan(filters);
var stopwatch = ValueStopwatch.StartNew();
try
{
await invoker.InvokeFilterPipelineAsync();
}
finally
{
invoker.ReleaseResources();
logger.ExecutedAction(actionContext.ActionDescriptor, stopwatch.GetElapsedTime());
}
}
}
finally
{
invoker._diagnosticListener.AfterAction(
actionContext.ActionDescriptor,
actionContext.HttpContext,
actionContext.RouteData);
}
}
}
@ -106,7 +193,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
/// </summary>
protected abstract void ReleaseResources();
private async Task InvokeFilterPipelineAsync()
private Task InvokeFilterPipelineAsync()
{
var next = State.InvokeBegin;
@ -121,30 +208,64 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
// `isCompleted` will be set to true when we've reached a terminal state.
var isCompleted = false;
while (!isCompleted)
try
{
await Next(ref next, ref scope, ref state, ref isCompleted);
while (!isCompleted)
{
var lastTask = Next(ref next, ref scope, ref state, ref isCompleted);
if (!lastTask.IsCompletedSuccessfully)
{
return Awaited(this, lastTask, next, scope, state, isCompleted);
}
}
return Task.CompletedTask;
}
catch (Exception ex)
{
// Wrap non task-wrapped exceptions in a Task,
// as this isn't done automatically since the method is not async.
return Task.FromException(ex);
}
static async Task Awaited(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
{
await lastTask;
while (!isCompleted)
{
await invoker.Next(ref next, ref scope, ref state, ref isCompleted);
}
}
}
protected abstract Task InvokeInnerFilterAsync();
protected virtual async Task InvokeResultAsync(IActionResult result)
protected virtual Task InvokeResultAsync(IActionResult result)
{
var actionContext = _actionContext;
_diagnosticListener.BeforeActionResult(actionContext, result);
_logger.BeforeExecutingActionResult(result);
try
if (_diagnosticListener.IsEnabled() || _logger.IsEnabled(LogLevel.Trace))
{
await result.ExecuteResultAsync(actionContext);
return Logged(this, result);
}
finally
return result.ExecuteResultAsync(_actionContext);
static async Task Logged(ResourceInvoker invoker, IActionResult result)
{
_diagnosticListener.AfterActionResult(actionContext, result);
_logger.AfterExecutingActionResult(result);
var actionContext = invoker._actionContext;
invoker._diagnosticListener.BeforeActionResult(actionContext, result);
invoker._logger.BeforeExecutingActionResult(result);
try
{
await result.ExecuteResultAsync(actionContext);
}
finally
{
invoker._diagnosticListener.AfterActionResult(actionContext, result);
invoker._logger.AfterExecutingActionResult(result);
}
}
}
@ -207,7 +328,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
filter);
var task = filter.OnAuthorizationAsync(authorizationContext);
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.AuthorizationAsyncEnd;
return task;
@ -344,7 +465,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
filter);
var task = filter.OnResourceExecutionAsync(resourceExecutingContext, InvokeNextResourceFilterAwaitedAsync);
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.ResourceAsyncEnd;
return task;
@ -418,7 +539,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
}
var task = InvokeNextResourceFilter();
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.ResourceSyncEnd;
return task;
@ -463,7 +584,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
_result = _resourceExecutingContext.Result;
var task = InvokeAlwaysRunResultFilters();
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.ResourceEnd;
return task;
@ -512,7 +633,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
case State.ExceptionAsyncBegin:
{
var task = InvokeNextExceptionFilterAsync();
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.ExceptionAsyncResume;
return task;
@ -539,7 +660,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
filter);
var task = filter.OnExceptionAsync(exceptionContext);
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.ExceptionAsyncEnd;
return task;
@ -579,7 +700,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
case State.ExceptionSyncBegin:
{
var task = InvokeNextExceptionFilterAsync();
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.ExceptionSyncEnd;
return task;
@ -650,7 +771,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
_result = _exceptionContext.Result;
var task = InvokeAlwaysRunResultFilters();
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.ResourceInsideEnd;
return task;
@ -683,7 +804,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
}
var task = InvokeResultFilters();
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.ResourceInsideEnd;
return task;
@ -694,7 +815,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
case State.ActionBegin:
{
var task = InvokeInnerFilterAsync();
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.ActionEnd;
return task;
@ -715,7 +836,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
Debug.Assert(scope == Scope.Invoker || scope == Scope.Resource);
var task = InvokeResultFilters();
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.ResourceInsideEnd;
return task;
@ -763,13 +884,35 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
}
}
private async Task<ResourceExecutedContext> InvokeNextResourceFilterAwaitedAsync()
private Task<ResourceExecutedContext> InvokeNextResourceFilterAwaitedAsync()
{
Debug.Assert(_resourceExecutingContext != null);
if (_resourceExecutingContext.Result != null)
{
// If we get here, it means that an async filter set a result AND called next(). This is forbidden.
return Throw();
}
var task = InvokeNextResourceFilter();
if (!task.IsCompletedSuccessfully)
{
return Awaited(this, task);
}
Debug.Assert(_resourceExecutedContext != null);
return Task.FromResult(_resourceExecutedContext);
static async Task<ResourceExecutedContext> Awaited(ResourceInvoker invoker, Task task)
{
await task;
Debug.Assert(invoker._resourceExecutedContext != null);
return invoker._resourceExecutedContext;
}
#pragma warning disable CS1998
static async Task<ResourceExecutedContext> Throw()
{
var message = Resources.FormatAsyncResourceFilter_InvalidShortCircuit(
typeof(IAsyncResourceFilter).Name,
nameof(ResourceExecutingContext.Result),
@ -777,14 +920,10 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
typeof(ResourceExecutionDelegate).Name);
throw new InvalidOperationException(message);
}
await InvokeNextResourceFilter();
Debug.Assert(_resourceExecutedContext != null);
return _resourceExecutedContext;
#pragma warning restore CS1998
}
private async Task InvokeNextResourceFilter()
private Task InvokeNextResourceFilter()
{
try
{
@ -792,9 +931,14 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
var next = State.ResourceNext;
var state = (object)null;
var isCompleted = false;
while (!isCompleted)
{
await Next(ref next, ref scope, ref state, ref isCompleted);
var lastTask = Next(ref next, ref scope, ref state, ref isCompleted);
if (!lastTask.IsCompletedSuccessfully)
{
return Awaited(this, lastTask, next, scope, state, isCompleted);
}
}
}
catch (Exception exception)
@ -806,9 +950,32 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
}
Debug.Assert(_resourceExecutedContext != null);
return Task.CompletedTask;
static async Task Awaited(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
{
try
{
await lastTask;
while (!isCompleted)
{
await invoker.Next(ref next, ref scope, ref state, ref isCompleted);
}
}
catch (Exception exception)
{
invoker._resourceExecutedContext = new ResourceExecutedContext(invoker._resourceExecutingContext, invoker._filters)
{
ExceptionDispatchInfo = ExceptionDispatchInfo.Capture(exception),
};
}
Debug.Assert(invoker._resourceExecutedContext != null);
}
}
private async Task InvokeNextExceptionFilterAsync()
private Task InvokeNextExceptionFilterAsync()
{
try
{
@ -816,43 +983,119 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
var state = (object)null;
var scope = Scope.Exception;
var isCompleted = false;
while (!isCompleted)
{
await Next(ref next, ref scope, ref state, ref isCompleted);
var lastTask = Next(ref next, ref scope, ref state, ref isCompleted);
if (!lastTask.IsCompletedSuccessfully)
{
return Awaited(this, lastTask, next, scope, state, isCompleted);
}
}
return Task.CompletedTask;
}
catch (Exception ex)
{
// Wrap non task-wrapped exceptions in a Task,
// as this isn't done automatically since the method is not async.
return Task.FromException(ex);
}
static async Task Awaited(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
{
try
{
await lastTask;
while (!isCompleted)
{
await invoker.Next(ref next, ref scope, ref state, ref isCompleted);
}
}
catch (Exception exception)
{
invoker._exceptionContext = new ExceptionContext(invoker._actionContext, invoker._filters)
{
ExceptionDispatchInfo = ExceptionDispatchInfo.Capture(exception),
};
}
}
catch (Exception exception)
}
private Task InvokeAlwaysRunResultFilters()
{
try
{
_exceptionContext = new ExceptionContext(_actionContext, _filters)
var next = State.ResultBegin;
var scope = Scope.Invoker;
var state = (object)null;
var isCompleted = false;
while (!isCompleted)
{
ExceptionDispatchInfo = ExceptionDispatchInfo.Capture(exception),
};
var lastTask = ResultNext<IAlwaysRunResultFilter, IAsyncAlwaysRunResultFilter>(ref next, ref scope, ref state, ref isCompleted);
if (!lastTask.IsCompletedSuccessfully)
{
return Awaited(this, lastTask, next, scope, state, isCompleted);
}
}
return Task.CompletedTask;
}
catch (Exception ex)
{
// Wrap non task-wrapped exceptions in a Task,
// as this isn't done automatically since the method is not async.
return Task.FromException(ex);
}
static async Task Awaited(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
{
await lastTask;
while (!isCompleted)
{
await invoker.ResultNext<IAlwaysRunResultFilter, IAsyncAlwaysRunResultFilter>(ref next, ref scope, ref state, ref isCompleted);
}
}
}
private async Task InvokeAlwaysRunResultFilters()
private Task InvokeResultFilters()
{
var next = State.ResultBegin;
var scope = Scope.Invoker;
var state = (object)null;
var isCompleted = false;
while (!isCompleted)
try
{
await ResultNext<IAlwaysRunResultFilter, IAsyncAlwaysRunResultFilter>(ref next, ref scope, ref state, ref isCompleted);
var next = State.ResultBegin;
var scope = Scope.Invoker;
var state = (object)null;
var isCompleted = false;
while (!isCompleted)
{
var lastTask = ResultNext<IResultFilter, IAsyncResultFilter>(ref next, ref scope, ref state, ref isCompleted);
if (!lastTask.IsCompletedSuccessfully)
{
return Awaited(this, lastTask, next, scope, state, isCompleted);
}
}
return Task.CompletedTask;
}
}
private async Task InvokeResultFilters()
{
var next = State.ResultBegin;
var scope = Scope.Invoker;
var state = (object)null;
var isCompleted = false;
while (!isCompleted)
catch (Exception ex)
{
await ResultNext<IResultFilter, IAsyncResultFilter>(ref next, ref scope, ref state, ref isCompleted);
// Wrap non task-wrapped exceptions in a Task,
// as this isn't done automatically since the method is not async.
return Task.FromException(ex);
}
static async Task Awaited(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
{
await lastTask;
while (!isCompleted)
{
await invoker.ResultNext<IResultFilter, IAsyncResultFilter>(ref next, ref scope, ref state, ref isCompleted);
}
}
}
@ -916,7 +1159,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
filter);
var task = filter.OnResultExecutionAsync(resultExecutingContext, InvokeNextResultFilterAwaitedAsync<TFilter, TFilterAsync>);
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.ResultAsyncEnd;
return task;
@ -998,7 +1241,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
}
var task = InvokeNextResultFilterAsync<TFilter, TFilterAsync>();
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.ResultSyncEnd;
return task;
@ -1048,7 +1291,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
}
var task = InvokeResultAsync(_result);
if (task.Status != TaskStatus.RanToCompletion)
if (!task.IsCompletedSuccessfully)
{
next = State.ResultEnd;
return task;
@ -1081,7 +1324,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
}
}
private async Task InvokeNextResultFilterAsync<TFilter, TFilterAsync>()
private Task InvokeNextResultFilterAsync<TFilter, TFilterAsync>()
where TFilter : class, IResultFilter
where TFilterAsync : class, IAsyncResultFilter
{
@ -1093,7 +1336,11 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
var isCompleted = false;
while (!isCompleted)
{
await ResultNext<TFilter, TFilterAsync>(ref next, ref scope, ref state, ref isCompleted);
var lastTask = ResultNext<TFilter, TFilterAsync>(ref next, ref scope, ref state, ref isCompleted);
if (!lastTask.IsCompletedSuccessfully)
{
return Awaited(this, lastTask, next, scope, state, isCompleted);
}
}
}
catch (Exception exception)
@ -1105,9 +1352,33 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
}
Debug.Assert(_resultExecutedContext != null);
return Task.CompletedTask;
static async Task Awaited(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
{
try
{
await lastTask;
while (!isCompleted)
{
await invoker.ResultNext<TFilter, TFilterAsync>(ref next, ref scope, ref state, ref isCompleted);
}
}
catch (Exception exception)
{
invoker._resultExecutedContext = new ResultExecutedContext(invoker._actionContext, invoker._filters, invoker._result, invoker._instance)
{
ExceptionDispatchInfo = ExceptionDispatchInfo.Capture(exception),
};
}
Debug.Assert(invoker._resultExecutedContext != null);
}
}
private async Task<ResultExecutedContext> InvokeNextResultFilterAwaitedAsync<TFilter, TFilterAsync>()
private Task<ResultExecutedContext> InvokeNextResultFilterAwaitedAsync<TFilter, TFilterAsync>()
where TFilter : class, IResultFilter
where TFilterAsync : class, IAsyncResultFilter
{
@ -1116,6 +1387,28 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
{
// If we get here, it means that an async filter set cancel == true AND called next().
// This is forbidden.
return Throw();
}
var task = InvokeNextResultFilterAsync<TFilter, TFilterAsync>();
if (!task.IsCompletedSuccessfully)
{
return Awaited(this, task);
}
Debug.Assert(_resultExecutedContext != null);
return Task.FromResult(_resultExecutedContext);
static async Task<ResultExecutedContext> Awaited(ResourceInvoker invoker, Task task)
{
await task;
Debug.Assert(invoker._resultExecutedContext != null);
return invoker._resultExecutedContext;
}
#pragma warning disable CS1998
static async Task<ResultExecutedContext> Throw()
{
var message = Resources.FormatAsyncResultFilter_InvalidShortCircuit(
typeof(IAsyncResultFilter).Name,
nameof(ResultExecutingContext.Cancel),
@ -1124,13 +1417,10 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
throw new InvalidOperationException(message);
}
await InvokeNextResultFilterAsync<TFilter, TFilterAsync>();
Debug.Assert(_resultExecutedContext != null);
return _resultExecutedContext;
#pragma warning restore CS1998
}
private static void Rethrow(ResourceExecutedContext context)
{
if (context == null)

View File

@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure
private readonly IModelMetadataProvider _modelMetadataProvider;
private readonly ITempDataDictionaryFactory _tempDataFactory;
private readonly MvcOptions _mvcOptions;
private readonly HtmlHelperOptions _htmlHelperOptions;
private readonly MvcViewOptions _mvcViewOptions;
private readonly IPageHandlerMethodSelector _selector;
private readonly DiagnosticListener _diagnosticListener;
private readonly ILogger<PageActionInvoker> _logger;
@ -52,7 +52,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure
IModelBinderFactory modelBinderFactory,
ITempDataDictionaryFactory tempDataFactory,
IOptions<MvcOptions> mvcOptions,
IOptions<HtmlHelperOptions> htmlHelperOptions,
IOptions<MvcViewOptions> mvcViewOptions,
IPageHandlerMethodSelector selector,
DiagnosticListener diagnosticListener,
ILoggerFactory loggerFactory,
@ -69,7 +69,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure
modelBinderFactory,
tempDataFactory,
mvcOptions,
htmlHelperOptions,
mvcViewOptions,
selector,
diagnosticListener,
loggerFactory,
@ -90,7 +90,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure
IModelBinderFactory modelBinderFactory,
ITempDataDictionaryFactory tempDataFactory,
IOptions<MvcOptions> mvcOptions,
IOptions<HtmlHelperOptions> htmlHelperOptions,
IOptions<MvcViewOptions> mvcViewOptions,
IPageHandlerMethodSelector selector,
DiagnosticListener diagnosticListener,
ILoggerFactory loggerFactory,
@ -109,7 +109,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure
_modelMetadataProvider = modelMetadataProvider;
_tempDataFactory = tempDataFactory;
_mvcOptions = mvcOptions.Value;
_htmlHelperOptions = htmlHelperOptions.Value;
_mvcViewOptions = mvcViewOptions.Value;
_selector = selector;
_diagnosticListener = diagnosticListener;
_logger = loggerFactory.CreateLogger<PageActionInvoker>();
@ -214,7 +214,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure
cacheEntry,
_parameterBinder,
_tempDataFactory,
_htmlHelperOptions);
_mvcViewOptions.HtmlHelperOptions);
}
private PageActionInvokerCacheEntry CreateCacheEntry(

View File

@ -532,7 +532,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure
modelBinderFactory,
tempDataFactory.Object,
Options.Create(mvcOptions),
Options.Create(new HtmlHelperOptions()),
Options.Create(new MvcViewOptions()),
Mock.Of<IPageHandlerMethodSelector>(),
new DiagnosticListener("Microsoft.AspNetCore"),
NullLoggerFactory.Instance,

View File

@ -14,6 +14,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
/// </summary>
internal class SaveTempDataFilter : IResourceFilter, IResultFilter
{
private static readonly Func<object, Task> OnStartingCallback = (state) => OnStarting((HttpContext)state);
// Internal for unit testing
internal static readonly object SaveTempDataFilterContextKey = new object();
@ -43,38 +44,39 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
if (!context.HttpContext.Response.HasStarted)
{
context.HttpContext.Response.OnStarting((state) =>
{
var httpContext = (HttpContext)state;
var saveTempDataContext = GetTempDataContext(context.HttpContext);
if (saveTempDataContext.RequestHasUnhandledException)
{
return Task.CompletedTask;
}
// If temp data was already saved, skip trying to save again as the calls here would potentially fail
// because the session feature might not be available at this point.
// Example: An action returns NoContentResult and since NoContentResult does not write anything to
// the body of the response, this delegate would get executed way late in the pipeline at which point
// the session feature would have been removed.
if (saveTempDataContext.TempDataSaved)
{
return Task.CompletedTask;
}
SaveTempData(
result: null,
factory: saveTempDataContext.TempDataDictionaryFactory,
filters: saveTempDataContext.Filters,
httpContext: httpContext);
return Task.CompletedTask;
},
state: context.HttpContext);
context.HttpContext.Response.OnStarting(
callback: OnStartingCallback,
state: context.HttpContext);
}
}
private static Task OnStarting(HttpContext httpContext)
{
var saveTempDataContext = GetTempDataContext(httpContext);
if (saveTempDataContext.RequestHasUnhandledException)
{
return Task.CompletedTask;
}
// If temp data was already saved, skip trying to save again as the calls here would potentially fail
// because the session feature might not be available at this point.
// Example: An action returns NoContentResult and since NoContentResult does not write anything to
// the body of the response, this delegate would get executed way late in the pipeline at which point
// the session feature would have been removed.
if (saveTempDataContext.TempDataSaved)
{
return Task.CompletedTask;
}
SaveTempData(
result: null,
factory: saveTempDataContext.TempDataDictionaryFactory,
filters: saveTempDataContext.Filters,
httpContext: httpContext);
return Task.CompletedTask;
}
/// <inheritdoc />
public void OnResourceExecuted(ResourceExecutedContext context)
{
@ -115,7 +117,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
}
}
private SaveTempDataContext GetTempDataContext(HttpContext httpContext)
private static SaveTempDataContext GetTempDataContext(HttpContext httpContext)
{
SaveTempDataContext saveTempDataContext = null;
if (httpContext.Items.TryGetValue(SaveTempDataFilterContextKey, out var value))

View File

@ -146,22 +146,15 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
return;
}
// Because it is not possible to delete while enumerating, a copy of the keys must be taken.
// Use the size of the dictionary as an upper bound to avoid creating more than one copy of the keys.
var removeCount = 0;
var keys = new string[_data.Count];
// In .NET Core 3.0 a Dictionary can have items removed during enumeration
// https://github.com/dotnet/coreclr/pull/18854
foreach (var entry in _data)
{
if (!_initialKeys.Contains(entry.Key) && !_retainedKeys.Contains(entry.Key))
{
keys[removeCount] = entry.Key;
removeCount++;
_data.Remove(entry.Key);
}
}
for (var i = 0; i < removeCount; i++)
{
_data.Remove(keys[i]);
}
_provider.SaveTempData(_context, _data);
}

View File

@ -0,0 +1,34 @@
// 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.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Xunit;
namespace Microsoft.AspNetCore.Mvc.FunctionalTests
{
public class ClientValidationOptionsTests : IClassFixture<MvcTestFixture<RazorPagesWebSite.Startup>>
{
public ClientValidationOptionsTests(MvcTestFixture<RazorPagesWebSite.Startup> fixture) =>
Fixture = fixture;
public MvcTestFixture<RazorPagesWebSite.Startup> Fixture { get; }
[Fact]
public async Task DisablingClientValidation_DisablesItForPagesAndViews()
{
// Arrange
var client = Fixture
.WithWebHostBuilder(whb => whb.UseStartup<RazorPagesWebSite.StartupWithClientValidationDisabled>())
.CreateClient();
// Act
var view = await client.GetStringAsync("Controller/ClientValidationDisabled");
var page = await client.GetStringAsync("ClientvalidationDisabled");
// Assert
Assert.Equal("ClientValidationDisabled", view);
Assert.Equal("ClientValidationDisabled", page);
}
}
}

View File

@ -0,0 +1,13 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Mvc;
namespace RazorPagesWebSite
{
public class ClientValidationDisabledController : Controller
{
[HttpGet("/Controller/ClientValidationDisabled")]
public IActionResult ValidationDisabled() => View();
}
}

View File

@ -0,0 +1,2 @@
@page
@(ViewContext.ClientValidationEnabled ? "ClientValidationEnabled" : "ClientValidationDisabled")

View File

@ -0,0 +1,41 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
namespace RazorPagesWebSite
{
public class StartupWithClientValidationDisabled
{
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options => options.LoginPath = "/Login");
services.AddRazorPages(options =>
{
options.Conventions.AuthorizeFolder("/Admin");
})
.SetCompatibilityVersion(CompatibilityVersion.Latest);
services.Configure<MvcViewOptions>(o => o.HtmlHelperOptions.ClientValidationEnabled = false);
}
public void Configure(IApplicationBuilder app)
{
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapRazorPages();
});
}
}
}

View File

@ -0,0 +1 @@
@(ViewContext.ClientValidationEnabled ? "ClientValidationEnabled" : "ClientValidationDisabled")

View File

@ -50,7 +50,5 @@ body {
bottom: 0;
width: 100%;
white-space: nowrap;
/* Set the fixed height of the footer here */
height: 60px;
line-height: 60px; /* Vertically center the text there */
}

View File

@ -50,7 +50,5 @@ body {
bottom: 0;
width: 100%;
white-space: nowrap;
/* Set the fixed height of the footer here */
height: 60px;
line-height: 60px; /* Vertically center the text there */
}

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