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

View File

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

View File

@ -14,11 +14,4 @@ jobs:
agentOs: Windows agentOs: Windows
jobName: SignalRDailyTests jobName: SignalRDailyTests
jobDisplayName: "SignalR Daily Tests" 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. # 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/ # See https://help.github.com/articles/about-code-owners/
/.azure/ @dougbu /.azure/ @aspnet/build
/.config/ @dougbu /.config/ @aspnet/build
/build/ @dougbu /build/ @aspnet/build
/eng/ @dougbu /eng/ @aspnet/build
/src/Components/ @SteveSandersonMS /src/Components/ @SteveSandersonMS
/src/DefaultBuilder/ @tratcher @anurse /src/DefaultBuilder/ @tratcher @anurse
/src/Hosting/ @tratcher @anurse /src/Hosting/ @tratcher @anurse
/src/Http/ @tratcher @jkotalik @anurse /src/Http/ @tratcher @jkotalik @anurse
/src/Middleware/ @tratcher @anurse /src/Middleware/ @tratcher @anurse
/src/ProjectTemplates/ @ryanbrandenburg /src/ProjectTemplates/ @ryanbrandenburg
/src/Security/ @tratcher @anurse /src/Security/ @tratcher @anurse
/src/Servers/ @tratcher @jkotalik @anurse /src/Servers/ @tratcher @jkotalik @anurse
/src/Middleware/Rewrite @jkotalik @anurse /src/Middleware/Rewrite @jkotalik @anurse
/src/Middleware/HttpsPolicy @jkotalik @anurse /src/Middleware/HttpsPolicy @jkotalik @anurse
/src/SignalR/ @mikaelm12 @BrennanConroy @halter73 @anurse /src/SignalR/ @mikaelm12 @BrennanConroy @halter73 @anurse

View File

@ -98,6 +98,35 @@
</ItemGroup> </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\Workarounds.targets" />
<Import Project="eng\targets\ResolveIisReferences.targets" Condition=" '$(MSBuildProjectExtension)' != '.vcxproj' " /> <Import Project="eng\targets\ResolveIisReferences.targets" Condition=" '$(MSBuildProjectExtension)' != '.vcxproj' " />
<Import Project="eng\targets\Cpp.Common.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\Tools\dotnet-watch\test\TestProjects\**\*.csproj;
$(RepositoryRoot)src\Razor\Razor.Design\test\testassets\**\*.*proj; $(RepositoryRoot)src\Razor\Razor.Design\test\testassets\**\*.*proj;
$(RepositoryRoot)src\submodules\**\*.*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\Installers\**\*.*proj;
$(RepositoryRoot)src\SignalR\clients\ts\**\node_modules\**\*.*proj; $(RepositoryRoot)src\SignalR\clients\ts\**\node_modules\**\*.*proj;
$(RepositoryRoot)src\Components\Blazor\Templates\src\content\**\*.*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/aspnetcore-tools/api/v3/index.json;
https://dotnet.myget.org/F/blazor-dev/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/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-tools/api/v3/index.json;
https://dotnet.myget.org/F/roslyn/api/v3/index.json; https://dotnet.myget.org/F/roslyn/api/v3/index.json;
https://vside.myget.org/F/devcore/api/v3/index.json; https://vside.myget.org/F/devcore/api/v3/index.json;

View File

@ -12,7 +12,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Remove="Internal.AspNetCore.Sdk" /> <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="Microsoft.Extensions.DependencyModel" Version="2.1.0" />
<PackageReference Include="Yarn.MSBuild" Version="1.13.0" /> <PackageReference Include="Yarn.MSBuild" Version="1.13.0" />
</ItemGroup> </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 PS> ./eng/scripts/InstallVisualStudio.ps1
``` ```
* Git. <https://git-scm.org> * 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 <https://nodejs.org>
* 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
* Java Development Kit (JDK) v8 with Java Runtime Environment (JRE) v8. See https://www.oracle.com/technetwork/java/javase/downloads/index.html
### macOS/Linux ### 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> * 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) * 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> * 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 <https://nodejs.org>
* NodeJS. LTS version of 10.14.2 or newer recommended <https://nodejs.org> * Java Development Kit 10 or newer. Either:
* Java Development Kit 10 or newer. Either: * OpenJDK <http://jdk.java.net/10/>
* OpenJDK <http://jdk.java.net/10/> * Oracle's JDK <https://www.oracle.com/technetwork/java/javase/downloads/index.html>
* Oracle's JDK <https://www.oracle.com/technetwork/java/javase/downloads/index.html>
## Clone the source code ## 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> <packageSources>
<clear /> <clear />
<add key="dotnet-core" value="https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json" /> <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" /> <add key="NuGet.org" value="https://api.nuget.org/v3/index.json" />
</packageSources> </packageSources>
</configuration> </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. 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/). 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. * Name the .csproj file to match the assembly name.
* Run `build.cmd /t:GenerateProjectList` when adding new projects * Run `build.cmd /t:GenerateProjectList` when adding new projects
* Use [eng/tools/BaseLineGenerator/](/eng/tools/BaselineGenerator/README.md) if you need to update baselines. * 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 ## 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` 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. 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> <Project>
<PropertyGroup> <PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects> <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
<AspNetCoreBaselineVersion>2.2.3</AspNetCoreBaselineVersion> <AspNetCoreBaselineVersion>2.2.4</AspNetCoreBaselineVersion>
</PropertyGroup> </PropertyGroup>
<!-- Package: dotnet-dev-certs--> <!-- Package: dotnet-dev-certs-->
<PropertyGroup Condition=" '$(PackageId)' == 'dotnet-dev-certs' "> <PropertyGroup Condition=" '$(PackageId)' == 'dotnet-dev-certs' ">
@ -81,7 +81,7 @@
</PropertyGroup> </PropertyGroup>
<!-- Package: Microsoft.AspNetCore.AspNetCoreModuleV2--> <!-- Package: Microsoft.AspNetCore.AspNetCoreModuleV2-->
<PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.AspNetCoreModuleV2' "> <PropertyGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.AspNetCoreModuleV2' ">
<BaselinePackageVersion>2.2.2</BaselinePackageVersion> <BaselinePackageVersion>2.2.4</BaselinePackageVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.AspNetCoreModuleV2' AND '$(TargetFramework)' == 'netcoreapp2.2' " /> <ItemGroup Condition=" '$(PackageId)' == 'Microsoft.AspNetCore.AspNetCoreModuleV2' AND '$(TargetFramework)' == 'netcoreapp2.2' " />
<!-- Package: Microsoft.AspNetCore.Authentication.Abstractions--> <!-- 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. 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-dev-certs" Version="2.2.0" />
<Package Id="dotnet-sql-cache" Version="2.2.0" /> <Package Id="dotnet-sql-cache" Version="2.2.0" />
<Package Id="dotnet-user-secrets" 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.ApiAuthorization.IdentityServer" Version="2.2.0-preview-35687" />
<Package Id="Microsoft.AspNetCore.ApplicationInsights.HostingStartup" Version="2.2.0" /> <Package Id="Microsoft.AspNetCore.ApplicationInsights.HostingStartup" Version="2.2.0" />
<Package Id="Microsoft.AspNetCore.AspNetCoreModule" Version="2.2.1" /> <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.Abstractions" Version="2.2.0" />
<Package Id="Microsoft.AspNetCore.Authentication.AzureAD.UI" 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" /> <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' "> <PropertyGroup Condition=" '$(VersionPrefix)' == '2.2.4' ">
<PackagesInPatch> <PackagesInPatch>
@aspnet/signalr; @aspnet/signalr;
Microsoft.AspNetCore.AspNetCoreModuleV2;
</PackagesInPatch> </PackagesInPatch>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(VersionPrefix)' == '2.2.5' ">
<PackagesInPatch>
Microsoft.AspNetCore.AspNetCoreModule;
Microsoft.AspNetCore.AspNetCoreModuleV2;
java:signalr;
</PackagesInPatch>
</PropertyGroup>
</Project> </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.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.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.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.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.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" /> <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.Http.Features" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Connections.Abstractions" /> <AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Connections.Abstractions" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Http.Connections.Common" /> <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.Protocols.NewtonsoftJson" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.SignalR.Common" /> <AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.SignalR.Common" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Components.Browser" /> <AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Components.Browser" />

View File

@ -9,384 +9,384 @@
--> -->
<Dependencies> <Dependencies>
<ProductDependencies> <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> <Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>5ec5b0c8894e758ef2a41fd534746500bbcf00ad</Sha> <Sha>d4ef2a1d4a68428e29a86cafc24837a45aef7e0d</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>5ec5b0c8894e758ef2a41fd534746500bbcf00ad</Sha> <Sha>d4ef2a1d4a68428e29a86cafc24837a45aef7e0d</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>5ec5b0c8894e758ef2a41fd534746500bbcf00ad</Sha> <Sha>d4ef2a1d4a68428e29a86cafc24837a45aef7e0d</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>5ec5b0c8894e758ef2a41fd534746500bbcf00ad</Sha> <Sha>d4ef2a1d4a68428e29a86cafc24837a45aef7e0d</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha> <Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha> <Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha> <Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha> <Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha> <Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha> <Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>a4d2bafcdfaf0ed6b451056b7d9d75f53ee8c4df</Sha> <Sha>b191c93d850ff31445534eb5cd6184599f40bbb4</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>ee54d4cbd2b305eadf6f341bdc9d4abccdb50559</Sha> <Sha>b159f4bf9614203a0c60a20f5469d5226f3f12e7</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>ee54d4cbd2b305eadf6f341bdc9d4abccdb50559</Sha> <Sha>b159f4bf9614203a0c60a20f5469d5226f3f12e7</Sha>
</Dependency> </Dependency>
</ProductDependencies> </ProductDependencies>
<ToolsetDependencies> <ToolsetDependencies>
<!-- Listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 --> <!-- 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> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>dc522ef97fac72e64cd74825b7ef497f82af4624</Sha> <Sha>fe5c12ad8315e043e62285117a56bba1784756d1</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </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> <Uri>https://github.com/dotnet/arcade</Uri>
<Sha>b1f9e12fe3ee71c48ea60b15968745850ac0a4a7</Sha> <Sha>517bf671ea342965d007aa48f5bfd4926e58d582</Sha>
</Dependency> </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> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>fd0366daae4c9d47eba72ea6034002cbd7492018</Sha> <Sha>0b1aa473a7a722cd3f0aab5166fbe9e5203f0582</Sha>
</Dependency> </Dependency>
</ToolsetDependencies> </ToolsetDependencies>
</Dependencies> </Dependencies>

View File

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

View File

@ -25,7 +25,6 @@
.\InstallVisualStudio.ps1 .\InstallVisualStudio.ps1
#> #>
[CmdletBinding(DefaultParameterSetName = 'Default')]
param( param(
[ValidateSet('BuildTools','Community', 'Professional', 'Enterprise')] [ValidateSet('BuildTools','Community', 'Professional', 'Enterprise')]
[string]$Edition = 'Enterprise', [string]$Edition = 'Enterprise',
@ -35,8 +34,8 @@ param(
) )
if ($Passive -and $Quiet) { if ($Passive -and $Quiet) {
Write-Host "The -Passive and -Quiet options cannot be used together." -f Red Write-Host -ForegroundColor Red "Error: The -Passive and -Quiet options cannot be used together."
Write-Host "Run ``Get-Help $PSCommandPath`` for more details." -f Red Write-Host -ForegroundColor Red "Run ``Get-Help $PSCommandPath`` for more details."
exit 1 exit 1
} }
@ -98,15 +97,61 @@ if ($Quiet) {
$arguments += '--quiet', '--wait' $arguments += '--quiet', '--wait'
} }
Write-Host "" Write-Host
Write-Host "Installing Visual Studio 2019 $Edition" -f Magenta Write-Host "Installing Visual Studio 2019 $Edition" -f Magenta
Write-Host "" Write-Host
Write-Host "Running '$bootstrapper $arguments'" Write-Host "Running '$bootstrapper $arguments'"
$process = Start-Process -FilePath "$bootstrapper" -ArgumentList $arguments ` foreach ($i in 0, 1, 2) {
-PassThru -RedirectStandardError "$intermedateDir\errors.txt" -Verbose -Wait if ($i -ne 0) {
if ($process.ExitCode -ne 0) { Write-Host "Retrying..."
Get-Content "$intermedateDir\errors.txt" | Write-Error }
$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 Remove-Item "$intermedateDir\errors.txt" -errorAction SilentlyContinue

View File

@ -18,12 +18,7 @@
<Target Name="Restore"> <Target Name="Restore">
<Message Importance="High" Text="Running yarn install on $(MSBuildProjectFullPath)" /> <Message Importance="High" Text="Running yarn install on $(MSBuildProjectFullPath)" />
<Yarn Command="install $(InstallArgs)" ContinueOnError="true"> <Yarn Command="install $(InstallArgs)" />
<Output TaskParameter="ExitCode" PropertyName="_YarnExitCode"/>
</Yarn>
<Yarn Command="install $(InstallArgs)" Condition="'$(_YarnExitCode)' != '0'">
<Output TaskParameter="ExitCode" PropertyName="_YarnExitCode"/>
</Yarn>
</Target> </Target>
<Target Name="PrepareForBuild"> <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. --> <!-- Identify if any references were present in the last release of this package, but have been removed. -->
<UnusedBaselinePackageReference Include="@(BaselinePackageReference)" Exclude="@(Reference);@(_ProjectReferenceByAssemblyName);@(PackageReference)" /> <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, MSBuild does not provide a way to join on matching identities in a Condition,
@ -201,8 +203,13 @@
<_ExplicitPackageReference Remove="@(_ExplicitPackageReference)" /> <_ExplicitPackageReference Remove="@(_ExplicitPackageReference)" />
</ItemGroup> </ItemGroup>
<Warning Condition="@(UnusedBaselinePackageReference->Count()) != 0" <Warning Condition="'$(IsReferenceAssemblyProject)' != 'true' AND '$(IsServicingBuild)' != 'true' AND '%(UnusedBaselinePackageReference.Identity)' != ''"
Text="Package references changed since the last release. This could be a breaking change. References removed:%0A - @(UnusedBaselinePackageReference, '%0A -')" /> 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'" <Error Condition="'$(TargetFrameworkIdentifier)' != '.NETFramework' AND '%(Reference.Identity)' != '' AND ! Exists('%(Reference.Identity)') AND '$(DisablePackageReferenceRestrictions)' != 'true'"
Code="MSB3245" Code="MSB3245"

View File

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

View File

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

View File

@ -2,8 +2,6 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
<!-- https://github.com/aspnet/AspNetCore/issues/6549 -->
<BuildHelixPayload>false</BuildHelixPayload>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -19,5 +17,25 @@
<Reference Include="Microsoft.Extensions.Logging.Testing" /> <Reference Include="Microsoft.Extensions.Logging.Testing" />
</ItemGroup> </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)' != ''" /> <Import Project="$(MvcTestingTargets)" Condition="'$(MvcTestingTargets)' != ''" />
</Project> </Project>

View File

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

View File

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

View File

@ -268,7 +268,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
// _builder.ConfigureContainer<T>(ConfigureContainer); // _builder.ConfigureContainer<T>(ConfigureContainer);
typeof(IHostBuilder).GetMethods().First(m => m.Name == nameof(IHostBuilder.ConfigureContainer)) typeof(IHostBuilder).GetMethods().First(m => m.Name == nameof(IHostBuilder.ConfigureContainer))
.MakeGenericMethod(containerType) .MakeGenericMethod(containerType)
.Invoke(_builder, new object[] { configureCallback }); .InvokeWithoutWrappingExceptions(_builder, new object[] { configureCallback });
} }
// Resolve Configure after calling ConfigureServices and ConfigureContainer // 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Globalization;
using System.Reflection; using System.Reflection;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection; 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
@ -46,7 +46,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
var arguments = new object[1] { container }; 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; 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)) if (_diagnosticListener.IsEnabled(ActivityStartKey))
{ {
_diagnosticListener.StartActivity(activity, new { HttpContext = httpContext }); _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(); 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>>(); var logger = host.Services.GetRequiredService<ILogger<WebHost>>();
// Warn about duplicate HostingStartupAssemblies // Warn about duplicate HostingStartupAssemblies
@ -264,12 +268,13 @@ namespace Microsoft.AspNetCore.Hosting
var builder = new ConfigurationBuilder() var builder = new ConfigurationBuilder()
.SetBasePath(_hostingEnvironment.ContentRootPath) .SetBasePath(_hostingEnvironment.ContentRootPath)
.AddConfiguration(_config); .AddConfiguration(_config, shouldDisposeConfiguration: true);
_configureAppConfigurationBuilder?.Invoke(_context, builder); _configureAppConfigurationBuilder?.Invoke(_context, builder);
var configuration = builder.Build(); 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; _context.Configuration = configuration;
var listener = new DiagnosticListener("Microsoft.AspNetCore"); 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;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.ObjectPool;
using Microsoft.Extensions.Options;
using Moq; using Moq;
using Xunit; using Xunit;
@ -304,6 +302,34 @@ namespace Microsoft.AspNetCore.Hosting.Tests
Assert.Contains(Activity.Current.Baggage, pair => pair.Key == "Key2" && pair.Value == "value2"); 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) 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); var app = new ApplicationBuilder(services);
app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection); app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection);
var ex = Assert.Throws<TargetInvocationException>(() => startup.ConfigureDelegate(app)); Assert.Throws<InvalidOperationException>(() => startup.ConfigureDelegate(app));
Assert.IsAssignableFrom<InvalidOperationException>(ex.InnerException); }
[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] [Fact]

View File

@ -975,6 +975,54 @@ namespace Microsoft.AspNetCore.Hosting
Assert.Contains("ConfigureServices", ex.Message); 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 class BadConfigureServicesStartup
{ {
public void ConfigureServices(IServiceCollection services, int gunk) { } 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) public static StringValues GetHeaderSplit(IHeaderDictionary headers, string key)
{ {
var values = GetHeaderUnmodified(headers, 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)) foreach (var segment in new HeaderSegmentCollection(values))
{ {
if (!StringSegment.IsNullOrEmpty(segment.Data)) if (!StringSegment.IsNullOrEmpty(segment.Data))
@ -31,10 +29,12 @@ namespace Microsoft.AspNetCore.Http.Internal
var value = DeQuote(segment.Data.Value); var value = DeQuote(segment.Data.Value);
if (!string.IsNullOrEmpty(value)) if (!string.IsNullOrEmpty(value))
{ {
yield return value; result = StringValues.Concat(in result, value);
} }
} }
} }
return result;
} }
public static StringValues GetHeaderUnmodified(IHeaderDictionary headers, string key) public static StringValues GetHeaderUnmodified(IHeaderDictionary headers, string key)

View File

@ -406,7 +406,7 @@ namespace Microsoft.AspNetCore.Http.Internal
{ {
public ItemsDictionary() { } public ItemsDictionary() { }
public ItemsDictionary(System.Collections.Generic.IDictionary<object, object> items) { } 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; } } 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; } } 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 { } } 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> public class ItemsDictionary : IDictionary<object, object>
{ {
private IDictionary<object, object> _items;
public ItemsDictionary() public ItemsDictionary()
: this(new Dictionary<object, object>()) {}
{
}
public ItemsDictionary(IDictionary<object, object> items) 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 // Replace the indexer with one that returns null for missing values
object IDictionary<object, object>.this[object key] object IDictionary<object, object>.this[object key]
{ {
get get
{ {
object value; if (_items != null && _items.TryGetValue(key, out var value))
if (Items.TryGetValue(key, out value))
{ {
return value; return value;
} }
return null; return null;
} }
set { Items[key] = value; } set
{
EnsureDictionary();
_items[key] = value;
}
} }
void IDictionary<object, object>.Add(object key, object 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) bool IDictionary<object, object>.ContainsKey(object key)
{ => _items != null && _items.ContainsKey(key);
return Items.ContainsKey(key);
}
ICollection<object> IDictionary<object, object>.Keys 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) bool IDictionary<object, object>.Remove(object key)
{ => _items != null && _items.Remove(key);
return Items.Remove(key);
}
bool IDictionary<object, object>.TryGetValue(object key, out object value) 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 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) void ICollection<KeyValuePair<object, object>>.Add(KeyValuePair<object, object> item)
{ {
Items.Add(item); EnsureDictionary();
_items.Add(item);
} }
void ICollection<KeyValuePair<object, object>>.Clear() void ICollection<KeyValuePair<object, object>>.Clear() => _items?.Clear();
{
Items.Clear();
}
bool ICollection<KeyValuePair<object, object>>.Contains(KeyValuePair<object, object> item) bool ICollection<KeyValuePair<object, object>>.Contains(KeyValuePair<object, object> item)
{ => _items != null && _items.Contains(item);
return Items.Contains(item);
}
void ICollection<KeyValuePair<object, object>>.CopyTo(KeyValuePair<object, object>[] array, int arrayIndex) 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 int ICollection<KeyValuePair<object, object>>.Count => _items?.Count ?? 0;
{
get { return Items.Count; }
}
bool ICollection<KeyValuePair<object, object>>.IsReadOnly bool ICollection<KeyValuePair<object, object>>.IsReadOnly => _items?.IsReadOnly ?? false;
{
get { return Items.IsReadOnly; }
}
bool ICollection<KeyValuePair<object, object>>.Remove(KeyValuePair<object, object> item) bool ICollection<KeyValuePair<object, object>>.Remove(KeyValuePair<object, object> item)
{ {
object value; if (_items == null)
if (Items.TryGetValue(item.Key, out value) && Equals(item.Value, value))
{ {
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; 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 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 partial class DfaGraphWriter
{ {
public DfaGraphWriter(System.IServiceProvider services) { } public DfaGraphWriter(System.IServiceProvider services) { }
public void Write(Microsoft.AspNetCore.Routing.EndpointDataSource dataSource, System.IO.TextWriter writer) { } public void Write(Microsoft.AspNetCore.Routing.EndpointDataSource dataSource, System.IO.TextWriter writer) { }
} }
[System.Diagnostics.DebuggerDisplayAttribute("{DebuggerDisplayString,nq}")] [System.ObsoleteAttribute("This type will be marked as internal in a future release.")]
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() { }
}
}
public enum SegmentState public enum SegmentState
{ {
Beginning = 0, Beginning = 0,
Inside = 1, 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.Diagnostics.DebuggerDisplayAttribute("{DebuggerToString(),nq}")]
[System.ObsoleteAttribute("This type will be marked as internal in a future release.")]
public partial class UriBuildingContext public partial class UriBuildingContext
{ {
public UriBuildingContext(System.Text.Encodings.Web.UrlEncoder urlEncoder) { } public UriBuildingContext(System.Text.Encodings.Web.UrlEncoder urlEncoder) { }
@ -808,13 +756,21 @@ namespace Microsoft.AspNetCore.Routing.Template
} }
public partial class TemplateBinder 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) { } 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 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 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 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 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 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 partial class TemplateMatcher
{ {
public TemplateMatcher(Microsoft.AspNetCore.Routing.Template.RouteTemplate template, Microsoft.AspNetCore.Routing.RouteValueDictionary defaults) { } 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 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 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.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; } } 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 partial class TreeRouter : Microsoft.AspNetCore.Routing.IRouter
{ {
public static readonly string RouteGroupKey; 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 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 int Version { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public Microsoft.AspNetCore.Routing.VirtualPathData GetVirtualPath(Microsoft.AspNetCore.Routing.VirtualPathContext context) { 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. // The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information. // See the LICENSE file in the project root for more information.
@ -10,7 +10,7 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
namespace Microsoft.AspNetCore.Routing.Internal namespace Microsoft.AspNetCore.Routing
{ {
/// <summary> /// <summary>
/// Helper type for avoiding allocations while building arrays. /// Helper type for avoiding allocations while building arrays.
@ -166,4 +166,4 @@ namespace Microsoft.AspNetCore.Routing.Internal
_array = next; _array = next;
} }
} }
} }

View File

@ -22,7 +22,7 @@ namespace Microsoft.AspNetCore.Routing
internal sealed class DefaultLinkGenerator : LinkGenerator, IDisposable internal sealed class DefaultLinkGenerator : LinkGenerator, IDisposable
{ {
private readonly ParameterPolicyFactory _parameterPolicyFactory; private readonly ParameterPolicyFactory _parameterPolicyFactory;
private readonly ObjectPool<UriBuildingContext> _uriBuildingContextPool; private readonly TemplateBinderFactory _binderFactory;
private readonly ILogger<DefaultLinkGenerator> _logger; private readonly ILogger<DefaultLinkGenerator> _logger;
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
@ -38,14 +38,14 @@ namespace Microsoft.AspNetCore.Routing
public DefaultLinkGenerator( public DefaultLinkGenerator(
ParameterPolicyFactory parameterPolicyFactory, ParameterPolicyFactory parameterPolicyFactory,
TemplateBinderFactory binderFactory,
EndpointDataSource dataSource, EndpointDataSource dataSource,
ObjectPool<UriBuildingContext> uriBuildingContextPool,
IOptions<RouteOptions> routeOptions, IOptions<RouteOptions> routeOptions,
ILogger<DefaultLinkGenerator> logger, ILogger<DefaultLinkGenerator> logger,
IServiceProvider serviceProvider) IServiceProvider serviceProvider)
{ {
_parameterPolicyFactory = parameterPolicyFactory; _parameterPolicyFactory = parameterPolicyFactory;
_uriBuildingContextPool = uriBuildingContextPool; _binderFactory = binderFactory;
_logger = logger; _logger = logger;
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
@ -282,40 +282,7 @@ namespace Microsoft.AspNetCore.Routing
private TemplateBinder CreateTemplateBinder(RouteEndpoint endpoint) private TemplateBinder CreateTemplateBinder(RouteEndpoint endpoint)
{ {
// Now create the constraints and parameter transformers from the pattern return _binderFactory.Create(endpoint.RoutePattern);
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);
} }
// Internal for testing // Internal for testing

View File

@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Routing.Internal; using Microsoft.AspNetCore.Routing.Internal;
using Microsoft.AspNetCore.Routing.Matching; using Microsoft.AspNetCore.Routing.Matching;
using Microsoft.AspNetCore.Routing.Patterns; using Microsoft.AspNetCore.Routing.Patterns;
using Microsoft.AspNetCore.Routing.Template;
using Microsoft.AspNetCore.Routing.Tree; using Microsoft.AspNetCore.Routing.Tree;
using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -34,6 +35,7 @@ namespace Microsoft.Extensions.DependencyInjection
services.TryAddTransient<IInlineConstraintResolver, DefaultInlineConstraintResolver>(); services.TryAddTransient<IInlineConstraintResolver, DefaultInlineConstraintResolver>();
services.TryAddTransient<ObjectPoolProvider, DefaultObjectPoolProvider>(); services.TryAddTransient<ObjectPoolProvider, DefaultObjectPoolProvider>();
#pragma warning disable CS0618 // Type or member is obsolete
services.TryAddSingleton<ObjectPool<UriBuildingContext>>(s => services.TryAddSingleton<ObjectPool<UriBuildingContext>>(s =>
{ {
var provider = s.GetRequiredService<ObjectPoolProvider>(); var provider = s.GetRequiredService<ObjectPoolProvider>();
@ -49,6 +51,7 @@ namespace Microsoft.Extensions.DependencyInjection
var constraintResolver = s.GetRequiredService<IInlineConstraintResolver>(); var constraintResolver = s.GetRequiredService<IInlineConstraintResolver>();
return new TreeRouteBuilder(loggerFactory, objectPool, constraintResolver); return new TreeRouteBuilder(loggerFactory, objectPool, constraintResolver);
})); }));
#pragma warning restore CS0618 // Type or member is obsolete
services.TryAddSingleton(typeof(RoutingMarkerService)); services.TryAddSingleton(typeof(RoutingMarkerService));
@ -88,6 +91,7 @@ namespace Microsoft.Extensions.DependencyInjection
// //
// Misc infrastructure // Misc infrastructure
// //
services.TryAddSingleton<TemplateBinderFactory, DefaultTemplateBinderFactory>();
services.TryAddSingleton<RoutePatternTransformer, DefaultRoutePatternTransformer>(); services.TryAddSingleton<RoutePatternTransformer, DefaultRoutePatternTransformer>();
return services; 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. // 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. // 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 namespace Microsoft.AspNetCore.Routing.Internal
{ {
// Segments are treated as all-or-none. We should never output a partial segment. // 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 "/". // 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 // Otherwise we could end up with the partial segment "v1" instead of the entire
// segment "v1-v2.xml". // segment "v1-v2.xml".
[Obsolete("This type will be marked as internal in a future release.")]
public enum SegmentState public enum SegmentState
{ {
Beginning, Beginning,

View File

@ -1,6 +1,7 @@
// 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. // 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.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
@ -10,6 +11,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Routing.Internal namespace Microsoft.AspNetCore.Routing.Internal
{ {
[Obsolete("This type will be marked as internal in a future release.")]
[DebuggerDisplay("{DebuggerToString(),nq}")] [DebuggerDisplay("{DebuggerToString(),nq}")]
public class UriBuildingContext public class UriBuildingContext
{ {
@ -321,5 +323,18 @@ namespace Microsoft.AspNetCore.Routing.Internal
{ {
return string.Format("{{Accepted: '{0}' Buffered: '{1}'}}", _path, string.Join("", _buffer)); 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
@ -9,7 +9,7 @@ using System.Reflection;
using System.Text; using System.Text;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Routing.Internal namespace Microsoft.AspNetCore.Routing
{ {
internal static class ParameterPolicyActivator internal static class ParameterPolicyActivator
{ {

View File

@ -8,9 +8,9 @@ using System.Diagnostics;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Primitives; 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 readonly string _path;
private int _count; 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) private void EnsureBinder(HttpContext context)
{ {
if (_binder == null) if (_binder == null)
{ {
var pool = context.RequestServices.GetRequiredService<ObjectPool<UriBuildingContext>>(); var binderFactory = context.RequestServices.GetRequiredService<TemplateBinderFactory>();
_binder = new TemplateBinder(UrlEncoder.Default, pool, ParsedTemplate, Defaults); _binder = binderFactory.Create(ParsedTemplate, Defaults);
} }
} }
#pragma warning restore CS0618 // Type or member is obsolete
private void EnsureLoggers(HttpContext context) private void EnsureLoggers(HttpContext context)
{ {

View File

@ -3,7 +3,7 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Routing.Internal namespace Microsoft.AspNetCore.Routing
{ {
/// <summary> /// <summary>
/// A marker class used to determine if all the routing services were added /// 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 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 public class TemplateBinder
{ {
private readonly UrlEncoder _urlEncoder; private readonly UrlEncoder _urlEncoder;
#pragma warning disable CS0618 // Type or member is obsolete
private readonly ObjectPool<UriBuildingContext> _pool; private readonly ObjectPool<UriBuildingContext> _pool;
#pragma warning restore CS0618 // Type or member is obsolete
private readonly (string parameterName, IRouteConstraint constraint)[] _constraints; private readonly (string parameterName, IRouteConstraint constraint)[] _constraints;
private readonly RouteValueDictionary _defaults; private readonly RouteValueDictionary _defaults;
@ -40,6 +42,9 @@ namespace Microsoft.AspNetCore.Routing.Template
/// <param name="pool">The <see cref="ObjectPool{T}"/>.</param> /// <param name="pool">The <see cref="ObjectPool{T}"/>.</param>
/// <param name="template">The <see cref="RouteTemplate"/> to bind values to.</param> /// <param name="template">The <see cref="RouteTemplate"/> to bind values to.</param>
/// <param name="defaults">The default values for <paramref name="template"/>.</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( public TemplateBinder(
UrlEncoder urlEncoder, UrlEncoder urlEncoder,
ObjectPool<UriBuildingContext> pool, ObjectPool<UriBuildingContext> pool,
@ -60,6 +65,9 @@ namespace Microsoft.AspNetCore.Routing.Template
/// <param name="parameterPolicies"> /// <param name="parameterPolicies">
/// A list of (<see cref="string"/>, <see cref="IParameterPolicy"/>) pairs to evalute when producing a URI. /// A list of (<see cref="string"/>, <see cref="IParameterPolicy"/>) pairs to evalute when producing a URI.
/// </param> /// </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( public TemplateBinder(
UrlEncoder urlEncoder, UrlEncoder urlEncoder,
ObjectPool<UriBuildingContext> pool, ObjectPool<UriBuildingContext> pool,
@ -110,6 +118,58 @@ namespace Microsoft.AspNetCore.Routing.Template
_slots = AssignSlots(_pattern, _filters); _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 // 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) 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) private bool TryBindValuesCore(UriBuildingContext context, RouteValueDictionary acceptedValues)
{ {
// If we have any output parameter transformers, allow them a chance to influence the parameter values // 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; return false;
} }
#pragma warning restore CS0618 // Type or member is obsolete
/// <summary> /// <summary>
/// Compares two objects for equality as parts of a case-insensitive path. /// 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 System.Text;
using Microsoft.AspNetCore.Routing.DecisionTree; using Microsoft.AspNetCore.Routing.DecisionTree;
using Microsoft.AspNetCore.Routing.Patterns; 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. // A decision tree that matches link generation entries based on route data.
[DebuggerDisplay("{DebuggerDisplayString,nq}")] [DebuggerDisplay("{DebuggerDisplayString,nq}")]
public class LinkGenerationDecisionTree internal class LinkGenerationDecisionTree
{ {
// Fallback value for cases where the ambient values weren't provided. // Fallback value for cases where the ambient values weren't provided.
// //

View File

@ -1,11 +1,9 @@
// 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. // 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.Tree
namespace Microsoft.AspNetCore.Routing.Internal
{ {
public readonly struct OutboundMatchResult internal readonly struct OutboundMatchResult
{ {
public OutboundMatchResult(OutboundMatch match, bool isFallbackMatch) public OutboundMatchResult(OutboundMatch match, bool isFallbackMatch)
{ {

View File

@ -3,7 +3,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Text.Encodings.Web; using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Routing.Internal; using Microsoft.AspNetCore.Routing.Internal;
@ -21,7 +20,9 @@ namespace Microsoft.AspNetCore.Routing.Tree
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly ILogger _constraintLogger; private readonly ILogger _constraintLogger;
private readonly UrlEncoder _urlEncoder; private readonly UrlEncoder _urlEncoder;
#pragma warning disable CS0618 // Type or member is obsolete
private readonly ObjectPool<UriBuildingContext> _objectPool; private readonly ObjectPool<UriBuildingContext> _objectPool;
#pragma warning restore CS0618 // Type or member is obsolete
private readonly IInlineConstraintResolver _constraintResolver; private readonly IInlineConstraintResolver _constraintResolver;
/// <summary> /// <summary>
@ -30,9 +31,12 @@ namespace Microsoft.AspNetCore.Routing.Tree
/// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param> /// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param>
/// <param name="objectPool">The <see cref="ObjectPool{UrlBuildingContext}"/>.</param> /// <param name="objectPool">The <see cref="ObjectPool{UrlBuildingContext}"/>.</param>
/// <param name="constraintResolver">The <see cref="IInlineConstraintResolver"/>.</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( public TreeRouteBuilder(
ILoggerFactory loggerFactory, ILoggerFactory loggerFactory,
#pragma warning disable CS0618 // Type or member is obsolete
ObjectPool<UriBuildingContext> objectPool, ObjectPool<UriBuildingContext> objectPool,
#pragma warning restore CS0618 // Type or member is obsolete
IInlineConstraintResolver constraintResolver) IInlineConstraintResolver constraintResolver)
{ {
if (loggerFactory == null) if (loggerFactory == null)
@ -240,6 +244,7 @@ namespace Microsoft.AspNetCore.Routing.Tree
tree.AddEntry(entry); tree.AddEntry(entry);
} }
#pragma warning disable CS0618 // Type or member is obsolete
return new TreeRouter( return new TreeRouter(
trees.Values.OrderBy(tree => tree.Order).ToArray(), trees.Values.OrderBy(tree => tree.Order).ToArray(),
OutboundEntries, OutboundEntries,
@ -248,6 +253,7 @@ namespace Microsoft.AspNetCore.Routing.Tree
_logger, _logger,
_constraintLogger, _constraintLogger,
version); version);
#pragma warning restore CS0618 // Type or member is obsolete
} }
/// <summary> /// <summary>

View File

@ -40,11 +40,14 @@ namespace Microsoft.AspNetCore.Routing.Tree
/// <param name="constraintLogger">The <see cref="ILogger"/> instance used /// <param name="constraintLogger">The <see cref="ILogger"/> instance used
/// in <see cref="RouteConstraintMatcher"/>.</param> /// in <see cref="RouteConstraintMatcher"/>.</param>
/// <param name="version">The version of this route.</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( public TreeRouter(
UrlMatchingTree[] trees, UrlMatchingTree[] trees,
IEnumerable<OutboundRouteEntry> linkGenerationEntries, IEnumerable<OutboundRouteEntry> linkGenerationEntries,
UrlEncoder urlEncoder, UrlEncoder urlEncoder,
#pragma warning disable CS0618 // Type or member is obsolete
ObjectPool<UriBuildingContext> objectPool, ObjectPool<UriBuildingContext> objectPool,
#pragma warning restore CS0618 // Type or member is obsolete
ILogger routeLogger, ILogger routeLogger,
ILogger constraintLogger, ILogger constraintLogger,
int version) 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Text.Encodings.Web; using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Routing.Internal;
using Microsoft.Extensions.ObjectPool; 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() public UriBuildingContext Create()
{ {
@ -19,4 +21,5 @@ namespace Microsoft.AspNetCore.Routing.Internal
return true; 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.Extensions.WebEncoders.Testing; using Microsoft.Extensions.WebEncoders.Testing;
@ -6,6 +6,7 @@ using Xunit;
namespace Microsoft.AspNetCore.Routing.Internal namespace Microsoft.AspNetCore.Routing.Internal
{ {
#pragma warning disable CS0618 // Type or member is obsolete
public class UriBuildingContextTest public class UriBuildingContextTest
{ {
[Fact] [Fact]
@ -16,7 +17,7 @@ namespace Microsoft.AspNetCore.Routing.Internal
var value = "a/b b1/c"; var value = "a/b b1/c";
var expected = "/UrlEncode[[a/b b1/c]]"; var expected = "/UrlEncode[[a/b b1/c]]";
var uriBuilldingContext = new UriBuildingContext(urlTestEncoder); var uriBuilldingContext = new UriBuildingContext(urlTestEncoder);
// Act // Act
uriBuilldingContext.EncodeValue(value, 0, value.Length, encodeSlashes: true); uriBuilldingContext.EncodeValue(value, 0, value.Length, encodeSlashes: true);
@ -97,4 +98,5 @@ namespace Microsoft.AspNetCore.Routing.Internal
Assert.Equal(expected, uriBuilldingContext.ToPathString().Value); 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;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Routing.Internal; using Microsoft.AspNetCore.Routing.Internal;
using Microsoft.AspNetCore.Routing.Template;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.ObjectPool;
@ -82,8 +83,8 @@ namespace Microsoft.AspNetCore.Routing
return new DefaultLinkGenerator( return new DefaultLinkGenerator(
new DefaultParameterPolicyFactory(routeOptions, serviceProvider), new DefaultParameterPolicyFactory(routeOptions, serviceProvider),
serviceProvider.GetRequiredService<TemplateBinderFactory>(),
new CompositeEndpointDataSource(routeOptions.Value.EndpointDataSources), new CompositeEndpointDataSource(routeOptions.Value.EndpointDataSources),
new DefaultObjectPool<UriBuildingContext>(new UriBuilderContextPooledObjectPolicy()),
routeOptions, routeOptions,
NullLogger<DefaultLinkGenerator>.Instance, NullLogger<DefaultLinkGenerator>.Instance,
serviceProvider); 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
@ -32,10 +32,12 @@ namespace Microsoft.AspNetCore.Routing.Matching
public override Matcher Build() public override Matcher Build()
{ {
#pragma warning disable CS0618 // Type or member is obsolete
var builder = new TreeRouteBuilder( var builder = new TreeRouteBuilder(
NullLoggerFactory.Instance, NullLoggerFactory.Instance,
new DefaultObjectPool<UriBuildingContext>(new UriBuilderContextPooledObjectPolicy()), new DefaultObjectPool<UriBuildingContext>(new UriBuilderContextPooledObjectPolicy()),
new DefaultInlineConstraintResolver(Options.Create(new RouteOptions()), new TestServiceProvider())); new DefaultInlineConstraintResolver(Options.Create(new RouteOptions()), new TestServiceProvider()));
#pragma warning restore CS0618 // Type or member is obsolete
var selector = new DefaultEndpointSelector(); var selector = new DefaultEndpointSelector();

View File

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

View File

@ -16,6 +16,7 @@ using Xunit;
namespace Microsoft.AspNetCore.Routing.Template.Tests namespace Microsoft.AspNetCore.Routing.Template.Tests
{ {
#pragma warning disable CS0618 // Type or member is obsolete
public class TemplateBinderTests public class TemplateBinderTests
{ {
private readonly IInlineConstraintResolver _inlineConstraintResolver = GetInlineConstraintResolver(); private readonly IInlineConstraintResolver _inlineConstraintResolver = GetInlineConstraintResolver();
@ -1480,4 +1481,5 @@ namespace Microsoft.AspNetCore.Routing.Template.Tests
public Dictionary<string, string> Parameters { get; private set; } 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Text.Encodings.Web; using System.Text.Encodings.Web;
@ -248,10 +248,12 @@ namespace Microsoft.AspNetCore.Routing.Tree
var objectPool = objectPoolProvider.Create(objectPolicy); var objectPool = objectPoolProvider.Create(objectPolicy);
var constraintResolver = GetInlineConstraintResolver(); var constraintResolver = GetInlineConstraintResolver();
#pragma warning disable CS0618 // Type or member is obsolete
var builder = new TreeRouteBuilder( var builder = new TreeRouteBuilder(
NullLoggerFactory.Instance, NullLoggerFactory.Instance,
objectPool, objectPool,
constraintResolver); constraintResolver);
#pragma warning restore CS0618 // Type or member is obsolete
return builder; return builder;
} }

View File

@ -23,8 +23,10 @@ namespace Microsoft.AspNetCore.Routing.Tree
{ {
private static readonly RequestDelegate NullHandler = (c) => Task.CompletedTask; 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( private static ObjectPool<UriBuildingContext> Pool = new DefaultObjectPoolProvider().Create(
new UriBuilderContextPooledObjectPolicy()); new UriBuilderContextPooledObjectPolicy());
#pragma warning restore CS0618 // Type or member is obsolete
[Theory] [Theory]
[InlineData("template/5", "template/{parameter:int}")] [InlineData("template/5", "template/{parameter:int}")]
@ -2073,6 +2075,7 @@ namespace Microsoft.AspNetCore.Routing.Tree
return new DefaultInlineConstraintResolver(optionsMock.Object, new TestServiceProvider()); return new DefaultInlineConstraintResolver(optionsMock.Object, new TestServiceProvider());
} }
#pragma warning disable CS0618 // Type or member is obsolete
private static TreeRouteBuilder CreateBuilder() private static TreeRouteBuilder CreateBuilder()
{ {
var objectPoolProvider = new DefaultObjectPoolProvider(); var objectPoolProvider = new DefaultObjectPoolProvider();
@ -2086,6 +2089,7 @@ namespace Microsoft.AspNetCore.Routing.Tree
constraintResolver); constraintResolver);
return builder; return builder;
} }
#pragma warning restore CS0618 // Type or member is obsolete
private static TreeRouter CreateTreeRouter( private static TreeRouter CreateTreeRouter(
string firstTemplate, 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;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Microsoft.EntityFrameworkCore.Storage.Internal;
namespace IdentitySample.DefaultUI.Data.Migrations namespace IdentitySample.DefaultUI.Data.Migrations
{ {
[DbContext(typeof(ApplicationDbContext))] [DbContext(typeof(ApplicationDbContext))]
[Migration("20180126174859_CreateIdentitySchema")] [Migration("20190411154115_CreateIdentitySchema")]
partial class CreateIdentitySchema partial class CreateIdentitySchema
{ {
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder 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); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("IdentitySample.DefaultUI.Data.ApplicationUser", b => modelBuilder.Entity("IdentitySample.DefaultUI.Data.ApplicationUser", b =>
{ {
b.Property<string>("Id") b.Property<string>("Id");
.ValueGeneratedOnAdd();
b.Property<int>("AccessFailedCount"); b.Property<int>("AccessFailedCount");
@ -79,8 +77,7 @@ namespace IdentitySample.DefaultUI.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{ {
b.Property<string>("Id") b.Property<string>("Id");
.ValueGeneratedOnAdd();
b.Property<string>("ConcurrencyStamp") b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken(); .IsConcurrencyToken();
@ -104,7 +101,8 @@ namespace IdentitySample.DefaultUI.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("ClaimType"); b.Property<string>("ClaimType");
@ -123,7 +121,8 @@ namespace IdentitySample.DefaultUI.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("ClaimType"); b.Property<string>("ClaimType");
@ -191,47 +190,53 @@ namespace IdentitySample.DefaultUI.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{ {
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany() .WithMany()
.HasForeignKey("RoleId") .HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{ {
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser") b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{ {
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser") b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{ {
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany() .WithMany()
.HasForeignKey("RoleId") .HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser") b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{ {
b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser") b.HasOne("IdentitySample.DefaultUI.Data.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }

View File

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

View File

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

View File

@ -31,4 +31,8 @@
<Reference Include="Microsoft.Extensions.Logging.Debug" /> <Reference Include="Microsoft.Extensions.Logging.Debug" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />
</ItemGroup>
</Project> </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> <SuppressIces>ICE03</SuppressIces>
<DisableGuidGeneration>true</DisableGuidGeneration> <DisableGuidGeneration>true</DisableGuidGeneration>
<SchemaVersion>2.0</SchemaVersion> <SchemaVersion>2.0</SchemaVersion>
<TempPlatform Condition="'$(Platform)' == 'x64'">x64</TempPlatform>
<TempPlatform Condition="'$(Platform)' == 'x86'">Win32</TempPlatform>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -51,6 +53,15 @@
</ProjectReference> </ProjectReference>
</ItemGroup> </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="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), Directory.Build.targets))\Directory.Build.targets" />
<Import Project="..\build\settings.props" /> <Import Project="..\build\settings.props" />
<Import Project="..\build\versions.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;"/> 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"/> <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" <CustomAction Id="CA_ADD_CONFIGSECTION_PROPERTY"
Property="CA_ADD_CONFIGSECTION" Property="CA_ADD_CONFIGSECTION"
Value="[IISEXPRESS_APPHOST_CONFIG];[IISEXPRESS_APPHOST_CONFIG_TMP]"/> Value="[IISEXPRESS_APPHOST_CONFIG]"/>
<CustomAction Id="CA_ADD_CONFIGSECTION" Script="jscript" Execute="deferred" Return="check" Impersonate="no"> <CustomAction BinaryKey="IISCustomActionDll" Id="CA_ADD_CONFIGSECTION" DllEntry="AddConfigSection" Execute="deferred" Return="check" Impersonate="no"/>
<![CDATA[
var caData = Session.Property("CustomActionData"); <CustomAction Id="CA_ADD_CONFIGSECTION_PROPERTY_TMP"
configfiles = caData.split(';'); Property="CA_ADD_CONFIGSECTION_TMP"
for (var i = 0; i < configfiles.length; i++) { Value="[IISEXPRESS_APPHOST_CONFIG_TMP]"/>
var configfile = configfiles[i]; <CustomAction BinaryKey="IISCustomActionDll" Id="CA_ADD_CONFIGSECTION_TMP" DllEntry="AddConfigSection" Execute="deferred" Return="check" Impersonate="no"/>
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>
<!-- CA to remove config section to applicationhost.config -->
<CustomAction Id="CA_REMOVE_CONFIGSECTION_PROPERTY" <CustomAction Id="CA_REMOVE_CONFIGSECTION_PROPERTY"
Property="CA_REMOVE_CONFIGSECTION" Property="CA_REMOVE_CONFIGSECTION"
Value="[IISEXPRESS_APPHOST_CONFIG];[IISEXPRESS_APPHOST_CONFIG_TMP]"/> Value="[IISEXPRESS_APPHOST_CONFIG]"/>
<CustomAction Id="CA_REMOVE_CONFIGSECTION" Script="jscript" Execute="deferred" Return="check" Impersonate="no"> <CustomAction Id="CA_REMOVE_CONFIGSECTION" BinaryKey="IISCustomActionDll" DllEntry="RemoveConfigSection" Execute="deferred" Return="check" Impersonate="no" />
<![CDATA[
var caData = Session.Property("CustomActionData"); <CustomAction Id="CA_REMOVE_CONFIGSECTION_PROPERTY_TMP"
configfiles = caData.split(';'); Property="CA_REMOVE_CONFIGSECTION_TMP"
for (var i = 0; i < configfiles.length; i++) { Value="[IISEXPRESS_APPHOST_CONFIG_TMP]"/>
var configfile = configfiles[i]; <CustomAction Id="CA_REMOVE_CONFIGSECTION_TMP" BinaryKey="IISCustomActionDll" DllEntry="RemoveConfigSection" Execute="deferred" Return="check" Impersonate="no" />
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>
<?if $(var.Platform) = "x64" ?> <?if $(var.Platform) = "x64" ?>
<CustomAction Id="CA_UNLOCK_HANDLER32_PROPERTY" <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;"/> 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"/> <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" <CustomAction Id="CA_ADD_CONFIGSECTION32_PROPERTY"
Property="CA_ADD_CONFIGSECTION32" Property="CA_ADD_CONFIGSECTION32"
Value="[IISEXPRESS_APPHOST_CONFIG32];[IISEXPRESS_APPHOST_CONFIG_TMP32]"/> Value="[IISEXPRESS_APPHOST_CONFIG32]"/>
<CustomAction Id="CA_ADD_CONFIGSECTION32" Script="jscript" Execute="deferred" Return="check" Impersonate="no"> <CustomAction BinaryKey="IISCustomActionDll" Id="CA_ADD_CONFIGSECTION32" DllEntry="AddConfigSection" Execute="deferred" Return="check" Impersonate="no"/>
<!-- Warning LGHT1076: ICE03: String overflow. Orca.exe inspection shows the custom action value is populated correctly -->
<![CDATA[ <CustomAction Id="CA_ADD_CONFIGSECTION32_PROPERTY_TMP"
var caData = Session.Property("CustomActionData"); Property="CA_ADD_CONFIGSECTION32_TMP"
configfiles = caData.split(';'); Value="[IISEXPRESS_APPHOST_CONFIG_TMP32]"/>
for (var i = 0; i < configfiles.length; i++) { <CustomAction BinaryKey="IISCustomActionDll" Id="CA_ADD_CONFIGSECTION32_TMP" DllEntry="AddConfigSection" Execute="deferred" Return="check" Impersonate="no"/>
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>
<!-- CA to remove config section to applicationhost.config -->
<CustomAction Id="CA_REMOVE_CONFIGSECTION32_PROPERTY" <CustomAction Id="CA_REMOVE_CONFIGSECTION32_PROPERTY"
Property="CA_REMOVE_CONFIGSECTION32" Property="CA_REMOVE_CONFIGSECTION32"
Value="[IISEXPRESS_APPHOST_CONFIG32];[IISEXPRESS_APPHOST_CONFIG_TMP32]"/> Value="[IISEXPRESS_APPHOST_CONFIG32]"/>
<CustomAction Id="CA_REMOVE_CONFIGSECTION32" Script="jscript" Execute="deferred" Return="check" Impersonate="no"> <CustomAction Id="CA_REMOVE_CONFIGSECTION32" BinaryKey="IISCustomActionDll" DllEntry="RemoveConfigSection" Execute="deferred" Return="check" Impersonate="no" />
<![CDATA[
var caData = Session.Property("CustomActionData"); <CustomAction Id="CA_REMOVE_CONFIGSECTION32_PROPERTY_TMP"
configfiles = caData.split(';'); Property="CA_REMOVE_CONFIGSECTION32_TMP"
for (var i = 0; i < configfiles.length; i++) { Value="[IISEXPRESS_APPHOST_CONFIG_TMP32]"/>
var configfile = configfiles[i]; <CustomAction Id="CA_REMOVE_CONFIGSECTION32_TMP" BinaryKey="IISCustomActionDll" DllEntry="RemoveConfigSection" Execute="deferred" Return="check" Impersonate="no" />
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>
<?endif?> <?endif?>
<InstallExecuteSequence> <InstallExecuteSequence>
@ -600,7 +516,9 @@
<Custom Action="CA_SET_MODULE" After="CA_SET_MODULE_PROPERTY"><![CDATA[(NOT REMOVE)]]></Custom> <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_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_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" 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_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> <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_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_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" 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_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" 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> <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_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_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_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_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_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> <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_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_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" 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_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_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> <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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#include <precomp.h> #include <precomp.h>
#include <MsiQuery.h>
#include <msxml6.h>
DECLARE_DEBUG_PRINT_OBJECT( "proxyCA.dll" ); DECLARE_DEBUG_PRINT_OBJECT( "proxyCA.dll" );
@ -40,6 +42,137 @@ struct COMPRESSION_MIME_TYPE
COMPRESSION_MIME_TYPE gMimeTypes[] = COMPRESSION_MIME_TYPE gMimeTypes[] =
{ { L"text/event-stream", FALSE} }; { { 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 UINT
WINAPI WINAPI
RegisterANCMCompressionCA( RegisterANCMCompressionCA(

View File

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

View File

@ -48,6 +48,9 @@
<PropertyGroup Condition="'$(Configuration)'=='Release'"> <PropertyGroup Condition="'$(Configuration)'=='Release'">
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Configuration">
<VCToolsVersion />
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<PropertyGroup> <PropertyGroup>
<AdditionalIncludeDirectories>$(IIS-Common)version;$(IIS-Common)Include;$(IIS-Setup)iisca\lib;$(WIX)sdk\$(WixPlatformToolset)\inc;$(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <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> <IncludePath>$(ProjectDir)..\include;$(IncludePath)</IncludePath>
<TargetName>iiscommon</TargetName> <TargetName>iiscommon</TargetName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Configuration">
<VCToolsVersion />
</PropertyGroup>
<ItemDefinitionGroup> <ItemDefinitionGroup>
<ClCompile> <ClCompile>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>

View File

@ -77,6 +77,9 @@
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<PropertyGroup Label="Configuration">
<VCToolsVersion />
</PropertyGroup>
<PropertyGroup> <PropertyGroup>
<AdditionalIncludeDirectories>$(IIS-Common)version;$(IIS-Common)Include;$(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(IIS-Common)version;$(IIS-Common)Include;$(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PrecompiledHeader>Create</PrecompiledHeader> <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; var outputName = string.IsNullOrEmpty(entry?.OutboundHeaderName) ? headerName : entry.OutboundHeaderName;
if (!request.Headers.Contains(outputName) && var hasContent = request.Content != null;
_values.Headers.TryGetValue(headerName, out var values) &&
!StringValues.IsNullOrEmpty(values)) 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")); 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] [Fact]
public async Task HeaderInState_NoOutputName_UseInputName() public async Task HeaderInState_NoOutputName_UseInputName()
{ {
@ -168,11 +225,13 @@ namespace Microsoft.AspNetCore.HeaderPropagation.Tests
private class SimpleHandler : DelegatingHandler private class SimpleHandler : DelegatingHandler
{ {
public HttpHeaders Headers { get; private set; } public HttpHeaders Headers { get; private set; }
public HttpContent Content { get; private set; }
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
Headers = request.Headers; Headers = request.Headers;
Content = request.Content;
return Task.FromResult(new HttpResponseMessage()); return Task.FromResult(new HttpResponseMessage());
} }
} }

View File

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

View File

@ -25,12 +25,15 @@
<Target Name="YarnInstall"> <Target Name="YarnInstall">
<Message Text="Running yarn install on $(MSBuildProjectFile)" Importance="High" /> <Message Text="Running yarn install on $(MSBuildProjectFile)" Importance="High" />
<Yarn Command="install" ContinueOnError="true"> <Yarn Command="install" />
<Output TaskParameter="ExitCode" PropertyName="_YarnExitCode"/> </Target>
</Yarn>
<Yarn Command="install" Condition="'$(_YarnExitCode)' != '0'"> <Target Name="_IsCustomRestoreTargetSupported" Returns="@(CustomRestoreTargets)" Condition="'$(BuildNodeJs)' == 'true'">
<Output TaskParameter="ExitCode" PropertyName="_YarnExitCode"/> <ItemGroup>
</Yarn> <CustomRestoreTargets Include="$(MSBuildProjectFullPath)">
<Targets>YarnInstall</Targets>
</CustomRestoreTargets>
</ItemGroup>
</Target> </Target>
<Target Name="PrepublishScript" DependsOnTargets="YarnInstall" BeforeTargets="PrepareForPublish" Condition=" '$(IsCrossTargetingBuild)' != 'true' "> <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); _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 try
{ {
_actionContextAccessor.ActionContext = _actionContext; task = InvokeFilterPipelineAsync();
}
catch (Exception exception)
{
return Awaited(this, Task.FromException(exception), scope);
}
_diagnosticListener.BeforeAction( Debug.Assert(task != null);
_actionContext.ActionDescriptor, if (!task.IsCompletedSuccessfully)
_actionContext.HttpContext, {
_actionContext.RouteData); 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 try
{ {
await InvokeFilterPipelineAsync(); await task;
} }
finally finally
{ {
ReleaseResources(); invoker.ReleaseResources();
_logger.ExecutedAction(_actionContext.ActionDescriptor, stopwatch.GetElapsedTime());
} }
} }
finally
{
scope.Dispose();
}
} }
finally
static async Task Logged(ResourceInvoker invoker)
{ {
_diagnosticListener.AfterAction( var actionContext = invoker._actionContext;
_actionContext.ActionDescriptor, invoker._actionContextAccessor.ActionContext = actionContext;
_actionContext.HttpContext,
_actionContext.RouteData); 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> /// </summary>
protected abstract void ReleaseResources(); protected abstract void ReleaseResources();
private async Task InvokeFilterPipelineAsync() private Task InvokeFilterPipelineAsync()
{ {
var next = State.InvokeBegin; 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. // `isCompleted` will be set to true when we've reached a terminal state.
var isCompleted = false; var isCompleted = false;
try
while (!isCompleted)
{ {
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 abstract Task InvokeInnerFilterAsync();
protected virtual async Task InvokeResultAsync(IActionResult result) protected virtual Task InvokeResultAsync(IActionResult result)
{ {
var actionContext = _actionContext; if (_diagnosticListener.IsEnabled() || _logger.IsEnabled(LogLevel.Trace))
_diagnosticListener.BeforeActionResult(actionContext, result);
_logger.BeforeExecutingActionResult(result);
try
{ {
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); var actionContext = invoker._actionContext;
_logger.AfterExecutingActionResult(result);
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); filter);
var task = filter.OnAuthorizationAsync(authorizationContext); var task = filter.OnAuthorizationAsync(authorizationContext);
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.AuthorizationAsyncEnd; next = State.AuthorizationAsyncEnd;
return task; return task;
@ -344,7 +465,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
filter); filter);
var task = filter.OnResourceExecutionAsync(resourceExecutingContext, InvokeNextResourceFilterAwaitedAsync); var task = filter.OnResourceExecutionAsync(resourceExecutingContext, InvokeNextResourceFilterAwaitedAsync);
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.ResourceAsyncEnd; next = State.ResourceAsyncEnd;
return task; return task;
@ -418,7 +539,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
} }
var task = InvokeNextResourceFilter(); var task = InvokeNextResourceFilter();
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.ResourceSyncEnd; next = State.ResourceSyncEnd;
return task; return task;
@ -463,7 +584,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
_result = _resourceExecutingContext.Result; _result = _resourceExecutingContext.Result;
var task = InvokeAlwaysRunResultFilters(); var task = InvokeAlwaysRunResultFilters();
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.ResourceEnd; next = State.ResourceEnd;
return task; return task;
@ -512,7 +633,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
case State.ExceptionAsyncBegin: case State.ExceptionAsyncBegin:
{ {
var task = InvokeNextExceptionFilterAsync(); var task = InvokeNextExceptionFilterAsync();
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.ExceptionAsyncResume; next = State.ExceptionAsyncResume;
return task; return task;
@ -539,7 +660,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
filter); filter);
var task = filter.OnExceptionAsync(exceptionContext); var task = filter.OnExceptionAsync(exceptionContext);
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.ExceptionAsyncEnd; next = State.ExceptionAsyncEnd;
return task; return task;
@ -579,7 +700,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
case State.ExceptionSyncBegin: case State.ExceptionSyncBegin:
{ {
var task = InvokeNextExceptionFilterAsync(); var task = InvokeNextExceptionFilterAsync();
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.ExceptionSyncEnd; next = State.ExceptionSyncEnd;
return task; return task;
@ -650,7 +771,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
_result = _exceptionContext.Result; _result = _exceptionContext.Result;
var task = InvokeAlwaysRunResultFilters(); var task = InvokeAlwaysRunResultFilters();
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.ResourceInsideEnd; next = State.ResourceInsideEnd;
return task; return task;
@ -683,7 +804,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
} }
var task = InvokeResultFilters(); var task = InvokeResultFilters();
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.ResourceInsideEnd; next = State.ResourceInsideEnd;
return task; return task;
@ -694,7 +815,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
case State.ActionBegin: case State.ActionBegin:
{ {
var task = InvokeInnerFilterAsync(); var task = InvokeInnerFilterAsync();
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.ActionEnd; next = State.ActionEnd;
return task; return task;
@ -715,7 +836,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
Debug.Assert(scope == Scope.Invoker || scope == Scope.Resource); Debug.Assert(scope == Scope.Invoker || scope == Scope.Resource);
var task = InvokeResultFilters(); var task = InvokeResultFilters();
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.ResourceInsideEnd; next = State.ResourceInsideEnd;
return task; return task;
@ -763,13 +884,35 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
} }
} }
private async Task<ResourceExecutedContext> InvokeNextResourceFilterAwaitedAsync() private Task<ResourceExecutedContext> InvokeNextResourceFilterAwaitedAsync()
{ {
Debug.Assert(_resourceExecutingContext != null); Debug.Assert(_resourceExecutingContext != null);
if (_resourceExecutingContext.Result != null) if (_resourceExecutingContext.Result != null)
{ {
// If we get here, it means that an async filter set a result AND called next(). This is forbidden. // 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( var message = Resources.FormatAsyncResourceFilter_InvalidShortCircuit(
typeof(IAsyncResourceFilter).Name, typeof(IAsyncResourceFilter).Name,
nameof(ResourceExecutingContext.Result), nameof(ResourceExecutingContext.Result),
@ -777,14 +920,10 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
typeof(ResourceExecutionDelegate).Name); typeof(ResourceExecutionDelegate).Name);
throw new InvalidOperationException(message); throw new InvalidOperationException(message);
} }
#pragma warning restore CS1998
await InvokeNextResourceFilter();
Debug.Assert(_resourceExecutedContext != null);
return _resourceExecutedContext;
} }
private async Task InvokeNextResourceFilter() private Task InvokeNextResourceFilter()
{ {
try try
{ {
@ -792,9 +931,14 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
var next = State.ResourceNext; var next = State.ResourceNext;
var state = (object)null; var state = (object)null;
var isCompleted = false; var isCompleted = false;
while (!isCompleted) 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) catch (Exception exception)
@ -806,9 +950,32 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
} }
Debug.Assert(_resourceExecutedContext != null); 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 try
{ {
@ -816,43 +983,119 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
var state = (object)null; var state = (object)null;
var scope = Scope.Exception; var scope = Scope.Exception;
var isCompleted = false; var isCompleted = false;
while (!isCompleted) 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; try
var scope = Scope.Invoker;
var state = (object)null;
var isCompleted = false;
while (!isCompleted)
{ {
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;
} }
} catch (Exception ex)
private async Task InvokeResultFilters()
{
var next = State.ResultBegin;
var scope = Scope.Invoker;
var state = (object)null;
var isCompleted = false;
while (!isCompleted)
{ {
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); filter);
var task = filter.OnResultExecutionAsync(resultExecutingContext, InvokeNextResultFilterAwaitedAsync<TFilter, TFilterAsync>); var task = filter.OnResultExecutionAsync(resultExecutingContext, InvokeNextResultFilterAwaitedAsync<TFilter, TFilterAsync>);
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.ResultAsyncEnd; next = State.ResultAsyncEnd;
return task; return task;
@ -998,7 +1241,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
} }
var task = InvokeNextResultFilterAsync<TFilter, TFilterAsync>(); var task = InvokeNextResultFilterAsync<TFilter, TFilterAsync>();
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.ResultSyncEnd; next = State.ResultSyncEnd;
return task; return task;
@ -1048,7 +1291,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
} }
var task = InvokeResultAsync(_result); var task = InvokeResultAsync(_result);
if (task.Status != TaskStatus.RanToCompletion) if (!task.IsCompletedSuccessfully)
{ {
next = State.ResultEnd; next = State.ResultEnd;
return task; 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 TFilter : class, IResultFilter
where TFilterAsync : class, IAsyncResultFilter where TFilterAsync : class, IAsyncResultFilter
{ {
@ -1093,7 +1336,11 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
var isCompleted = false; var isCompleted = false;
while (!isCompleted) 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) catch (Exception exception)
@ -1105,9 +1352,33 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
} }
Debug.Assert(_resultExecutedContext != null); 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 TFilter : class, IResultFilter
where TFilterAsync : class, IAsyncResultFilter 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(). // If we get here, it means that an async filter set cancel == true AND called next().
// This is forbidden. // 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( var message = Resources.FormatAsyncResultFilter_InvalidShortCircuit(
typeof(IAsyncResultFilter).Name, typeof(IAsyncResultFilter).Name,
nameof(ResultExecutingContext.Cancel), nameof(ResultExecutingContext.Cancel),
@ -1124,13 +1417,10 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
throw new InvalidOperationException(message); throw new InvalidOperationException(message);
} }
#pragma warning restore CS1998
await InvokeNextResultFilterAsync<TFilter, TFilterAsync>();
Debug.Assert(_resultExecutedContext != null);
return _resultExecutedContext;
} }
private static void Rethrow(ResourceExecutedContext context) private static void Rethrow(ResourceExecutedContext context)
{ {
if (context == null) if (context == null)

View File

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

View File

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

View File

@ -14,6 +14,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
/// </summary> /// </summary>
internal class SaveTempDataFilter : IResourceFilter, IResultFilter internal class SaveTempDataFilter : IResourceFilter, IResultFilter
{ {
private static readonly Func<object, Task> OnStartingCallback = (state) => OnStarting((HttpContext)state);
// Internal for unit testing // Internal for unit testing
internal static readonly object SaveTempDataFilterContextKey = new object(); internal static readonly object SaveTempDataFilterContextKey = new object();
@ -43,38 +44,39 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
if (!context.HttpContext.Response.HasStarted) if (!context.HttpContext.Response.HasStarted)
{ {
context.HttpContext.Response.OnStarting((state) => context.HttpContext.Response.OnStarting(
{ callback: OnStartingCallback,
var httpContext = (HttpContext)state; state: context.HttpContext);
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);
} }
} }
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 /> /// <inheritdoc />
public void OnResourceExecuted(ResourceExecutedContext context) 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; SaveTempDataContext saveTempDataContext = null;
if (httpContext.Items.TryGetValue(SaveTempDataFilterContextKey, out var value)) if (httpContext.Items.TryGetValue(SaveTempDataFilterContextKey, out var value))

View File

@ -146,22 +146,15 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
return; return;
} }
// Because it is not possible to delete while enumerating, a copy of the keys must be taken. // In .NET Core 3.0 a Dictionary can have items removed during enumeration
// Use the size of the dictionary as an upper bound to avoid creating more than one copy of the keys. // https://github.com/dotnet/coreclr/pull/18854
var removeCount = 0;
var keys = new string[_data.Count];
foreach (var entry in _data) foreach (var entry in _data)
{ {
if (!_initialKeys.Contains(entry.Key) && !_retainedKeys.Contains(entry.Key)) if (!_initialKeys.Contains(entry.Key) && !_retainedKeys.Contains(entry.Key))
{ {
keys[removeCount] = entry.Key; _data.Remove(entry.Key);
removeCount++;
} }
} }
for (var i = 0; i < removeCount; i++)
{
_data.Remove(keys[i]);
}
_provider.SaveTempData(_context, _data); _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; bottom: 0;
width: 100%; width: 100%;
white-space: nowrap; white-space: nowrap;
/* Set the fixed height of the footer here */
height: 60px;
line-height: 60px; /* Vertically center the text there */ line-height: 60px; /* Vertically center the text there */
} }

View File

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

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