merge from master (#9)

merge from master

Co-authored-by: Nick Darvey <nickdarvey@outlook.com.au>
Co-authored-by: David Fowler <davidfowl@gmail.com>
Co-authored-by: Pranav K <prkrishn@hotmail.com>
Co-authored-by: Ryan Nowak <nowakra@gmail.com>
Co-authored-by: Justin Kotalik <jkotalik12@gmail.com>
Co-authored-by: Kristian Hellang <kristian@hellang.com>
Co-authored-by: Ajay Bhargav Baaskaran <ajaybhargavb@gmail.com>
Co-authored-by: null <42748379+dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: Hao Kung <HaoK@users.noreply.github.com>
Co-authored-by: Doug Bunting <6431421+dougbu@users.noreply.github.com>
Co-authored-by: Chris Ross <Tratcher@Outlook.com>
Co-authored-by: Thomas Levesque <thomaslevesque@users.noreply.github.com>
Co-authored-by: Javier Calvarro Nelson <jacalvar@microsoft.com>
Co-authored-by: Mikael Mengistu <mikaelm12@users.noreply.github.com>
Co-authored-by: Stephen Halter <halter73@gmail.com>
Co-authored-by: Brennan <brecon@microsoft.com>
Co-authored-by: Steve Sanderson <SteveSandersonMS@users.noreply.github.com>
Co-authored-by: Andrew Stanton-Nurse <andrew@stanton-nurse.com>
Co-authored-by: Jacques Eloff <joeloff@users.noreply.github.com>
Co-authored-by: John Luo <johluo@microsoft.com>
Co-authored-by: huysentruitw <wouter_huysentruit@hotmail.com>
Co-authored-by: Ben Adams <thundercat@illyriad.co.uk>
Co-authored-by: Dylan Dmitri Gray <d.dylan.g@gmail.com>
Co-authored-by: Nate McMaster <natemcmaster@users.noreply.github.com>
Co-authored-by: dotnet-maestro <@dotnet-maestro>
Co-authored-by: Daniel Roth <daroth@microsoft.com>
This commit is contained in:
Isaac Levin 2019-07-01 13:05:10 -04:00 committed by GitHub
commit ff1065070c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
653 changed files with 6390 additions and 5354 deletions

View File

@ -10,8 +10,8 @@ pr:
jobs: jobs:
- template: jobs/default-build.yml - template: jobs/default-build.yml
parameters: parameters:
jobName: Helix jobName: Helix_x64
jobDisplayName: 'Tests: Helix' jobDisplayName: 'Tests: Helix x64'
agentOs: Windows agentOs: Windows
timeoutInMinutes: 240 timeoutInMinutes: 240
steps: steps:
@ -25,3 +25,23 @@ jobs:
- name: Helix_logs - name: Helix_logs
path: artifacts/log/ path: artifacts/log/
publishOnError: true publishOnError: true
# Build Helix ARM64
- template: jobs/default-build.yml
parameters:
jobName: Helix_arm64
jobDisplayName: "Tests: Helix ARM64"
agentOs: Linux
timeoutInMinutes: 240
steps:
- script: ./restore.sh -ci
displayName: Restore
- script: ./build.sh -ci --arch arm64 -test --no-build-nodejs -projects $(Build.SourcesDirectory)/eng/helix/helix.proj /p:IsHelixJob=true /p:BuildAllProjects=true /p:BuildNative=true -bl
displayName: Run build.sh helix arm64 target
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken) # We need to set this env var to publish helix results to Azure Dev Ops
installNodeJs: false
artifacts:
- name: Helix_arm64_logs
path: artifacts/logs/
publishOnError: true

View File

@ -25,7 +25,12 @@
<PackageBrandingVersion>$(VersionPrefix)</PackageBrandingVersion> <PackageBrandingVersion>$(VersionPrefix)</PackageBrandingVersion>
<PackageBrandingVersion Condition=" '$(VersionSuffix)' != '' ">$(PackageBrandingVersion) $(BrandingVersionSuffix.Trim())</PackageBrandingVersion> <PackageBrandingVersion Condition=" '$(VersionSuffix)' != '' ">$(PackageBrandingVersion) $(BrandingVersionSuffix.Trim())</PackageBrandingVersion>
<SiteExtensionSuffix>$(VersionSuffix.Replace('.','-'))</SiteExtensionSuffix>
<SiteExtensionPackageVersion>$(VersionPrefix)-$(SiteExtensionSuffix)</SiteExtensionPackageVersion>
<OriginalPackageVersion>$(Version)</OriginalPackageVersion>
<PackageVersion Condition=" '$(PackageVersion)' == '' ">$(Version)</PackageVersion> <PackageVersion Condition=" '$(PackageVersion)' == '' ">$(Version)</PackageVersion>
<PackageVersion Condition=" '$(NoSemVer20)' == 'true' ">$(SiteExtensionPackageVersion)</PackageVersion>
<SharedFxVersion>$(PackageVersion)</SharedFxVersion> <SharedFxVersion>$(PackageVersion)</SharedFxVersion>
<TargetingPackVersion>$(TargetingPackVersionPrefix)</TargetingPackVersion> <TargetingPackVersion>$(TargetingPackVersionPrefix)</TargetingPackVersion>
@ -93,6 +98,10 @@
<BuildHelixPayload Condition="'$(BuildHelixPayload)' == '' AND '$(IsTestProject)' == 'true'">true</BuildHelixPayload> <BuildHelixPayload Condition="'$(BuildHelixPayload)' == '' AND '$(IsTestProject)' == 'true'">true</BuildHelixPayload>
</PropertyGroup> </PropertyGroup>
<ItemGroup Condition="'$(Language)' == 'C#' AND '$(IsReferenceAssemblyProject)' == 'true'">
<Compile Include="$(SharedSourceRoot)ReferenceAssemblyInfo.cs" LinkBase="Properties" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<KnownFrameworkReference Update="Microsoft.NETCore.App"> <KnownFrameworkReference Update="Microsoft.NETCore.App">
<!-- Always update the 'latest version', whether the repo is servicing or not. --> <!-- Always update the 'latest version', whether the repo is servicing or not. -->

View File

@ -1,12 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<packageSources> <packageSources>
<clear /> <clear />
<!--
Restore sources should be defined in eng/Versions.props.
The only allowed feeds here are dotnet-core and nuget.org, which is required to work around
https://github.com/Microsoft/msbuild/issues/2914
-->
<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="nuget.org" value="https://api.nuget.org/v3/index.json" /> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</packageSources> </packageSources>

View File

@ -24,6 +24,8 @@
<FileExtensionSignInfo Include=".nupkg" CertificateName="NuGet" /> <FileExtensionSignInfo Include=".nupkg" CertificateName="NuGet" />
<FileExtensionSignInfo Include=".vsix" CertificateName="VsixSHA2" /> <FileExtensionSignInfo Include=".vsix" CertificateName="VsixSHA2" />
<FileExtensionSignInfo Include=".zip" CertificateName="None" /> <FileExtensionSignInfo Include=".zip" CertificateName="None" />
<FileExtensionSignInfo Include=".cab" CertificateName="None" />
<FileExtensionSignInfo Include=".msi" CertificateName="None" />
<!-- <!--
Use the PublicKeyToken of .NET assemblies to determine with authenticode cert to use. Use the PublicKeyToken of .NET assemblies to determine with authenticode cert to use.

View File

@ -9,400 +9,400 @@
--> -->
<Dependencies> <Dependencies>
<ProductDependencies> <ProductDependencies>
<Dependency Name="Microsoft.AspNetCore.Blazor.Mono" Version="0.10.0-preview7.19323.1"> <Dependency Name="Microsoft.AspNetCore.Blazor.Mono" Version="0.10.0-preview7.19351.1">
<Uri>https://github.com/aspnet/Blazor</Uri> <Uri>https://github.com/aspnet/Blazor</Uri>
<Sha>8df334032840bda9221fe281890e88fb1de06845</Sha> <Sha>10ac2538243650ab287ba9fafe6d05e30c40f9ae</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="3.0.0-preview7.19321.2"> <Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="3.0.0-preview7.19328.6">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri> <Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>5e7c4e5e382a7e486d9416b711fcd65bae25808b</Sha> <Sha>ff305c700f72e199c9a41ee43fdc21e7dfa7020c</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="3.0.0-preview7.19321.2"> <Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="3.0.0-preview7.19328.6">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri> <Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>5e7c4e5e382a7e486d9416b711fcd65bae25808b</Sha> <Sha>ff305c700f72e199c9a41ee43fdc21e7dfa7020c</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.CodeAnalysis.Razor" Version="3.0.0-preview7.19321.2"> <Dependency Name="Microsoft.CodeAnalysis.Razor" Version="3.0.0-preview7.19328.6">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri> <Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>5e7c4e5e382a7e486d9416b711fcd65bae25808b</Sha> <Sha>ff305c700f72e199c9a41ee43fdc21e7dfa7020c</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.NET.Sdk.Razor" Version="3.0.0-preview7.19321.2"> <Dependency Name="Microsoft.NET.Sdk.Razor" Version="3.0.0-preview7.19328.6">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri> <Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>5e7c4e5e382a7e486d9416b711fcd65bae25808b</Sha> <Sha>ff305c700f72e199c9a41ee43fdc21e7dfa7020c</Sha>
</Dependency> </Dependency>
<Dependency Name="dotnet-ef" Version="3.0.0-preview7.19313.2"> <Dependency Name="dotnet-ef" Version="3.0.0-preview7.19330.4">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>507ef211ada34b69c600d02d202761fe7af7c07f</Sha> <Sha>9e3b10d68188c9518cfc5bb3cb0050968adadd99</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="3.0.0-preview7.19313.2"> <Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="3.0.0-preview7.19330.4">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>507ef211ada34b69c600d02d202761fe7af7c07f</Sha> <Sha>9e3b10d68188c9518cfc5bb3cb0050968adadd99</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="3.0.0-preview7.19313.2"> <Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="3.0.0-preview7.19330.4">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>507ef211ada34b69c600d02d202761fe7af7c07f</Sha> <Sha>9e3b10d68188c9518cfc5bb3cb0050968adadd99</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0-preview7.19313.2"> <Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0-preview7.19330.4">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>507ef211ada34b69c600d02d202761fe7af7c07f</Sha> <Sha>9e3b10d68188c9518cfc5bb3cb0050968adadd99</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview7.19313.2"> <Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview7.19330.4">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>507ef211ada34b69c600d02d202761fe7af7c07f</Sha> <Sha>9e3b10d68188c9518cfc5bb3cb0050968adadd99</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0-preview7.19313.2"> <Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0-preview7.19330.4">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>507ef211ada34b69c600d02d202761fe7af7c07f</Sha> <Sha>9e3b10d68188c9518cfc5bb3cb0050968adadd99</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore" Version="3.0.0-preview7.19313.2"> <Dependency Name="Microsoft.EntityFrameworkCore" Version="3.0.0-preview7.19330.4">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>507ef211ada34b69c600d02d202761fe7af7c07f</Sha> <Sha>9e3b10d68188c9518cfc5bb3cb0050968adadd99</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.ActivatorUtilities.Sources" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.ActivatorUtilities.Sources" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Caching.Memory" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Caching.Memory" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.CommandLineUtils.Sources" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.CommandLineUtils.Sources" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Json" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.Json" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.KeyPerFile" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.KeyPerFile" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.DependencyInjection" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.DependencyInjection" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Embedded" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.FileProviders.Embedded" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.HashCodeCombiner.Sources" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.HashCodeCombiner.Sources" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Hosting" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Hosting" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Http" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Http" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Localization.Abstractions" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Localization.Abstractions" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Localization" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Localization" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Console" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.Console" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Debug" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.Debug" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Testing" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.Testing" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.ObjectPool" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.ObjectPool" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Options" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Options" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.ParameterDefaultValue.Sources" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.ParameterDefaultValue.Sources" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Primitives" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Primitives" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.TypeNameHelper.Sources" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.TypeNameHelper.Sources" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.ValueStopwatch.Sources" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.ValueStopwatch.Sources" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.WebEncoders" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.WebEncoders" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Internal.Extensions.Refs" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Internal.Extensions.Refs" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.JSInterop" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.JSInterop" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Mono.WebAssembly.Interop" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Mono.WebAssembly.Interop" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Bcl.AsyncInterfaces" Version="1.0.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="Microsoft.Bcl.AsyncInterfaces" Version="1.0.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.CSharp" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="Microsoft.CSharp" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Win32.Registry" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="Microsoft.Win32.Registry" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.ComponentModel.Annotations" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.ComponentModel.Annotations" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Data.SqlClient" Version="4.7.0-preview6.19264.9" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64" Pinned="true"> <Dependency Name="System.Data.SqlClient" Version="4.7.0-preview6.19264.9" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64" Pinned="true">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>a28176b5ec68b6da1472934fe9493790d1665cae</Sha> <Sha>a28176b5ec68b6da1472934fe9493790d1665cae</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Diagnostics.EventLog" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Diagnostics.EventLog" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.IO.Pipelines" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.IO.Pipelines" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Net.Http.WinHttpHandler" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Net.Http.WinHttpHandler" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Reflection.Metadata" Version="1.7.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Reflection.Metadata" Version="1.7.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Security.Cryptography.Cng" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Security.Cryptography.Cng" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Security.Cryptography.Pkcs" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Security.Cryptography.Pkcs" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Security.Cryptography.Xml" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Security.Cryptography.Xml" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Security.Permissions" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Security.Permissions" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Security.Principal.Windows" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Security.Principal.Windows" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.ServiceProcess.ServiceController" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.ServiceProcess.ServiceController" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Text.Encodings.Web" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Text.Encodings.Web" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Text.Json" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Text.Json" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Threading.Channels" Version="4.6.0-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Threading.Channels" Version="4.6.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.DependencyModel" Version="3.0.0-preview7-27812-08" CoherentParentDependency="Microsoft.Extensions.Logging"> <Dependency Name="Microsoft.Extensions.DependencyModel" Version="3.0.0-preview7-27826-20" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri> <Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>094b6111d3d8c90d1111db4d73fd9faa755d9413</Sha> <Sha>ee0c7ead1a46f06f98aff9102b785f532b71da9c</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.NETCore.App.Ref" Version="3.0.0-preview7-27812-08" CoherentParentDependency="Microsoft.Extensions.Logging"> <Dependency Name="Microsoft.NETCore.App.Ref" Version="3.0.0-preview7-27826-20" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri> <Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>094b6111d3d8c90d1111db4d73fd9faa755d9413</Sha> <Sha>ee0c7ead1a46f06f98aff9102b785f532b71da9c</Sha>
</Dependency> </Dependency>
<!-- <!--
Win-x64 is used here because we have picked an arbitrary runtime identifier to flow the version of the latest NETCore.App runtime. Win-x64 is used here because we have picked an arbitrary runtime identifier to flow the version of the latest NETCore.App runtime.
All Runtime.$rid packages should have the same version. All Runtime.$rid packages should have the same version.
--> -->
<Dependency Name="Microsoft.NETCore.App.Runtime.win-x64" Version="3.0.0-preview7-27812-08" CoherentParentDependency="Microsoft.Extensions.Logging"> <Dependency Name="Microsoft.NETCore.App.Runtime.win-x64" Version="3.0.0-preview7-27826-20" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri> <Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>094b6111d3d8c90d1111db4d73fd9faa755d9413</Sha> <Sha>ee0c7ead1a46f06f98aff9102b785f532b71da9c</Sha>
</Dependency> </Dependency>
<Dependency Name="NETStandard.Library.Ref" Version="2.1.0-preview7-27812-08" CoherentParentDependency="Microsoft.Extensions.Logging"> <Dependency Name="NETStandard.Library.Ref" Version="2.1.0-preview7-27826-20" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri> <Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>094b6111d3d8c90d1111db4d73fd9faa755d9413</Sha> <Sha>ee0c7ead1a46f06f98aff9102b785f532b71da9c</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-preview7.19312.3" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="Microsoft.NETCore.Platforms" Version="3.0.0-preview7.19326.13" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>28efaabc4349d11a95f8f31eb932c84f207916ab</Sha> <Sha>72da80db3fd14b84fefeef54ac0930c711f306f4</Sha>
</Dependency> </Dependency>
<Dependency Name="Internal.AspNetCore.Analyzers" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Internal.AspNetCore.Analyzers" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.DotNet.GenAPI" Version="1.0.0-beta.19323.4"> <Dependency Name="Microsoft.DotNet.GenAPI" Version="1.0.0-beta.19323.4">
<Uri>https://github.com/dotnet/arcade</Uri> <Uri>https://github.com/dotnet/arcade</Uri>
@ -416,9 +416,9 @@
<Uri>https://github.com/dotnet/arcade</Uri> <Uri>https://github.com/dotnet/arcade</Uri>
<Sha>9946534da4f73e6242ca105f6798ab58119c9ab0</Sha> <Sha>9946534da4f73e6242ca105f6798ab58119c9ab0</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.AspNetCore.Testing" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.AspNetCore.Testing" Version="3.0.0-preview7.19328.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha> <Sha>531db4e313e577192cdbca3931c4298b6db1e611</Sha>
</Dependency> </Dependency>
</ToolsetDependencies> </ToolsetDependencies>
</Dependencies> </Dependencies>

View File

@ -54,110 +54,110 @@
<!-- Packages from dotnet/arcade --> <!-- Packages from dotnet/arcade -->
<MicrosoftDotNetGenAPIPackageVersion>1.0.0-beta.19323.4</MicrosoftDotNetGenAPIPackageVersion> <MicrosoftDotNetGenAPIPackageVersion>1.0.0-beta.19323.4</MicrosoftDotNetGenAPIPackageVersion>
<!-- Packages from dotnet/core-setup --> <!-- Packages from dotnet/core-setup -->
<MicrosoftExtensionsDependencyModelPackageVersion>3.0.0-preview7-27812-08</MicrosoftExtensionsDependencyModelPackageVersion> <MicrosoftExtensionsDependencyModelPackageVersion>3.0.0-preview7-27826-20</MicrosoftExtensionsDependencyModelPackageVersion>
<MicrosoftNETCoreAppRefPackageVersion>3.0.0-preview7-27812-08</MicrosoftNETCoreAppRefPackageVersion> <MicrosoftNETCoreAppRefPackageVersion>3.0.0-preview7-27826-20</MicrosoftNETCoreAppRefPackageVersion>
<MicrosoftNETCoreAppRuntimewinx64PackageVersion>3.0.0-preview7-27812-08</MicrosoftNETCoreAppRuntimewinx64PackageVersion> <MicrosoftNETCoreAppRuntimewinx64PackageVersion>3.0.0-preview7-27826-20</MicrosoftNETCoreAppRuntimewinx64PackageVersion>
<NETStandardLibraryRefPackageVersion>2.1.0-preview7-27812-08</NETStandardLibraryRefPackageVersion> <NETStandardLibraryRefPackageVersion>2.1.0-preview7-27826-20</NETStandardLibraryRefPackageVersion>
<!-- Packages from dotnet/corefx --> <!-- Packages from dotnet/corefx -->
<MicrosoftBclAsyncInterfacesPackageVersion>1.0.0-preview7.19312.3</MicrosoftBclAsyncInterfacesPackageVersion> <MicrosoftBclAsyncInterfacesPackageVersion>1.0.0-preview7.19326.13</MicrosoftBclAsyncInterfacesPackageVersion>
<MicrosoftCSharpPackageVersion>4.6.0-preview7.19312.3</MicrosoftCSharpPackageVersion> <MicrosoftCSharpPackageVersion>4.6.0-preview7.19326.13</MicrosoftCSharpPackageVersion>
<MicrosoftWin32RegistryPackageVersion>4.6.0-preview7.19312.3</MicrosoftWin32RegistryPackageVersion> <MicrosoftWin32RegistryPackageVersion>4.6.0-preview7.19326.13</MicrosoftWin32RegistryPackageVersion>
<SystemComponentModelAnnotationsPackageVersion>4.6.0-preview7.19312.3</SystemComponentModelAnnotationsPackageVersion> <SystemComponentModelAnnotationsPackageVersion>4.6.0-preview7.19326.13</SystemComponentModelAnnotationsPackageVersion>
<SystemDataSqlClientPackageVersion>4.7.0-preview6.19264.9</SystemDataSqlClientPackageVersion> <SystemDataSqlClientPackageVersion>4.7.0-preview6.19264.9</SystemDataSqlClientPackageVersion>
<SystemDiagnosticsEventLogPackageVersion>4.6.0-preview7.19312.3</SystemDiagnosticsEventLogPackageVersion> <SystemDiagnosticsEventLogPackageVersion>4.6.0-preview7.19326.13</SystemDiagnosticsEventLogPackageVersion>
<SystemIOPipelinesPackageVersion>4.6.0-preview7.19312.3</SystemIOPipelinesPackageVersion> <SystemIOPipelinesPackageVersion>4.6.0-preview7.19326.13</SystemIOPipelinesPackageVersion>
<SystemNetHttpWinHttpHandlerPackageVersion>4.6.0-preview7.19312.3</SystemNetHttpWinHttpHandlerPackageVersion> <SystemNetHttpWinHttpHandlerPackageVersion>4.6.0-preview7.19326.13</SystemNetHttpWinHttpHandlerPackageVersion>
<SystemNetWebSocketsWebSocketProtocolPackageVersion>4.6.0-preview7.19312.3</SystemNetWebSocketsWebSocketProtocolPackageVersion> <SystemNetWebSocketsWebSocketProtocolPackageVersion>4.6.0-preview7.19326.13</SystemNetWebSocketsWebSocketProtocolPackageVersion>
<SystemReflectionMetadataPackageVersion>1.7.0-preview7.19312.3</SystemReflectionMetadataPackageVersion> <SystemReflectionMetadataPackageVersion>1.7.0-preview7.19326.13</SystemReflectionMetadataPackageVersion>
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.6.0-preview7.19312.3</SystemRuntimeCompilerServicesUnsafePackageVersion> <SystemRuntimeCompilerServicesUnsafePackageVersion>4.6.0-preview7.19326.13</SystemRuntimeCompilerServicesUnsafePackageVersion>
<SystemSecurityCryptographyCngPackageVersion>4.6.0-preview7.19312.3</SystemSecurityCryptographyCngPackageVersion> <SystemSecurityCryptographyCngPackageVersion>4.6.0-preview7.19326.13</SystemSecurityCryptographyCngPackageVersion>
<SystemSecurityCryptographyPkcsPackageVersion>4.6.0-preview7.19312.3</SystemSecurityCryptographyPkcsPackageVersion> <SystemSecurityCryptographyPkcsPackageVersion>4.6.0-preview7.19326.13</SystemSecurityCryptographyPkcsPackageVersion>
<SystemSecurityCryptographyXmlPackageVersion>4.6.0-preview7.19312.3</SystemSecurityCryptographyXmlPackageVersion> <SystemSecurityCryptographyXmlPackageVersion>4.6.0-preview7.19326.13</SystemSecurityCryptographyXmlPackageVersion>
<SystemSecurityPermissionsPackageVersion>4.6.0-preview7.19312.3</SystemSecurityPermissionsPackageVersion> <SystemSecurityPermissionsPackageVersion>4.6.0-preview7.19326.13</SystemSecurityPermissionsPackageVersion>
<SystemSecurityPrincipalWindowsPackageVersion>4.6.0-preview7.19312.3</SystemSecurityPrincipalWindowsPackageVersion> <SystemSecurityPrincipalWindowsPackageVersion>4.6.0-preview7.19326.13</SystemSecurityPrincipalWindowsPackageVersion>
<SystemServiceProcessServiceControllerPackageVersion>4.6.0-preview7.19312.3</SystemServiceProcessServiceControllerPackageVersion> <SystemServiceProcessServiceControllerPackageVersion>4.6.0-preview7.19326.13</SystemServiceProcessServiceControllerPackageVersion>
<SystemTextEncodingsWebPackageVersion>4.6.0-preview7.19312.3</SystemTextEncodingsWebPackageVersion> <SystemTextEncodingsWebPackageVersion>4.6.0-preview7.19326.13</SystemTextEncodingsWebPackageVersion>
<SystemTextJsonPackageVersion>4.6.0-preview7.19312.3</SystemTextJsonPackageVersion> <SystemTextJsonPackageVersion>4.6.0-preview7.19326.13</SystemTextJsonPackageVersion>
<SystemThreadingChannelsPackageVersion>4.6.0-preview7.19312.3</SystemThreadingChannelsPackageVersion> <SystemThreadingChannelsPackageVersion>4.6.0-preview7.19326.13</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-preview7.19312.3</MicrosoftNETCorePlatformsPackageVersion> <MicrosoftNETCorePlatformsPackageVersion>3.0.0-preview7.19326.13</MicrosoftNETCorePlatformsPackageVersion>
<!-- Packages from aspnet/Blazor --> <!-- Packages from aspnet/Blazor -->
<MicrosoftAspNetCoreBlazorMonoPackageVersion>0.10.0-preview7.19323.1</MicrosoftAspNetCoreBlazorMonoPackageVersion> <MicrosoftAspNetCoreBlazorMonoPackageVersion>0.10.0-preview7.19351.1</MicrosoftAspNetCoreBlazorMonoPackageVersion>
<!-- Packages from aspnet/Extensions --> <!-- Packages from aspnet/Extensions -->
<InternalAspNetCoreAnalyzersPackageVersion>3.0.0-preview7.19312.4</InternalAspNetCoreAnalyzersPackageVersion> <InternalAspNetCoreAnalyzersPackageVersion>3.0.0-preview7.19328.2</InternalAspNetCoreAnalyzersPackageVersion>
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.0.0-preview7.19312.4</MicrosoftAspNetCoreAnalyzerTestingPackageVersion> <MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.0.0-preview7.19328.2</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>3.0.0-preview7.19312.4</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion> <MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>3.0.0-preview7.19328.2</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
<MicrosoftAspNetCoreTestingPackageVersion>3.0.0-preview7.19312.4</MicrosoftAspNetCoreTestingPackageVersion> <MicrosoftAspNetCoreTestingPackageVersion>3.0.0-preview7.19328.2</MicrosoftAspNetCoreTestingPackageVersion>
<MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion> <MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>
<MicrosoftExtensionsCachingAbstractionsPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsCachingAbstractionsPackageVersion> <MicrosoftExtensionsCachingAbstractionsPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsCachingAbstractionsPackageVersion>
<MicrosoftExtensionsCachingMemoryPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsCachingMemoryPackageVersion> <MicrosoftExtensionsCachingMemoryPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsCachingMemoryPackageVersion>
<MicrosoftExtensionsCachingSqlServerPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsCachingSqlServerPackageVersion> <MicrosoftExtensionsCachingSqlServerPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsCachingSqlServerPackageVersion>
<MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion> <MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>
<MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion> <MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>
<MicrosoftExtensionsConfigurationAbstractionsPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsConfigurationAbstractionsPackageVersion> <MicrosoftExtensionsConfigurationAbstractionsPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
<MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion> <MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>
<MicrosoftExtensionsConfigurationBinderPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsConfigurationBinderPackageVersion> <MicrosoftExtensionsConfigurationBinderPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsConfigurationBinderPackageVersion>
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsConfigurationCommandLinePackageVersion> <MicrosoftExtensionsConfigurationCommandLinePackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion> <MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
<MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion> <MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>
<MicrosoftExtensionsConfigurationIniPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsConfigurationIniPackageVersion> <MicrosoftExtensionsConfigurationIniPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsConfigurationIniPackageVersion>
<MicrosoftExtensionsConfigurationJsonPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsConfigurationJsonPackageVersion> <MicrosoftExtensionsConfigurationJsonPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsConfigurationJsonPackageVersion>
<MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsConfigurationKeyPerFilePackageVersion> <MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>
<MicrosoftExtensionsConfigurationPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsConfigurationPackageVersion> <MicrosoftExtensionsConfigurationPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsConfigurationPackageVersion>
<MicrosoftExtensionsConfigurationUserSecretsPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsConfigurationUserSecretsPackageVersion> <MicrosoftExtensionsConfigurationUserSecretsPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsConfigurationUserSecretsPackageVersion>
<MicrosoftExtensionsConfigurationXmlPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsConfigurationXmlPackageVersion> <MicrosoftExtensionsConfigurationXmlPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsConfigurationXmlPackageVersion>
<MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion> <MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>
<MicrosoftExtensionsDependencyInjectionPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsDependencyInjectionPackageVersion> <MicrosoftExtensionsDependencyInjectionPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsDependencyInjectionPackageVersion>
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsDiagnosticAdapterPackageVersion> <MicrosoftExtensionsDiagnosticAdapterPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion> <MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion> <MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion> <MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
<MicrosoftExtensionsFileProvidersCompositePackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsFileProvidersCompositePackageVersion> <MicrosoftExtensionsFileProvidersCompositePackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsFileProvidersCompositePackageVersion>
<MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion> <MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>
<MicrosoftExtensionsFileProvidersPhysicalPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsFileProvidersPhysicalPackageVersion> <MicrosoftExtensionsFileProvidersPhysicalPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsFileProvidersPhysicalPackageVersion>
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsFileSystemGlobbingPackageVersion> <MicrosoftExtensionsFileSystemGlobbingPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
<MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion> <MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>
<MicrosoftExtensionsHostingAbstractionsPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsHostingAbstractionsPackageVersion> <MicrosoftExtensionsHostingAbstractionsPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsHostingAbstractionsPackageVersion>
<MicrosoftExtensionsHostingPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsHostingPackageVersion> <MicrosoftExtensionsHostingPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsHostingPackageVersion>
<MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion> <MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>
<MicrosoftExtensionsHttpPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsHttpPackageVersion> <MicrosoftExtensionsHttpPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsHttpPackageVersion>
<MicrosoftExtensionsLocalizationAbstractionsPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsLocalizationAbstractionsPackageVersion> <MicrosoftExtensionsLocalizationAbstractionsPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsLocalizationAbstractionsPackageVersion>
<MicrosoftExtensionsLocalizationPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsLocalizationPackageVersion> <MicrosoftExtensionsLocalizationPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsLocalizationPackageVersion>
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsLoggingAbstractionsPackageVersion> <MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
<MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion> <MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>
<MicrosoftExtensionsLoggingConfigurationPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsLoggingConfigurationPackageVersion> <MicrosoftExtensionsLoggingConfigurationPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsLoggingConfigurationPackageVersion>
<MicrosoftExtensionsLoggingConsolePackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsLoggingConsolePackageVersion> <MicrosoftExtensionsLoggingConsolePackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsLoggingConsolePackageVersion>
<MicrosoftExtensionsLoggingDebugPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsLoggingDebugPackageVersion> <MicrosoftExtensionsLoggingDebugPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsLoggingDebugPackageVersion>
<MicrosoftExtensionsLoggingEventSourcePackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsLoggingEventSourcePackageVersion> <MicrosoftExtensionsLoggingEventSourcePackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsLoggingEventSourcePackageVersion>
<MicrosoftExtensionsLoggingEventLogPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsLoggingEventLogPackageVersion> <MicrosoftExtensionsLoggingEventLogPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsLoggingEventLogPackageVersion>
<MicrosoftExtensionsLoggingPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsLoggingPackageVersion> <MicrosoftExtensionsLoggingPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsLoggingPackageVersion>
<MicrosoftExtensionsLoggingTestingPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsLoggingTestingPackageVersion> <MicrosoftExtensionsLoggingTestingPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsLoggingTestingPackageVersion>
<MicrosoftExtensionsLoggingTraceSourcePackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsLoggingTraceSourcePackageVersion> <MicrosoftExtensionsLoggingTraceSourcePackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsLoggingTraceSourcePackageVersion>
<MicrosoftExtensionsObjectPoolPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsObjectPoolPackageVersion> <MicrosoftExtensionsObjectPoolPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsObjectPoolPackageVersion>
<MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion> <MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>
<MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion> <MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>
<MicrosoftExtensionsOptionsPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsOptionsPackageVersion> <MicrosoftExtensionsOptionsPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsOptionsPackageVersion>
<MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion> <MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>
<MicrosoftExtensionsPrimitivesPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsPrimitivesPackageVersion> <MicrosoftExtensionsPrimitivesPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsPrimitivesPackageVersion>
<MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion> <MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>
<MicrosoftExtensionsValueStopwatchSourcesPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsValueStopwatchSourcesPackageVersion> <MicrosoftExtensionsValueStopwatchSourcesPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsValueStopwatchSourcesPackageVersion>
<MicrosoftExtensionsWebEncodersPackageVersion>3.0.0-preview7.19312.4</MicrosoftExtensionsWebEncodersPackageVersion> <MicrosoftExtensionsWebEncodersPackageVersion>3.0.0-preview7.19328.2</MicrosoftExtensionsWebEncodersPackageVersion>
<MicrosoftInternalExtensionsRefsPackageVersion>3.0.0-preview7.19312.4</MicrosoftInternalExtensionsRefsPackageVersion> <MicrosoftInternalExtensionsRefsPackageVersion>3.0.0-preview7.19328.2</MicrosoftInternalExtensionsRefsPackageVersion>
<MicrosoftJSInteropPackageVersion>3.0.0-preview7.19312.4</MicrosoftJSInteropPackageVersion> <MicrosoftJSInteropPackageVersion>3.0.0-preview7.19328.2</MicrosoftJSInteropPackageVersion>
<MonoWebAssemblyInteropPackageVersion>3.0.0-preview7.19312.4</MonoWebAssemblyInteropPackageVersion> <MonoWebAssemblyInteropPackageVersion>3.0.0-preview7.19328.2</MonoWebAssemblyInteropPackageVersion>
<!-- Packages from aspnet/EntityFrameworkCore --> <!-- Packages from aspnet/EntityFrameworkCore -->
<dotnetefPackageVersion>3.0.0-preview7.19313.2</dotnetefPackageVersion> <dotnetefPackageVersion>3.0.0-preview7.19330.4</dotnetefPackageVersion>
<MicrosoftEntityFrameworkCoreInMemoryPackageVersion>3.0.0-preview7.19313.2</MicrosoftEntityFrameworkCoreInMemoryPackageVersion> <MicrosoftEntityFrameworkCoreInMemoryPackageVersion>3.0.0-preview7.19330.4</MicrosoftEntityFrameworkCoreInMemoryPackageVersion>
<MicrosoftEntityFrameworkCoreRelationalPackageVersion>3.0.0-preview7.19313.2</MicrosoftEntityFrameworkCoreRelationalPackageVersion> <MicrosoftEntityFrameworkCoreRelationalPackageVersion>3.0.0-preview7.19330.4</MicrosoftEntityFrameworkCoreRelationalPackageVersion>
<MicrosoftEntityFrameworkCoreSqlitePackageVersion>3.0.0-preview7.19313.2</MicrosoftEntityFrameworkCoreSqlitePackageVersion> <MicrosoftEntityFrameworkCoreSqlitePackageVersion>3.0.0-preview7.19330.4</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
<MicrosoftEntityFrameworkCoreSqlServerPackageVersion>3.0.0-preview7.19313.2</MicrosoftEntityFrameworkCoreSqlServerPackageVersion> <MicrosoftEntityFrameworkCoreSqlServerPackageVersion>3.0.0-preview7.19330.4</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
<MicrosoftEntityFrameworkCoreToolsPackageVersion>3.0.0-preview7.19313.2</MicrosoftEntityFrameworkCoreToolsPackageVersion> <MicrosoftEntityFrameworkCoreToolsPackageVersion>3.0.0-preview7.19330.4</MicrosoftEntityFrameworkCoreToolsPackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>3.0.0-preview7.19313.2</MicrosoftEntityFrameworkCorePackageVersion> <MicrosoftEntityFrameworkCorePackageVersion>3.0.0-preview7.19330.4</MicrosoftEntityFrameworkCorePackageVersion>
<!-- Packages from aspnet/AspNetCore-Tooling --> <!-- Packages from aspnet/AspNetCore-Tooling -->
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.0.0-preview7.19321.2</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion> <MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.0.0-preview7.19328.6</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
<MicrosoftAspNetCoreRazorLanguagePackageVersion>3.0.0-preview7.19321.2</MicrosoftAspNetCoreRazorLanguagePackageVersion> <MicrosoftAspNetCoreRazorLanguagePackageVersion>3.0.0-preview7.19328.6</MicrosoftAspNetCoreRazorLanguagePackageVersion>
<MicrosoftCodeAnalysisRazorPackageVersion>3.0.0-preview7.19321.2</MicrosoftCodeAnalysisRazorPackageVersion> <MicrosoftCodeAnalysisRazorPackageVersion>3.0.0-preview7.19328.6</MicrosoftCodeAnalysisRazorPackageVersion>
<MicrosoftNETSdkRazorPackageVersion>3.0.0-preview7.19321.2</MicrosoftNETSdkRazorPackageVersion> <MicrosoftNETSdkRazorPackageVersion>3.0.0-preview7.19328.6</MicrosoftNETSdkRazorPackageVersion>
</PropertyGroup> </PropertyGroup>
<!-- <!--
@ -217,8 +217,7 @@
<CastleCorePackageVersion>4.2.1</CastleCorePackageVersion> <CastleCorePackageVersion>4.2.1</CastleCorePackageVersion>
<FSharpCorePackageVersion>4.2.1</FSharpCorePackageVersion> <FSharpCorePackageVersion>4.2.1</FSharpCorePackageVersion>
<GoogleProtobufPackageVersion>3.8.0</GoogleProtobufPackageVersion> <GoogleProtobufPackageVersion>3.8.0</GoogleProtobufPackageVersion>
<GrpcAspNetCoreServerPackageVersion>0.1.21-pre1</GrpcAspNetCoreServerPackageVersion> <GrpcAspNetCorePackageVersion>0.1.22-pre1</GrpcAspNetCorePackageVersion>
<GrpcToolsPackageVersion>1.21.0</GrpcToolsPackageVersion>
<IdentityServer4AspNetIdentityPackageVersion>3.0.0-preview3.4</IdentityServer4AspNetIdentityPackageVersion> <IdentityServer4AspNetIdentityPackageVersion>3.0.0-preview3.4</IdentityServer4AspNetIdentityPackageVersion>
<IdentityServer4EntityFrameworkPackageVersion>3.0.0-preview3.4</IdentityServer4EntityFrameworkPackageVersion> <IdentityServer4EntityFrameworkPackageVersion>3.0.0-preview3.4</IdentityServer4EntityFrameworkPackageVersion>
<IdentityServer4PackageVersion>3.0.0-preview3.4</IdentityServer4PackageVersion> <IdentityServer4PackageVersion>3.0.0-preview3.4</IdentityServer4PackageVersion>

View File

@ -31,7 +31,6 @@
<WarnOnPackingNonPackableProject>false</WarnOnPackingNonPackableProject> <WarnOnPackingNonPackableProject>false</WarnOnPackingNonPackableProject>
</PropertyGroup> </PropertyGroup>
<!-- Workaround for https://github.com/dotnet/arcade/issues/204 --> <!-- Workaround for https://github.com/dotnet/arcade/issues/204 -->
<ItemGroup> <ItemGroup>
<PackageReference Include="Internal.AspNetCore.BuildTasks" PrivateAssets="All" Version="$(InternalAspNetCoreBuildTasksPackageVersion)" IsImplicitlyDefined="true" /> <PackageReference Include="Internal.AspNetCore.BuildTasks" PrivateAssets="All" Version="$(InternalAspNetCoreBuildTasksPackageVersion)" IsImplicitlyDefined="true" />
@ -58,4 +57,10 @@
</KnownFrameworkReference> </KnownFrameworkReference>
</ItemGroup> </ItemGroup>
<!-- Work around https://github.com/dotnet/cli/issues/11378. -->
<Target Name="_WorkaroundNetStandard" AfterTargets="ResolvePackageAssets">
<ItemGroup>
<TransitiveFrameworkReference Remove="NETStandard.Library" />
</ItemGroup>
</Target>
</Project> </Project>

View File

@ -9,16 +9,18 @@ if type -P "node" &>/dev/null; then
fi fi
node_version=$1 node_version=$1
arch=$2
osname=`uname -s` osname=`uname -s`
echo $osname
if [ "$osname" = "Darwin" ]; then if [ "$osname" = "Darwin" ]; then
platformarch='darwin-x64' platformarch="darwin-$arch"
else else
platformarch='linux-x64' platformarch="linux-$arch"
fi fi
echo "PlatformArch: $platformarch"
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
output_dir="$DIR/node" output_dir="$DIR/node"
url="http://nodejs.org/dist/v$node_version/node-v$node_version-$platformarch.tar.gz" url="http://nodejs.org/dist/v$node_version/node-v$node_version-$platformarch.tar.gz"
echo "Downloading from: $url"
tmp="$(mktemp -d -t install-node.XXXXXX)" tmp="$(mktemp -d -t install-node.XXXXXX)"
trap "rm -rf $tmp" EXIT trap "rm -rf $tmp" EXIT
cd "$tmp" cd "$tmp"

View File

@ -7,17 +7,18 @@ set targetFrameworkIdentifier=%2
set sdkVersion=%3 set sdkVersion=%3
set runtimeVersion=%4 set runtimeVersion=%4
set helixQueue=%5 set helixQueue=%5
set arch=%6
set DOTNET_HOME=%HELIX_CORRELATION_PAYLOAD%\sdk set DOTNET_HOME=%HELIX_CORRELATION_PAYLOAD%\sdk
set DOTNET_ROOT=%DOTNET_HOME%\x64 set DOTNET_ROOT=%DOTNET_HOME%\%arch%
set DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 set DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
set DOTNET_MULTILEVEL_LOOKUP=0 set DOTNET_MULTILEVEL_LOOKUP=0
set DOTNET_CLI_HOME=%HELIX_CORRELATION_PAYLOAD%\home set DOTNET_CLI_HOME=%HELIX_CORRELATION_PAYLOAD%\home
set PATH=%DOTNET_ROOT%;%PATH%;%HELIX_CORRELATION_PAYLOAD%\node\bin set PATH=%DOTNET_ROOT%;%PATH%;%HELIX_CORRELATION_PAYLOAD%\node\bin
powershell.exe -NoProfile -ExecutionPolicy unrestricted -Command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; &([scriptblock]::Create((Invoke-WebRequest -useb 'https://dot.net/v1/dotnet-install.ps1'))) -Architecture x64 -Version %sdkVersion% -InstallDir %DOTNET_ROOT%" powershell.exe -NoProfile -ExecutionPolicy unrestricted -Command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; &([scriptblock]::Create((Invoke-WebRequest -useb 'https://dot.net/v1/dotnet-install.ps1'))) -Architecture %arch% -Version %sdkVersion% -InstallDir %DOTNET_ROOT%"
powershell.exe -NoProfile -ExecutionPolicy unrestricted -Command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; &([scriptblock]::Create((Invoke-WebRequest -useb 'https://dot.net/v1/dotnet-install.ps1'))) -Architecture x64 -Runtime dotnet -Version %runtimeVersion% -InstallDir %DOTNET_ROOT%" powershell.exe -NoProfile -ExecutionPolicy unrestricted -Command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; &([scriptblock]::Create((Invoke-WebRequest -useb 'https://dot.net/v1/dotnet-install.ps1'))) -Architecture %arch% -Runtime dotnet -Version %runtimeVersion% -InstallDir %DOTNET_ROOT%"
set HELIX=%helixQueue% set HELIX=%helixQueue%

View File

@ -27,7 +27,7 @@
<PropertyGroup Condition=" '$(ContinuousIntegrationBuild)' == 'true' "> <PropertyGroup Condition=" '$(ContinuousIntegrationBuild)' == 'true' ">
<HelixType>ci</HelixType> <HelixType>ci</HelixType>
<Creator>aspnetcore</Creator> <Creator>aspnetcore</Creator>
<HelixBuild>$(BUILD_BUILDNUMBER).$(SYSTEM_JOBATTEMPT)</HelixBuild> <HelixBuild>$(BUILD_BUILDNUMBER).$(TargetArchitecture).$(SYSTEM_JOBATTEMPT)</HelixBuild>
<WaitForWorkItemCompletion>true</WaitForWorkItemCompletion> <WaitForWorkItemCompletion>true</WaitForWorkItemCompletion>
<EnableAzurePipelinesReporter>true</EnableAzurePipelinesReporter> <EnableAzurePipelinesReporter>true</EnableAzurePipelinesReporter>
<FailOnMissionControlTestFailure>true</FailOnMissionControlTestFailure> <FailOnMissionControlTestFailure>true</FailOnMissionControlTestFailure>

View File

@ -10,7 +10,10 @@
<HelixAvailablePlatform Include="Windows" /> <HelixAvailablePlatform Include="Windows" />
<HelixAvailablePlatform Include="OSX" /> <HelixAvailablePlatform Include="OSX" />
<HelixAvailablePlatform Include="Linux" /> <HelixAvailablePlatform Include="Linux" />
</ItemGroup>
<!-- x64 queues -->
<ItemGroup Condition="'$(IsWindowsOnlyTest)' != 'true' AND '$(TargetArchitecture)' == 'x64'">
<HelixAvailableTargetQueue Include="Windows.10.Amd64.ClientRS4.VS2017.Open" Platform="Windows" /> <HelixAvailableTargetQueue Include="Windows.10.Amd64.ClientRS4.VS2017.Open" Platform="Windows" />
<HelixAvailableTargetQueue Include="Windows.81.Amd64.Open" Platform="Windows" /> <HelixAvailableTargetQueue Include="Windows.81.Amd64.Open" Platform="Windows" />
<HelixAvailableTargetQueue Include="Windows.7.Amd64.Open" Platform="Windows" /> <HelixAvailableTargetQueue Include="Windows.7.Amd64.Open" Platform="Windows" />
@ -23,8 +26,16 @@
<HelixAvailableTargetQueue Include="Debian.9.Amd64.Open" Platform="Linux" /> <HelixAvailableTargetQueue Include="Debian.9.Amd64.Open" Platform="Linux" />
<HelixAvailableTargetQueue Include="Redhat.7.Amd64.Open" Platform="Linux" /> <HelixAvailableTargetQueue Include="Redhat.7.Amd64.Open" Platform="Linux" />
<HelixAvailableTargetQueue Include="(Fedora.28.Amd64.Open)Ubuntu.1604.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-28-helix-09ca40b-20190508143249" Platform="Linux" /> <HelixAvailableTargetQueue Include="(Fedora.28.Amd64.Open)Ubuntu.1604.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-28-helix-09ca40b-20190508143249" Platform="Linux" />
</ItemGroup>
<!-- TODO: re-enable Debian.9.Arm64.Open and Ubuntu.1804.Arm64.Open --> <ItemGroup Condition="'$(IsWindowsOnlyTest)' != 'true' AND '$(TargetArchitecture)' == 'arm64'">
<!-- arm64 queues -->
<HelixAvailableTargetQueue Include="(Debian.9.Arm64.Open)Ubuntu.1604.Arm64.Docker.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-9-helix-arm64v8-0a0ebdd-20190312215438" Platform="Linux" />
<!-- Need to resolve permission issues on this docker queue
<HelixAvailableTargetQueue Include="(Alpine.38.Arm64)Ubuntu.1604.Arm64.Docker@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.8-helix-arm64v8-46e69dd-20190327215724" Platform="Linux" />
<HelixAvailableTargetQueue Include="(Ubuntu-1804.Arm64.Open)Ubuntu.1604.Arm64.Docker.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm64v8-6f28fa9-20190606004102" Platform="Linux" />
-->
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(IsWindowsOnlyTest)' == 'true'"> <ItemGroup Condition="'$(IsWindowsOnlyTest)' == 'true'">

View File

@ -37,7 +37,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(TestDependsOnNode)' == 'true' AND '$(IsWindowsHelixQueue)' == 'false'"> <ItemGroup Condition="'$(TestDependsOnNode)' == 'true' AND '$(IsWindowsHelixQueue)' == 'false'">
<HelixPreCommand Include="./installnode.sh $(NodeVersion)" /> <HelixPreCommand Include="./installnode.sh $(NodeVersion) $(TargetArchitecture)" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(TestDependsOnNode)' == 'true' AND '$(IsWindowsHelixQueue)' == 'true'"> <ItemGroup Condition="'$(TestDependsOnNode)' == 'true' AND '$(IsWindowsHelixQueue)' == 'true'">

View File

@ -49,8 +49,8 @@ Usage: dotnet msbuild /t:Helix src/MyTestProject.csproj
<PropertyGroup> <PropertyGroup>
<BuildHelixPayload Condition="'@(_HelixApplicableTargetQueue->Count())' == '0'">false</BuildHelixPayload> <BuildHelixPayload Condition="'@(_HelixApplicableTargetQueue->Count())' == '0'">false</BuildHelixPayload>
<BuildHelixPayload Condition="'$(TargetArchitecture)' == 'arm64' AND '$(SkipHelixArm)' == 'true'">false</BuildHelixPayload>
</PropertyGroup> </PropertyGroup>
</Target> </Target>
<Target Name="_PublishHelixArchive" DependsOnTargets="Publish" > <Target Name="_PublishHelixArchive" DependsOnTargets="Publish" >
@ -78,8 +78,8 @@ Usage: dotnet msbuild /t:Helix src/MyTestProject.csproj
<TestAssembly>$(TargetFileName)</TestAssembly> <TestAssembly>$(TargetFileName)</TestAssembly>
<PreCommands>@(HelixPreCommand)</PreCommands> <PreCommands>@(HelixPreCommand)</PreCommands>
<PostCommands>@(HelixPostCommand)</PostCommands> <PostCommands>@(HelixPostCommand)</PostCommands>
<Command Condition="$(IsWindowsHelixQueue)">call runtests.cmd $(TargetFileName) $(TargetFrameworkIdentifier) $(NETCoreSdkVersion) $(MicrosoftNETCoreAppRuntimeVersion) $(_HelixFriendlyNameTargetQueue)</Command> <Command Condition="$(IsWindowsHelixQueue)">call runtests.cmd $(TargetFileName) $(TargetFrameworkIdentifier) $(NETCoreSdkVersion) $(MicrosoftNETCoreAppRuntimeVersion) $(_HelixFriendlyNameTargetQueue) $(TargetArchitecture)</Command>
<Command Condition="!$(IsWindowsHelixQueue)">./runtests.sh $(TargetFileName) $(NETCoreSdkVersion) $(MicrosoftNETCoreAppRuntimeVersion) $(_HelixFriendlyNameTargetQueue)</Command> <Command Condition="!$(IsWindowsHelixQueue)">./runtests.sh $(TargetFileName) $(NETCoreSdkVersion) $(MicrosoftNETCoreAppRuntimeVersion) $(_HelixFriendlyNameTargetQueue) $(TargetArchitecture)</Command>
<Timeout>$(HelixTimeout)</Timeout> <Timeout>$(HelixTimeout)</Timeout>
</HelixWorkItem> </HelixWorkItem>
</ItemGroup> </ItemGroup>

View File

@ -13,6 +13,11 @@
<_BackupPackageJson>$(IntermediateOutputPath)$(MSBuildProjectName).package.json.bak</_BackupPackageJson> <_BackupPackageJson>$(IntermediateOutputPath)$(MSBuildProjectName).package.json.bak</_BackupPackageJson>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<TSFiles Include="$(MSBuildProjectDirectory)\*\*.ts" />
<TSFiles Include="$(MSBuildProjectDirectory)\package.json" />
</ItemGroup>
<Target Name="_CheckForInvalidConfiguration"> <Target Name="_CheckForInvalidConfiguration">
<Error Text="Missing expected property: PackageId" Condition="'$(IsPackable)' != 'false' and '$(PackageId)' == ''" /> <Error Text="Missing expected property: PackageId" Condition="'$(IsPackable)' != 'false' and '$(PackageId)' == ''" />
</Target> </Target>
@ -31,8 +36,14 @@
BuildInParallel="true" /> BuildInParallel="true" />
</Target> </Target>
<Target Name="Build" DependsOnTargets="PrepareForBuild;ResolveProjectReferences"> <Target Name="Build" DependsOnTargets="PrepareForBuild;ResolveProjectReferences;_Build" />
<Yarn Command="run build" Condition="'$(IsBuildable)' != 'false'" StandardOutputImportance="High" StandardErrorImportance="High" />
<Target Name="_Build"
Condition="'$(IsBuildable)' != 'false'"
Inputs="@(TSFiles)"
Outputs="$(BaseIntermediateOutputPath)\build-sentinel" >
<Yarn Command="run build" StandardOutputImportance="High" StandardErrorImportance="High" />
<WriteLinesToFile Overwrite="true" File="$(BaseIntermediateOutputPath)\build-sentinel" />
</Target> </Target>
<PropertyGroup> <PropertyGroup>

View File

@ -14,6 +14,7 @@
<_ProjectPathWithVersion Include="$(MSBuildProjectFullPath)"> <_ProjectPathWithVersion Include="$(MSBuildProjectFullPath)">
<PackageId>$(PackageId)</PackageId> <PackageId>$(PackageId)</PackageId>
<PackageVersion>$(PackageVersion)</PackageVersion> <PackageVersion>$(PackageVersion)</PackageVersion>
<VersionSuffix>$(VersionSuffix)</VersionSuffix>
<VersionVariableName>$(PackageId.Replace('.',''))PackageVersion</VersionVariableName> <VersionVariableName>$(PackageId.Replace('.',''))PackageVersion</VersionVariableName>
</_ProjectPathWithVersion> </_ProjectPathWithVersion>
</ItemGroup> </ItemGroup>

View File

@ -76,10 +76,6 @@
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>
<ProjectListFile>$(MSBuildThisFileDirectory)..\eng\ProjectReferences.props</ProjectListFile>
<RefsTargetFramework>$(TargetFrameworks)</RefsTargetFramework>
<RefsTargetFramework Condition="'$(RefsTargetFramework)' == ''">$(TargetFramework)</RefsTargetFramework>
<ReferencesContent> <ReferencesContent>
<![CDATA[ <![CDATA[
<ItemGroup Condition="'%24(TargetFramework)' == '$(TargetFramework)'"> <ItemGroup Condition="'%24(TargetFramework)' == '$(TargetFramework)'">

View File

@ -23,6 +23,10 @@ namespace RepoTasks
[Required] [Required]
public string TargetFile { get; set; } public string TargetFile { get; set; }
public string ManagedRoot { get; set; } = "";
public string NativeRoot { get; set; } = "";
/// <summary> /// <summary>
/// Extra attributes to place on the root node. /// Extra attributes to place on the root node.
/// ///
@ -46,7 +50,6 @@ namespace RepoTasks
{ {
Item = item, Item = item,
Filename = Path.GetFileName(item.ItemSpec), Filename = Path.GetFileName(item.ItemSpec),
TargetPath = item.GetMetadata("TargetPath"),
AssemblyName = FileUtilities.GetAssemblyName(item.ItemSpec), AssemblyName = FileUtilities.GetAssemblyName(item.ItemSpec),
FileVersion = FileUtilities.GetFileVersion(item.ItemSpec), FileVersion = FileUtilities.GetFileVersion(item.ItemSpec),
IsNative = item.GetMetadata("IsNativeImage") == "true", IsNative = item.GetMetadata("IsNativeImage") == "true",
@ -55,15 +58,14 @@ namespace RepoTasks
.Where(f => .Where(f =>
!f.IsSymbolFile && !f.IsSymbolFile &&
(f.Filename.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) || f.IsNative)) (f.Filename.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) || f.IsNative))
.OrderBy(f => f.TargetPath, StringComparer.Ordinal) .OrderBy(f => f.Filename, StringComparer.Ordinal))
.ThenBy(f => f.Filename, StringComparer.Ordinal))
{ {
var element = new XElement( var element = new XElement(
"File", "File",
new XAttribute("Type", f.IsNative ? "Native" : "Managed"), new XAttribute("Type", f.IsNative ? "Native" : "Managed"),
new XAttribute( new XAttribute(
"Path", "Path",
Path.Combine(f.TargetPath, f.Filename).Replace('\\', '/'))); Path.Combine(f.IsNative ? NativeRoot : ManagedRoot, f.Filename).Replace('\\', '/')));
if (f.AssemblyName != null) if (f.AssemblyName != null)
{ {

View File

@ -1,9 +1,9 @@
{ {
"sdk": { "sdk": {
"version": "3.0.100-preview5-011568" "version": "3.0.100-preview6-012264"
}, },
"tools": { "tools": {
"dotnet": "3.0.100-preview5-011568", "dotnet": "3.0.100-preview6-012264",
"runtimes": { "runtimes": {
"dotnet/x64": [ "dotnet/x64": [
"$(MicrosoftNETCoreAppRuntimeVersion)" "$(MicrosoftNETCoreAppRuntimeVersion)"

View File

@ -284,8 +284,7 @@ namespace Microsoft.AspNetCore.Antiforgery.Internal
var ex = Assert.Throws<ArgumentNullException>( var ex = Assert.Throws<ArgumentNullException>(
() => tokenProvider.TryValidateTokenSet(httpContext, null, fieldtoken, out message)); () => tokenProvider.TryValidateTokenSet(httpContext, null, fieldtoken, out message));
var trimmed = ex.Message.Substring(0, ex.Message.IndexOf(Environment.NewLine)); Assert.StartsWith(@"The required antiforgery cookie token must be provided.", ex.Message);
Assert.Equal(@"The required antiforgery cookie token must be provided.", trimmed);
} }
[Fact] [Fact]
@ -307,8 +306,7 @@ namespace Microsoft.AspNetCore.Antiforgery.Internal
var ex = Assert.Throws<ArgumentNullException>( var ex = Assert.Throws<ArgumentNullException>(
() => tokenProvider.TryValidateTokenSet(httpContext, cookieToken, null, out message)); () => tokenProvider.TryValidateTokenSet(httpContext, cookieToken, null, out message));
var trimmed = ex.Message.Substring(0, ex.Message.IndexOf(Environment.NewLine)); Assert.StartsWith("The required antiforgery request token must be provided.", ex.Message);
Assert.Equal("The required antiforgery request token must be provided.", trimmed);
} }
[Fact] [Fact]

View File

@ -2,6 +2,8 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
<!-- Test asset publishing not working on arm64 https://github.com/aspnet/AspNetCore/issues/11205 -->
<SkipHelixArm>true</SkipHelixArm>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -69,7 +69,7 @@ namespace Microsoft.AspNetCore.Blazor.Http
"Blazor._internal.http.sendAsync", "Blazor._internal.http.sendAsync",
id, id,
request.Content == null ? null : await request.Content.ReadAsByteArrayAsync(), request.Content == null ? null : await request.Content.ReadAsByteArrayAsync(),
JsonSerializer.ToString(options, JsonSerializerOptionsProvider.Options)); JsonSerializer.Serialize(options, JsonSerializerOptionsProvider.Options));
return await tcs.Task; return await tcs.Task;
} }
@ -100,7 +100,7 @@ namespace Microsoft.AspNetCore.Blazor.Http
} }
else else
{ {
var responseDescriptor = JsonSerializer.Parse<ResponseDescriptor>(responseDescriptorJson, JsonSerializerOptionsProvider.Options); var responseDescriptor = JsonSerializer.Deserialize<ResponseDescriptor>(responseDescriptorJson, JsonSerializerOptionsProvider.Options);
var responseContent = responseBodyData == null ? null : new ByteArrayContent(responseBodyData); var responseContent = responseBodyData == null ? null : new ByteArrayContent(responseBodyData);
var responseMessage = responseDescriptor.ToResponseMessage(responseContent); var responseMessage = responseDescriptor.ToResponseMessage(responseContent);
tcs.SetResult(responseMessage); tcs.SetResult(responseMessage);

View File

@ -41,7 +41,7 @@ namespace Microsoft.AspNetCore.Blazor.Build
assemblyReferences, assemblyReferences,
embeddedContent, embeddedContent,
linkerEnabled); linkerEnabled);
return JsonSerializer.ToString(data, JsonSerializerOptionsProvider.Options); return JsonSerializer.Serialize(data, JsonSerializerOptionsProvider.Options);
} }
private static string GetAssemblyEntryPoint(string assemblyPath) private static string GetAssemblyEntryPoint(string assemblyPath)

View File

@ -28,7 +28,7 @@
<PropertyGroup> <PropertyGroup>
<RunCommand>dotnet</RunCommand> <RunCommand>dotnet</RunCommand>
<_BlazorCliLocation>$(MSBuildThisFileDirectory)../../DevServer/src/bin/$(Configuration)/netcoreapp3.0/blazor-devserver.dll</_BlazorCliLocation> <_BlazorCliLocation>$(MSBuildThisFileDirectory)../../DevServer/src/bin/$(Configuration)/netcoreapp3.0/blazor-devserver.dll</_BlazorCliLocation>
<RunArguments>exec &quot;$(_BlazorCliLocation)&quot; serve &quot;$(MSBuildProjectDirectory)/$(OutputPath)$(TargetFileName)&quot; $(AdditionalRunArguments)</RunArguments> <RunArguments>exec &quot;$(_BlazorCliLocation)&quot; serve --applicationpath &quot;$(MSBuildProjectDirectory)/$(OutputPath)$(TargetFileName)&quot; $(AdditionalRunArguments)</RunArguments>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

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 System;
using System.IO;
using System.Runtime.Versioning;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.CommandLineUtils; using Microsoft.Extensions.CommandLineUtils;
using Microsoft.Extensions.Hosting;
namespace Microsoft.AspNetCore.Blazor.DevServer.Commands namespace Microsoft.AspNetCore.Blazor.DevServer.Commands
{ {
@ -23,28 +21,11 @@ namespace Microsoft.AspNetCore.Blazor.DevServer.Commands
HelpOption("-?|-h|--help"); HelpOption("-?|-h|--help");
ApplicationPath = new CommandArgument()
{
Description = "Path to the client application dll",
MultipleValues = false,
Name = "<PATH>",
ShowInHelpText = true
};
Arguments.Add(ApplicationPath);
OnExecute(Execute); OnExecute(Execute);
} }
public CommandArgument ApplicationPath { get; private set; }
private int Execute() private int Execute()
{ {
if (string.IsNullOrWhiteSpace(ApplicationPath.Value))
{
throw new InvalidOperationException($"Invalid value for parameter '{nameof(ApplicationPath)}'. Value supplied: '{ApplicationPath.Value}'");
}
Server.Startup.ApplicationAssembly = ApplicationPath.Value;
Server.Program.BuildWebHost(RemainingArguments.ToArray()).Run(); Server.Program.BuildWebHost(RemainingArguments.ToArray()).Run();
return 0; return 0;
} }

View File

@ -19,6 +19,7 @@
<Reference Include="Microsoft.AspNetCore.ResponseCompression" /> <Reference Include="Microsoft.AspNetCore.ResponseCompression" />
<Reference Include="Microsoft.AspNetCore" /> <Reference Include="Microsoft.AspNetCore" />
<Reference Include="Microsoft.Extensions.CommandLineUtils.Sources" /> <Reference Include="Microsoft.Extensions.CommandLineUtils.Sources" />
<Reference Include="Microsoft.Extensions.Hosting" />
</ItemGroup> </ItemGroup>
<!-- Pack settings --> <!-- Pack settings -->

View File

@ -1,8 +1,15 @@
// 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.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
namespace Microsoft.AspNetCore.Blazor.DevServer.Server namespace Microsoft.AspNetCore.Blazor.DevServer.Server
{ {
@ -18,12 +25,24 @@ namespace Microsoft.AspNetCore.Blazor.DevServer.Server
/// <summary> /// <summary>
/// Intended for framework test use only. /// Intended for framework test use only.
/// </summary> /// </summary>
public static IWebHost BuildWebHost(string[] args) => public static IHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args) Host.CreateDefaultBuilder(args)
.UseConfiguration(new ConfigurationBuilder() .ConfigureHostConfiguration(cb => {
.AddCommandLine(args) var applicationPath = args.SkipWhile(a => a != "--applicationpath").Skip(1).FirstOrDefault();
.Build()) var name = Path.ChangeExtension(applicationPath,".StaticWebAssets.xml");
.UseStartup<Startup>()
.Build(); if (name != null)
{
cb.AddInMemoryCollection(new Dictionary<string, string>
{
[WebHostDefaults.StaticWebAssetsKey] = name
});
}
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStaticWebAssets();
webBuilder.UseStartup<Startup>();
}).Build();
} }
} }

View File

@ -17,7 +17,12 @@ namespace Microsoft.AspNetCore.Blazor.DevServer.Server
{ {
internal class Startup internal class Startup
{ {
public static string ApplicationAssembly { get; set; } public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services)
{ {
@ -35,7 +40,7 @@ namespace Microsoft.AspNetCore.Blazor.DevServer.Server
public void Configure(IApplicationBuilder app, IWebHostEnvironment environment, IConfiguration configuration) public void Configure(IApplicationBuilder app, IWebHostEnvironment environment, IConfiguration configuration)
{ {
var applicationAssemblyFullPath = ResolveApplicationAssemblyFullPath(environment); var applicationAssemblyFullPath = ResolveApplicationAssemblyFullPath();
app.UseDeveloperExceptionPage(); app.UseDeveloperExceptionPage();
app.UseResponseCompression(); app.UseResponseCompression();
@ -54,15 +59,22 @@ namespace Microsoft.AspNetCore.Blazor.DevServer.Server
}); });
} }
private static string ResolveApplicationAssemblyFullPath(IWebHostEnvironment environment) private string ResolveApplicationAssemblyFullPath()
{ {
var applicationAssemblyFullPath = Path.Combine(environment.ContentRootPath, ApplicationAssembly); const string applicationPathKey = "applicationpath";
if (!File.Exists(applicationAssemblyFullPath)) var configuredApplicationPath = Configuration.GetValue<string>(applicationPathKey);
if (string.IsNullOrEmpty(configuredApplicationPath))
{ {
throw new InvalidOperationException($"Application assembly not found at {applicationAssemblyFullPath}."); throw new InvalidOperationException($"No value was supplied for the required option '{applicationPathKey}'.");
} }
return applicationAssemblyFullPath; var resolvedApplicationPath = Path.GetFullPath(configuredApplicationPath);
if (!File.Exists(resolvedApplicationPath))
{
throw new InvalidOperationException($"Application assembly not found at {resolvedApplicationPath}.");
}
return resolvedApplicationPath;
} }
private static void EnableConfiguredPathbase(IApplicationBuilder app, IConfiguration configuration) private static void EnableConfiguredPathbase(IApplicationBuilder app, IConfiguration configuration)

View File

@ -2,6 +2,6 @@
<PropertyGroup> <PropertyGroup>
<_BlazorDevServerDll>$(MSBuildThisFileDirectory)../tools/blazor-devserver.dll</_BlazorDevServerDll> <_BlazorDevServerDll>$(MSBuildThisFileDirectory)../tools/blazor-devserver.dll</_BlazorDevServerDll>
<RunCommand>dotnet</RunCommand> <RunCommand>dotnet</RunCommand>
<RunArguments>&quot;$(_BlazorDevServerDll)&quot; serve &quot;$(MSBuildProjectDirectory)/$(OutputPath)$(TargetFileName)&quot;</RunArguments> <RunArguments>&quot;$(_BlazorDevServerDll)&quot; serve --applicationpath &quot;$(MSBuildProjectDirectory)/$(OutputPath)$(TargetFileName)&quot;</RunArguments>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View File

@ -2,7 +2,6 @@
"$schema": "http://json.schemastore.org/vs-2017.3.host", "$schema": "http://json.schemastore.org/vs-2017.3.host",
"name": { "name": {
"text": "Blazor (ASP.NET Core hosted)", "text": "Blazor (ASP.NET Core hosted)",
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
"id": "1050" "id": "1050"
}, },
"description": { "description": {

View File

@ -4,7 +4,7 @@
<p>Current count: @currentCount</p> <p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="@IncrementCount">Click me</button> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code { @code {
int currentCount = 0; int currentCount = 0;

View File

@ -40,6 +40,6 @@ else
protected override async Task OnInitAsync() protected override async Task OnInitAsync()
{ {
forecasts = await Http.GetJsonAsync<WeatherForecast[]>("api/SampleData/WeatherForecasts"); forecasts = await Http.GetJsonAsync<WeatherForecast[]>("weatherforecast");
} }
} }

View File

@ -1,11 +1,11 @@
<div class="top-row pl-4 navbar navbar-dark"> <div class="top-row pl-4 navbar navbar-dark">
<a class="navbar-brand" href="">BlazorHosted-CSharp</a> <a class="navbar-brand" href="">BlazorHosted-CSharp</a>
<button class="navbar-toggler" @onclick="@ToggleNavMenu"> <button class="navbar-toggler" @onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
</div> </div>
<div class="@NavMenuCssClass" @onclick="@ToggleNavMenu"> <div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
<ul class="nav flex-column"> <ul class="nav flex-column">
<li class="nav-item px-3"> <li class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All"> <NavLink class="nav-link" href="" Match="NavLinkMatch.All">

View File

@ -4,7 +4,7 @@
<span class="text-nowrap"> <span class="text-nowrap">
Please take our Please take our
<a target="_blank" class="font-weight-bold" href="https://go.microsoft.com/fwlink/?linkid=2093904">brief survey</a> <a target="_blank" class="font-weight-bold" href="https://go.microsoft.com/fwlink/?linkid=2098127">brief survey</a>
</span> </span>
and tell us what you think. and tell us what you think.
</div> </div>

View File

@ -1,22 +1,31 @@
using BlazorHosted_CSharp.Shared; using BlazorHosted_CSharp.Shared;
using Microsoft.AspNetCore.Mvc;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace BlazorHosted_CSharp.Server.Controllers namespace BlazorHosted_CSharp.Server.Controllers
{ {
[Route("api/[controller]")] [ApiController]
public class SampleDataController : Controller [Route("[controller]")]
public class WeatherForecastController : ControllerBase
{ {
private static string[] Summaries = new[] private static readonly string[] Summaries = new[]
{ {
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
}; };
[HttpGet("[action]")] private readonly ILogger<WeatherForecastController> logger;
public IEnumerable<WeatherForecast> WeatherForecasts()
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
this.logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{ {
var rng = new Random(); var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast return Enumerable.Range(1, 5).Select(index => new WeatherForecast
@ -24,7 +33,8 @@ namespace BlazorHosted_CSharp.Server.Controllers
Date = DateTime.Now.AddDays(index), Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55), TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)] Summary = Summaries[rng.Next(Summaries.Length)]
}); })
.ToArray();
} }
} }
} }

View File

@ -2,7 +2,6 @@
"$schema": "http://json.schemastore.org/vs-2017.3.host", "$schema": "http://json.schemastore.org/vs-2017.3.host",
"name": { "name": {
"text": "Blazor (client-side)", "text": "Blazor (client-side)",
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
"id": "1050" "id": "1050"
}, },
"description": { "description": {

View File

@ -4,7 +4,7 @@
<p>Current count: @currentCount</p> <p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="@IncrementCount">Click me</button> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code { @code {
int currentCount = 0; int currentCount = 0;

View File

@ -1,11 +1,11 @@
<div class="top-row pl-4 navbar navbar-dark"> <div class="top-row pl-4 navbar navbar-dark">
<a class="navbar-brand" href="">BlazorStandalone-CSharp</a> <a class="navbar-brand" href="">BlazorStandalone-CSharp</a>
<button class="navbar-toggler" @onclick="@ToggleNavMenu"> <button class="navbar-toggler" @onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
</div> </div>
<div class="@NavMenuCssClass" @onclick="@ToggleNavMenu"> <div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
<ul class="nav flex-column"> <ul class="nav flex-column">
<li class="nav-item px-3"> <li class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All"> <NavLink class="nav-link" href="" Match="NavLinkMatch.All">

View File

@ -4,7 +4,7 @@
<span class="text-nowrap"> <span class="text-nowrap">
Please take our Please take our
<a target="_blank" class="font-weight-bold" href="https://go.microsoft.com/fwlink/?linkid=2093904">brief survey</a> <a target="_blank" class="font-weight-bold" href="https://go.microsoft.com/fwlink/?linkid=2098127">brief survey</a>
</span> </span>
and tell us what you think. and tell us what you think.
</div> </div>

View File

@ -9,10 +9,10 @@
<button id="serialize-small" @onclick=SerializeSmall>Serialize (small)</button> <button id="serialize-small" @onclick=SerializeSmall>Serialize (small)</button>
<button id="serialize-large" @onclick=SerializeLarge>Serialize (large)</button> <button id="serialize-large" @onclick=SerializeLarge>Serialize (large)</button>
<p><pre style="border: 1px solid black; overflow: scroll;">serializedValue</pre></p> <p><pre style="border: 1px solid black; overflow: scroll;">@serializedValue</pre></p>
@if (serializedValue != null) @if (serializedValue != null)
{ {
<p>Serialized length: <strong id="serialized-length">serializedValue.Length</strong> chars</p> <p>Serialized length: <strong id="serialized-length">@serializedValue.Length</strong> chars</p>
} }
<button id="deserialize-small" @onclick=DeserializeSmall>Deserialize (small)</button> <button id="deserialize-small" @onclick=DeserializeSmall>Deserialize (small)</button>
@ -33,8 +33,8 @@
protected override void OnInit() protected override void OnInit()
{ {
smallOrgChartJson = JsonSerializer.ToString(smallOrgChart); smallOrgChartJson = JsonSerializer.Serialize(smallOrgChart);
largeOrgChartJson = JsonSerializer.ToString(largeOrgChart); largeOrgChartJson = JsonSerializer.Serialize(largeOrgChart);
} }
protected override void OnAfterRender() protected override void OnAfterRender()
@ -51,10 +51,10 @@
} }
void SerializeSmall() void SerializeSmall()
=> serializedValue = JsonSerializer.ToString(smallOrgChart); => serializedValue = JsonSerializer.Serialize(smallOrgChart);
void SerializeLarge() void SerializeLarge()
=> serializedValue = JsonSerializer.ToString(largeOrgChart); => serializedValue = JsonSerializer.Serialize(largeOrgChart);
void DeserializeSmall() void DeserializeSmall()
=> numPeopleDeserialized = Deserialize(smallOrgChartJson); => numPeopleDeserialized = Deserialize(smallOrgChartJson);
@ -81,7 +81,7 @@
static int Deserialize(string json) static int Deserialize(string json)
{ {
var ceo = JsonSerializer.Parse<Person>(json); var ceo = JsonSerializer.Deserialize<Person>(json);
return CountPeople(ceo); return CountPeople(ceo);
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -238,6 +238,17 @@ export class BrowserRenderer {
break; break;
} }
} }
// We handle setting 'value' on a <select> in two different ways:
// [1] When inserting a corresponding <option>, in case you're dynamically adding options
// [2] After we finish inserting the <select>, in case the descendant options are being
// added as an opaque markup block rather than individually
// Right here we implement [2]
if (newDomElementRaw instanceof HTMLSelectElement && selectValuePropname in newDomElementRaw) {
const selectValue = newDomElementRaw[selectValuePropname];
newDomElementRaw.value = selectValue;
delete newDomElementRaw[selectValuePropname];
}
} }
private insertComponent(batch: RenderBatch, parent: LogicalElement, childIndex: number, frame: RenderTreeFrame) { private insertComponent(batch: RenderBatch, parent: LogicalElement, childIndex: number, frame: RenderTreeFrame) {
@ -317,7 +328,8 @@ export class BrowserRenderer {
// <select> is special, in that anything we write to .value will be lost if there // <select> is special, in that anything we write to .value will be lost if there
// isn't yet a matching <option>. To maintain the expected behavior no matter the // isn't yet a matching <option>. To maintain the expected behavior no matter the
// element insertion/update order, preserve the desired value separately so // element insertion/update order, preserve the desired value separately so
// we can recover it when inserting any matching <option>. // we can recover it when inserting any matching <option> or after inserting an
// entire markup block of descendants.
element[selectValuePropname] = value; element[selectValuePropname] = value;
} }
return true; return true;
@ -330,10 +342,11 @@ export class BrowserRenderer {
element.removeAttribute('value'); element.removeAttribute('value');
} }
// See above for why we have this special handling for <select>/<option> // See above for why we have this special handling for <select>/<option>
const parentElement = element.parentElement; // Note that this is only one of the two cases where we set the value on a <select>
if (parentElement && (selectValuePropname in parentElement) && parentElement[selectValuePropname] === value) { const selectElem = this.findClosestAncestorSelectElement(element);
this.tryApplyValueProperty(batch, parentElement, attributeFrame); if (selectElem && (selectValuePropname in selectElem) && selectElem[selectValuePropname] === value) {
delete parentElement[selectValuePropname]; this.tryApplyValueProperty(batch, selectElem, attributeFrame);
delete selectElem[selectValuePropname];
} }
return true; return true;
} }
@ -353,6 +366,18 @@ export class BrowserRenderer {
} }
} }
private findClosestAncestorSelectElement(element: Element | null) {
while (element) {
if (element instanceof HTMLSelectElement) {
return element;
} else {
element = element.parentElement;
}
}
return null;
}
private insertFrameRange(batch: RenderBatch, componentId: number, parent: LogicalElement, childIndex: number, frames: ArrayValues<RenderTreeFrame>, startIndex: number, endIndexExcl: number): number { private insertFrameRange(batch: RenderBatch, componentId: number, parent: LogicalElement, childIndex: number, frames: ArrayValues<RenderTreeFrame>, startIndex: number, endIndexExcl: number): number {
const origChildIndex = childIndex; const origChildIndex = childIndex;
for (let index = startIndex; index < endIndexExcl; index++) { for (let index = startIndex; index < endIndexExcl; index++) {

View File

@ -144,6 +144,10 @@
resolved "https://dotnet.myget.org/F/aspnetcore-dev/npm/@dotnet/jsinterop/-/@dotnet/jsinterop-3.0.0-preview6.19280.1.tgz#4c991132f33157de93bc3b6db93cffc9e964b241" resolved "https://dotnet.myget.org/F/aspnetcore-dev/npm/@dotnet/jsinterop/-/@dotnet/jsinterop-3.0.0-preview6.19280.1.tgz#4c991132f33157de93bc3b6db93cffc9e964b241"
integrity sha1-TJkRMvMxV96TvDttuTz/yelkskE= integrity sha1-TJkRMvMxV96TvDttuTz/yelkskE=
"@microsoft/signalr@link:../../SignalR/clients/ts/signalr":
version "0.0.0"
uid ""
"@types/emscripten@0.0.31": "@types/emscripten@0.0.31":
version "0.0.31" version "0.0.31"
resolved "https://registry.yarnpkg.com/@types/emscripten/-/emscripten-0.0.31.tgz#160817d1324e8b7049604d39ac47d85eeeedd597" resolved "https://registry.yarnpkg.com/@types/emscripten/-/emscripten-0.0.31.tgz#160817d1324e8b7049604d39ac47d85eeeedd597"

View File

@ -36,10 +36,10 @@ namespace Microsoft.AspNetCore.Components.Browser
{ {
if (fieldInfo.FieldValue is JsonElement attributeValueJsonElement) if (fieldInfo.FieldValue is JsonElement attributeValueJsonElement)
{ {
switch (attributeValueJsonElement.Type) switch (attributeValueJsonElement.ValueKind)
{ {
case JsonValueType.True: case JsonValueKind.True:
case JsonValueType.False: case JsonValueKind.False:
fieldInfo.FieldValue = attributeValueJsonElement.GetBoolean(); fieldInfo.FieldValue = attributeValueJsonElement.GetBoolean();
break; break;
default: default:
@ -90,23 +90,23 @@ namespace Microsoft.AspNetCore.Components.Browser
private static T Deserialize<T>(string eventArgsJson) private static T Deserialize<T>(string eventArgsJson)
{ {
return JsonSerializer.Parse<T>(eventArgsJson, JsonSerializerOptionsProvider.Options); return JsonSerializer.Deserialize<T>(eventArgsJson, JsonSerializerOptionsProvider.Options);
} }
private static UIChangeEventArgs DeserializeUIEventChangeArgs(string eventArgsJson) private static UIChangeEventArgs DeserializeUIEventChangeArgs(string eventArgsJson)
{ {
var changeArgs = Deserialize<UIChangeEventArgs>(eventArgsJson); var changeArgs = Deserialize<UIChangeEventArgs>(eventArgsJson);
var jsonElement = (JsonElement)changeArgs.Value; var jsonElement = (JsonElement)changeArgs.Value;
switch (jsonElement.Type) switch (jsonElement.ValueKind)
{ {
case JsonValueType.Null: case JsonValueKind.Null:
changeArgs.Value = null; changeArgs.Value = null;
break; break;
case JsonValueType.String: case JsonValueKind.String:
changeArgs.Value = jsonElement.GetString(); changeArgs.Value = jsonElement.GetString();
break; break;
case JsonValueType.True: case JsonValueKind.True:
case JsonValueType.False: case JsonValueKind.False:
changeArgs.Value = jsonElement.GetBoolean(); changeArgs.Value = jsonElement.GetBoolean();
break; break;
default: default:

View File

@ -102,6 +102,21 @@ namespace Microsoft.AspNetCore.Components
public void Configure(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { } public void Configure(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { }
public System.Threading.Tasks.Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterCollection parameters) { throw null; } public System.Threading.Tasks.Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterCollection parameters) { throw null; }
} }
public partial class PageDisplay : Microsoft.AspNetCore.Components.IComponent
{
public PageDisplay() { }
[Microsoft.AspNetCore.Components.ParameterAttribute]
public Microsoft.AspNetCore.Components.RenderFragment AuthorizingContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }}
[Microsoft.AspNetCore.Components.ParameterAttribute]
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.AuthenticationState> NotAuthorizedContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }}
[Microsoft.AspNetCore.Components.ParameterAttribute]
public System.Type Page { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }}
[Microsoft.AspNetCore.Components.ParameterAttribute]
public System.Collections.Generic.IDictionary<string, object> PageParameters { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }}
public void Configure(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { }
public System.Threading.Tasks.Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterCollection parameters) { throw null; }
}
} }
namespace Microsoft.AspNetCore.Components.Forms namespace Microsoft.AspNetCore.Components.Forms
@ -231,24 +246,6 @@ namespace Microsoft.AspNetCore.Components.Forms
} }
} }
namespace Microsoft.AspNetCore.Components.Layouts
{
public partial class PageDisplay : Microsoft.AspNetCore.Components.IComponent
{
public PageDisplay() { }
[Microsoft.AspNetCore.Components.ParameterAttribute]
public Microsoft.AspNetCore.Components.RenderFragment AuthorizingContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }}
[Microsoft.AspNetCore.Components.ParameterAttribute]
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.AuthenticationState> NotAuthorizedContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }}
[Microsoft.AspNetCore.Components.ParameterAttribute]
public System.Type Page { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }}
[Microsoft.AspNetCore.Components.ParameterAttribute]
public System.Collections.Generic.IDictionary<string, object> PageParameters { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }}
public void Configure(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { }
public System.Threading.Tasks.Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterCollection parameters) { throw null; }
}
}
namespace Microsoft.AspNetCore.Components.Routing namespace Microsoft.AspNetCore.Components.Routing
{ {
public partial class NavLink : Microsoft.AspNetCore.Components.IComponent, System.IDisposable public partial class NavLink : Microsoft.AspNetCore.Components.IComponent, System.IDisposable
@ -270,7 +267,9 @@ namespace Microsoft.AspNetCore.Components.Routing
public System.Reflection.Assembly AppAssembly { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }} public System.Reflection.Assembly AppAssembly { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }}
[Microsoft.AspNetCore.Components.ParameterAttribute] [Microsoft.AspNetCore.Components.ParameterAttribute]
public Microsoft.AspNetCore.Components.RenderFragment NotFoundContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }} public Microsoft.AspNetCore.Components.RenderFragment NotFoundContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }}
[Microsoft.AspNetCore.Components.ParameterAttribute]
public Microsoft.AspNetCore.Components.RenderFragment<AuthenticationState> NotAuthorizedContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }} public Microsoft.AspNetCore.Components.RenderFragment<AuthenticationState> NotAuthorizedContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }}
[Microsoft.AspNetCore.Components.ParameterAttribute]
public Microsoft.AspNetCore.Components.RenderFragment AuthorizingContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }} public Microsoft.AspNetCore.Components.RenderFragment AuthorizingContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } private set { throw null; }}
public void Configure(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { } public void Configure(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { }
public void Dispose() { } public void Dispose() { }

View File

@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Components
public static async Task<T> GetJsonAsync<T>(this HttpClient httpClient, string requestUri) public static async Task<T> GetJsonAsync<T>(this HttpClient httpClient, string requestUri)
{ {
var stringContent = await httpClient.GetStringAsync(requestUri); var stringContent = await httpClient.GetStringAsync(requestUri);
return JsonSerializer.Parse<T>(stringContent, JsonSerializerOptionsProvider.Options); return JsonSerializer.Deserialize<T>(stringContent, JsonSerializerOptionsProvider.Options);
} }
/// <summary> /// <summary>
@ -95,7 +95,7 @@ namespace Microsoft.AspNetCore.Components
/// <returns>The response parsed as an object of the generic type.</returns> /// <returns>The response parsed as an object of the generic type.</returns>
public static async Task<T> SendJsonAsync<T>(this HttpClient httpClient, HttpMethod method, string requestUri, object content) public static async Task<T> SendJsonAsync<T>(this HttpClient httpClient, HttpMethod method, string requestUri, object content)
{ {
var requestJson = JsonSerializer.ToString(content, JsonSerializerOptionsProvider.Options); var requestJson = JsonSerializer.Serialize(content, JsonSerializerOptionsProvider.Options);
var response = await httpClient.SendAsync(new HttpRequestMessage(method, requestUri) var response = await httpClient.SendAsync(new HttpRequestMessage(method, requestUri)
{ {
Content = new StringContent(requestJson, Encoding.UTF8, "application/json") Content = new StringContent(requestJson, Encoding.UTF8, "application/json")
@ -112,7 +112,7 @@ namespace Microsoft.AspNetCore.Components
else else
{ {
var stringContent = await response.Content.ReadAsStringAsync(); var stringContent = await response.Content.ReadAsStringAsync();
return JsonSerializer.Parse<T>(stringContent, JsonSerializerOptionsProvider.Options); return JsonSerializer.Deserialize<T>(stringContent, JsonSerializerOptionsProvider.Options);
} }
} }

View File

@ -75,7 +75,7 @@ namespace Microsoft.AspNetCore.Components.Test
{ {
Assert.Equal(httpMethod, req.Method); Assert.Equal(httpMethod, req.Method);
Assert.Equal(TestUri, req.RequestUri.AbsoluteUri); Assert.Equal(TestUri, req.RequestUri.AbsoluteUri);
Assert.Equal(JsonSerializer.ToString(requestContent, _jsonSerializerOptions), await ((StringContent)req.Content).ReadAsStringAsync()); Assert.Equal(JsonSerializer.Serialize(requestContent, _jsonSerializerOptions), await ((StringContent)req.Content).ReadAsStringAsync());
return CreateJsonResponse(HttpStatusCode.OK, new Person return CreateJsonResponse(HttpStatusCode.OK, new Person
{ {
Name = "Abc", Name = "Abc",
@ -151,7 +151,7 @@ namespace Microsoft.AspNetCore.Components.Test
{ {
Assert.Equal(httpMethod, req.Method); Assert.Equal(httpMethod, req.Method);
Assert.Equal(TestUri, req.RequestUri.AbsoluteUri); Assert.Equal(TestUri, req.RequestUri.AbsoluteUri);
Assert.Equal(JsonSerializer.ToString(requestContent, _jsonSerializerOptions), await ((StringContent)req.Content).ReadAsStringAsync()); Assert.Equal(JsonSerializer.Serialize(requestContent, _jsonSerializerOptions), await ((StringContent)req.Content).ReadAsStringAsync());
return new HttpResponseMessage(HttpStatusCode.BadGateway); return new HttpResponseMessage(HttpStatusCode.BadGateway);
})); }));
@ -165,7 +165,7 @@ namespace Microsoft.AspNetCore.Components.Test
{ {
return new HttpResponseMessage(statusCode) return new HttpResponseMessage(statusCode)
{ {
Content = new StringContent(JsonSerializer.ToString(content, _jsonSerializerOptions)) Content = new StringContent(JsonSerializer.Serialize(content, _jsonSerializerOptions))
}; };
} }

View File

@ -201,6 +201,10 @@ namespace Microsoft.AspNetCore.Components.Browser.Rendering
return; return;
} }
// Even though we're not on the renderer sync context here, it's safe to assume ordered execution of the following
// line (i.e., matching the order in which we received batch completion messages) based on the fact that SignalR
// synchronizes calls to hub methods. That is, it won't issue more than one call to this method from the same hub
// at the same time on different threads.
if (!PendingRenderBatches.TryDequeue(out var entry) || entry.BatchId != incomingBatchId) if (!PendingRenderBatches.TryDequeue(out var entry) || entry.BatchId != incomingBatchId)
{ {
HandleException( HandleException(

View File

@ -316,39 +316,6 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
Assert.False(registry.DisconnectedCircuits.TryGetValue(circuitHost.CircuitId, out _)); Assert.False(registry.DisconnectedCircuits.TryGetValue(circuitHost.CircuitId, out _));
} }
[Fact]
[Flaky("https://github.com/aspnet/AspNetCore-Internal/issues/2689", FlakyOn.All)]
public void CircuitRegistryUsesConfiguredMaxRetainedDisconnectedCircuitsValue()
{
// Arrange
var circuitIdFactory = TestCircuitIdFactory.CreateTestFactory();
var maxCircuits = 3;
var circuitOptions = new CircuitOptions
{
MaxRetainedDisconnectedCircuits = maxCircuits,
};
var registry = new TestCircuitRegistry(circuitIdFactory, circuitOptions);
var hosts = Enumerable.Range(0, maxCircuits + 2)
.Select(_ => TestCircuitHost.Create())
.ToArray();
// Act
for (var i = 0; i < hosts.Length; i++)
{
registry.RegisterDisconnectedCircuit(hosts[i]);
}
// Assert
for (var i = 0; i < maxCircuits; i++)
{
Assert.True(registry.DisconnectedCircuits.TryGetValue(hosts[i].CircuitId, out var _));
}
// Additional circuits do not get registered.
Assert.False(registry.DisconnectedCircuits.TryGetValue(hosts[maxCircuits].CircuitId, out var _));
Assert.False(registry.DisconnectedCircuits.TryGetValue(hosts[maxCircuits + 1].CircuitId, out var _));
}
[Fact] [Fact]
public async Task DisconnectedCircuitIsRemovedAfterConfiguredTimeout() public async Task DisconnectedCircuitIsRemovedAfterConfiguredTimeout()
{ {

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.Diagnostics;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -16,12 +17,7 @@ namespace Microsoft.AspNetCore.Components.Server.Tests
public void MapBlazorHub_WiresUp_UnderlyingHub() public void MapBlazorHub_WiresUp_UnderlyingHub()
{ {
// Arrange // Arrange
var applicationBuilder = new ApplicationBuilder( var applicationBuilder = CreateAppBuilder();
new ServiceCollection()
.AddLogging()
.AddSingleton(Mock.Of<IHostApplicationLifetime>())
.AddSignalR().Services
.AddServerSideBlazor().Services.BuildServiceProvider());
var called = false; var called = false;
// Act // Act
@ -40,12 +36,7 @@ namespace Microsoft.AspNetCore.Components.Server.Tests
public void MapBlazorHub_MostGeneralOverload_MapsUnderlyingHub() public void MapBlazorHub_MostGeneralOverload_MapsUnderlyingHub()
{ {
// Arrange // Arrange
var applicationBuilder = new ApplicationBuilder( var applicationBuilder = CreateAppBuilder();
new ServiceCollection()
.AddLogging()
.AddSingleton(Mock.Of<IHostApplicationLifetime>())
.AddSignalR().Services
.AddServerSideBlazor().Services.BuildServiceProvider());
var called = false; var called = false;
// Act // Act
@ -59,5 +50,23 @@ namespace Microsoft.AspNetCore.Components.Server.Tests
// Assert // Assert
Assert.True(called); Assert.True(called);
} }
private IApplicationBuilder CreateAppBuilder()
{
var services = new ServiceCollection();
services.AddSingleton(Mock.Of<IHostApplicationLifetime>());
services.AddLogging();
services.AddOptions();
var listener = new DiagnosticListener("Microsoft.AspNetCore");
services.AddSingleton(listener);
services.AddSingleton<DiagnosticSource>(listener);
services.AddRouting();
services.AddSignalR();
services.AddServerSideBlazor();
var serviceProvder = services.BuildServiceProvider();
return new ApplicationBuilder(serviceProvder);
}
} }
} }

View File

@ -1,3 +1,3 @@
@ECHO OFF @ECHO OFF
SET RepoRoot=%~dp0..\.. SET RepoRoot=%~dp0..\..
%RepoRoot%\build.cmd -projects %~dp0**\*.*proj %* %RepoRoot%\build.cmd -projects %~dp0**\*.*proj "/p:EnforceE2ETestPrerequisites=true" %*

View File

@ -4,4 +4,4 @@ set -euo pipefail
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
repo_root="$DIR/../.." repo_root="$DIR/../.."
"$repo_root/build.sh" --projects "$DIR/**/*.*proj" "$@" "$repo_root/build.sh" --projects "$DIR/**/*.*proj" "/p:EnforceE2ETestPrerequisites=true" "$@"

View File

@ -2,7 +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 Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using DevHostServerProgram = Microsoft.AspNetCore.Blazor.DevServer.Server.Program; using DevHostServerProgram = Microsoft.AspNetCore.Blazor.DevServer.Server.Program;
namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures
@ -22,7 +28,8 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures
{ {
"--urls", "http://127.0.0.1:0", "--urls", "http://127.0.0.1:0",
"--contentroot", ContentRoot, "--contentroot", ContentRoot,
"--pathbase", PathBase "--pathbase", PathBase,
"--applicationpath", typeof(TProgram).Assembly.Location,
}; };
if (!string.IsNullOrEmpty(Environment)) if (!string.IsNullOrEmpty(Environment))
@ -31,7 +38,29 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures
args.Add(Environment); args.Add(Environment);
} }
return DevHostServerProgram.BuildWebHost(args.ToArray()); return new FakeWebHost(DevHostServerProgram.BuildWebHost(args.ToArray()));
}
private class FakeWebHost : IWebHost
{
private readonly IHost _realHost;
public FakeWebHost(IHost realHost)
{
_realHost = realHost;
}
public IFeatureCollection ServerFeatures => ((IServer)_realHost.Services.GetService(typeof(IServer))).Features;
public IServiceProvider Services => _realHost.Services;
public void Dispose() => _realHost.Dispose();
public void Start() => _realHost.Start();
public Task StartAsync(CancellationToken cancellationToken = default) => _realHost.StartAsync();
public Task StopAsync(CancellationToken cancellationToken = default) => _realHost.StopAsync();
} }
} }
} }

View File

@ -7,10 +7,7 @@
<TargetFramework>netcoreapp3.0</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
<TestGroupName>Components.E2ETests</TestGroupName> <TestGroupName>Components.E2ETests</TestGroupName>
<!-- <SkipTests>true</SkipTests>
Temporarily disabled until this runs on macOS
-->
<SkipTests Condition="'$(SeleniumE2ETestsSupported)' != 'true'">true</SkipTests>
<!-- https://github.com/aspnet/AspNetCore/issues/6857 --> <!-- https://github.com/aspnet/AspNetCore/issues/6857 -->
<BuildHelixPayload>false</BuildHelixPayload> <BuildHelixPayload>false</BuildHelixPayload>

View File

@ -214,6 +214,19 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests
Assert.Equal("Fourth choice", target.SelectedOption.Text); Assert.Equal("Fourth choice", target.SelectedOption.Text);
} }
[Fact]
public void CanBindSelectToMarkup()
{
var target = new SelectElement(Browser.FindElement(By.Id("select-markup-box")));
var boundValue = Browser.FindElement(By.Id("select-markup-box-value"));
Assert.Equal("Second choice", target.SelectedOption.Text);
Assert.Equal("Second", boundValue.Text);
// Modify target; verify value is updated
target.SelectByText("Third choice");
Browser.Equal("Third", () => boundValue.Text);
}
[Fact] [Fact]
public void CanBindTextboxInt() public void CanBindTextboxInt()
{ {

View File

@ -276,8 +276,8 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests
{ {
var rootBefore = new Node(null, "root", before); var rootBefore = new Node(null, "root", before);
var rootAfter = new Node(null, "root", after); var rootAfter = new Node(null, "root", after);
var jsonBefore = JsonSerializer.ToString(rootBefore, TestJsonSerializerOptionsProvider.Options); var jsonBefore = JsonSerializer.Serialize(rootBefore, TestJsonSerializerOptionsProvider.Options);
var jsonAfter = JsonSerializer.ToString(rootAfter, TestJsonSerializerOptionsProvider.Options); var jsonAfter = JsonSerializer.Serialize(rootAfter, TestJsonSerializerOptionsProvider.Options);
var appElem = MountTestComponent<KeyCasesComponent>(); var appElem = MountTestComponent<KeyCasesComponent>();
var textbox = appElem.FindElement(By.TagName("textarea")); var textbox = appElem.FindElement(By.TagName("textarea"));
@ -329,7 +329,7 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests
{ {
var javascript = (IJavaScriptExecutor)Browser; var javascript = (IJavaScriptExecutor)Browser;
javascript.ExecuteScript( javascript.ExecuteScript(
$"document.getElementById('{textAreaElementWithId.GetAttribute("id")}').value = {JsonSerializer.ToString(value, TestJsonSerializerOptionsProvider.Options)}"); $"document.getElementById('{textAreaElementWithId.GetAttribute("id")}').value = {JsonSerializer.Serialize(value, TestJsonSerializerOptionsProvider.Options)}");
textAreaElementWithId.SendKeys(" "); // So it fires the change event textAreaElementWithId.SendKeys(" "); // So it fires the change event
} }

View File

@ -145,18 +145,32 @@
<h2>Select</h2> <h2>Select</h2>
<p> <p>
<select id="select-box" @bind="selectValue"> <select id="select-box" @bind="selectValue">
<option value=@SelectableValue.First>First choice</option> <optgroup label="Some choices"> <!-- Show it also works with optgroup -->
<option value=@SelectableValue.Second>Second choice</option> <option value=@SelectableValue.First>First choice</option>
<option value=@SelectableValue.Third>Third choice</option> <option value=@SelectableValue.Second>Second choice</option>
@if (includeFourthOption) <option value=@SelectableValue.Third>Third choice</option>
{ @if (includeFourthOption)
<option value=@SelectableValue.Fourth>Fourth choice</option> {
} <option value=@SelectableValue.Fourth>Fourth choice</option>
}
</optgroup>
</select> </select>
<span id="select-box-value">@selectValue</span> <span id="select-box-value">@selectValue</span>
<button id="select-box-add-option" @onclick="AddAndSelectNewSelectOption">Add and select new item</button> <button id="select-box-add-option" @onclick="AddAndSelectNewSelectOption">Add and select new item</button>
</p> </p>
<h2>Select (markup block)</h2>
<p>
<select id="select-markup-box" @bind="selectMarkupValue">
<optgroup label="Some choices">
<option value="First">First choice</option>
<option value="Second">Second choice</option>
<option value="Third">Third choice</option>
</optgroup>
</select>
<span id="select-markup-box-value">@selectMarkupValue</span>
</p>
@code { @code {
string textboxInitiallyBlankValue = null; string textboxInitiallyBlankValue = null;
string textboxInitiallyPopulatedValue = "Hello"; string textboxInitiallyPopulatedValue = "Hello";
@ -187,6 +201,7 @@ Guid textboxGenericGuidValue = Guid.Empty;
bool includeFourthOption = false; bool includeFourthOption = false;
enum SelectableValue { First, Second, Third, Fourth } enum SelectableValue { First, Second, Third, Fourth }
SelectableValue selectValue = SelectableValue.Second; SelectableValue selectValue = SelectableValue.Second;
SelectableValue selectMarkupValue = SelectableValue.Second;
void AddAndSelectNewSelectOption() void AddAndSelectNewSelectOption()
{ {

View File

@ -7,18 +7,12 @@
<div id="duplicate-on-element-override"> <div id="duplicate-on-element-override">
<DuplicateAttributesOnElementChildComponent <DuplicateAttributesOnElementChildComponent
BoolAttributeBefore="true"
StringAttributeBefore="original-text"
UnmatchedValues="@elementValues" UnmatchedValues="@elementValues"
BoolAttributeAfter="false" BoolAttributeAfter="false"
StringAttributeAfter="other-text" /> StringAttributeAfter="other-text" />
</div> </div>
@functions { @functions {
void SomeMethod()
{
}
Dictionary<string, object> elementValues = new Dictionary<string, object>() Dictionary<string, object> elementValues = new Dictionary<string, object>()
{ {
{ "bool", true }, { "bool", true },

View File

@ -1,37 +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.
using System.Collections.Generic;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.RenderTree;
namespace BasicTestApp
{
// Written in C# for flexibility and because we don't currently have the ability to write this in .razor.
public class DuplicateAttributesOnElementChildComponent : ComponentBase
{
[Parameter] public string StringAttributeBefore { get; private set; }
[Parameter] public bool BoolAttributeBefore { get; private set; }
[Parameter] public string StringAttributeAfter { get; private set; }
[Parameter] public bool? BoolAttributeAfter { get; private set; }
[Parameter(CaptureUnmatchedValues = true)] public Dictionary<string, object> UnmatchedValues { get; private set; }
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
builder.OpenElement(0, "div");
builder.AddAttribute(1, "string", StringAttributeBefore);
builder.AddAttribute(2, "bool", BoolAttributeBefore);
builder.AddMultipleAttributes(3, UnmatchedValues);
if (StringAttributeAfter != null)
{
builder.AddAttribute(4, "string", StringAttributeAfter);
}
if (BoolAttributeAfter != null)
{
builder.AddAttribute(5, "bool", BoolAttributeAfter);
}
builder.CloseElement();
}
}
}

View File

@ -0,0 +1,23 @@
@if (StringAttributeBefore != null)
{
<div string="@StringAttributeBefore"
bool="@BoolAttributeBefore"
@attributes="@UnmatchedValues">
</div>
}
else
{
<div @attributes="@UnmatchedValues"
string="@StringAttributeAfter"
bool="@BoolAttributeAfter">
</div>
}
@code {
[Parameter] public string StringAttributeBefore { get; private set; }
[Parameter] public bool BoolAttributeBefore { get; private set; }
[Parameter] public string StringAttributeAfter { get; private set; }
[Parameter] public bool? BoolAttributeAfter { get; private set; }
[Parameter(CaptureUnmatchedValues = true)] public Dictionary<string, object> UnmatchedValues { get; private set; }
}

View File

@ -91,7 +91,7 @@
var invocations = new Dictionary<string, string>(); var invocations = new Dictionary<string, string>();
foreach (var interopResult in JavaScriptInterop.Invocations) foreach (var interopResult in JavaScriptInterop.Invocations)
{ {
var interopResultValue = JsonSerializer.ToString(interopResult.Value, TestJsonSerializerOptionsProvider.Options); var interopResultValue = JsonSerializer.Serialize(interopResult.Value, TestJsonSerializerOptionsProvider.Options);
invocations[interopResult.Key] = interopResultValue; invocations[interopResult.Key] = interopResultValue;
} }

View File

@ -61,7 +61,7 @@
void Update() void Update()
{ {
renderContext.UpdateCount++; renderContext.UpdateCount++;
parsedRootNode = JsonSerializer.Parse<KeyCasesTreeNode.Node>(modelJson, TestJsonSerializerOptionsProvider.Options); parsedRootNode = JsonSerializer.Deserialize<KeyCasesTreeNode.Node>(modelJson, TestJsonSerializerOptionsProvider.Options);
} }
public class RenderContext public class RenderContext

View File

@ -13,7 +13,7 @@ Type here: <input @onkeypress=OnKeyPressed />
void OnKeyPressed(UIKeyboardEventArgs eventArgs) void OnKeyPressed(UIKeyboardEventArgs eventArgs)
{ {
Console.WriteLine(JsonSerializer.ToString(eventArgs)); Console.WriteLine(JsonSerializer.Serialize(eventArgs));
keysPressed.Add(eventArgs.Key); keysPressed.Add(eventArgs.Key);
} }
} }

View File

@ -93,7 +93,7 @@
void DumpEvent(UIMouseEventArgs e) void DumpEvent(UIMouseEventArgs e)
{ {
Console.WriteLine(JsonSerializer.ToString(e)); Console.WriteLine(JsonSerializer.Serialize(e));
} }
void Clear() void Clear()

View File

@ -28,7 +28,7 @@
void OnTouch(UITouchEventArgs e) void OnTouch(UITouchEventArgs e)
{ {
message += e.Type; message += e.Type;
Console.WriteLine(JsonSerializer.ToString(e)); Console.WriteLine(JsonSerializer.Serialize(e));
StateHasChanged(); StateHasChanged();
} }

View File

@ -5,33 +5,39 @@
<title>Basic test app</title> <title>Basic test app</title>
<base href="/subdir/" /> <base href="/subdir/" />
<link href="style.css" rel="stylesheet" /> <link href="style.css" rel="stylesheet" />
<!-- Used by ExternalContentPackage -->
<link href="_content/TestContentPackage/styles.css" rel="stylesheet" />
</head> </head>
<body> <body>
<root>Loading...</root> <root>Loading...</root>
<!-- Used for testing interop scenarios between JS and .NET --> <!-- Used for testing interop scenarios between JS and .NET -->
<script src="js/jsinteroptests.js"></script> <script src="js/jsinteroptests.js"></script>
<script> <script>
// Used by ElementRefComponent // Used by ElementRefComponent
function setElementValue(element, newValue) { function setElementValue(element, newValue) {
element.value = newValue; element.value = newValue;
return element.value; return element.value;
} }
function uriHelperNavigate() { function uriHelperNavigate() {
Blazor.navigateTo('/subdir/some-path'); Blazor.navigateTo('/subdir/some-path');
} }
(function () { (function () {
// Load either blazor.webassembly.js or blazor.server.js depending // Load either blazor.webassembly.js or blazor.server.js depending
// on the hash part of the URL. This is just to give a way for the // on the hash part of the URL. This is just to give a way for the
// test runner to make the selection. // test runner to make the selection.
var src = location.hash === '#server' var src = location.hash === '#server'
? 'blazor.server.js' ? 'blazor.server.js'
: 'blazor.webassembly.js'; : 'blazor.webassembly.js';
document.write('<script src="_framework/' + src + '"><' + '/script>'); document.write('<script src="_framework/' + src + '"><' + '/script>');
})(); })();
</script> </script>
<!-- Used by ExternalContentPackage -->
<script src="_content/TestContentPackage/prompt.js"></script>
</body> </body>
</html> </html>

View File

@ -93,13 +93,13 @@ namespace Ignitor
EventHandlerId = clickEventDescriptor.EventId, EventHandlerId = clickEventDescriptor.EventId,
EventArgsType = "mouse", EventArgsType = "mouse",
}; };
var serializedJson = JsonSerializer.ToString(mouseEventArgs, new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); var serializedJson = JsonSerializer.Serialize(mouseEventArgs, new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
var argsObject = new object[] { browserDescriptor, serializedJson }; var argsObject = new object[] { browserDescriptor, serializedJson };
var callId = "0"; var callId = "0";
var assemblyName = "Microsoft.AspNetCore.Components.Browser"; var assemblyName = "Microsoft.AspNetCore.Components.Browser";
var methodIdentifier = "DispatchEvent"; var methodIdentifier = "DispatchEvent";
var dotNetObjectId = 0; var dotNetObjectId = 0;
var clickArgs = JsonSerializer.ToString(argsObject, new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); var clickArgs = JsonSerializer.Serialize(argsObject, new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
await connection.InvokeAsync("BeginInvokeDotNetFromJS", callId, assemblyName, methodIdentifier, dotNetObjectId, clickArgs); await connection.InvokeAsync("BeginInvokeDotNetFromJS", callId, assemblyName, methodIdentifier, dotNetObjectId, clickArgs);
} }
} }

View File

@ -4,19 +4,9 @@
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<OutputType>library</OutputType> <OutputType>library</OutputType>
<RazorLangVersion>3.0</RazorLangVersion> <RazorLangVersion>3.0</RazorLangVersion>
<StaticWebAssetBasePath>_content/TestContentPackage</StaticWebAssetBasePath>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<!-- .js files will be referenced via <script> tags -->
<EmbeddedResource Include="content\**\*.js" LogicalName="blazor:js:%(RecursiveDir)%(Filename)%(Extension)" />
<!-- .css files will be referenced via <link rel='Stylesheet'> tags -->
<EmbeddedResource Include="content\**\*.css" LogicalName="blazor:css:%(RecursiveDir)%(Filename)%(Extension)" />
<!-- Any other files will be included in the 'dist' output but without any tags referencing them -->
<EmbeddedResource Include="content\**" Exclude="**\*.js;**\*.css" LogicalName="blazor:file:%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.AspNetCore.Components" /> <Reference Include="Microsoft.AspNetCore.Components" />
</ItemGroup> </ItemGroup>

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -19,6 +19,7 @@ namespace TestServer
.AddCommandLine(args) .AddCommandLine(args)
.Build()) .Build())
.UseStartup<TStartup>() .UseStartup<TStartup>()
.UseStaticWebAssets()
.Build(); .Build();
} }
} }

View File

@ -1,10 +1,7 @@
using BasicTestApp; using BasicTestApp;
using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Components.Server;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
@ -63,6 +60,7 @@ namespace TestServer
// Mount the server-side Blazor app on /subdir // Mount the server-side Blazor app on /subdir
app.Map("/subdir", subdirApp => app.Map("/subdir", subdirApp =>
{ {
subdirApp.UseStaticFiles();
subdirApp.UseClientSideBlazorFiles<BasicTestApp.Startup>(); subdirApp.UseClientSideBlazorFiles<BasicTestApp.Startup>();
subdirApp.UseRouting(); subdirApp.UseRouting();

View File

@ -211,7 +211,7 @@ namespace Microsoft.AspNetCore
{ {
if (ctx.HostingEnvironment.IsDevelopment()) if (ctx.HostingEnvironment.IsDevelopment())
{ {
StaticWebAssetsLoader.UseStaticWebAssets(ctx.HostingEnvironment); StaticWebAssetsLoader.UseStaticWebAssets(ctx.HostingEnvironment, ctx.Configuration);
} }
}); });
builder.UseKestrel((builderContext, options) => builder.UseKestrel((builderContext, options) =>

View File

@ -25,6 +25,8 @@ This package is an internal implementation of the .NET Core SDK and is not meant
<!-- NuGet appends target framework to this value. Example: runtimes/win-x64/lib/netcoreapp3.0/ --> <!-- NuGet appends target framework to this value. Example: runtimes/win-x64/lib/netcoreapp3.0/ -->
<BuildOutputTargetFolder>runtimes/$(RuntimeIdentifier)/lib/</BuildOutputTargetFolder> <BuildOutputTargetFolder>runtimes/$(RuntimeIdentifier)/lib/</BuildOutputTargetFolder>
<!-- We still need the native path to these assets though for the RuntimeList.xml manifest -->
<ManagedAssetsPackagePath>$(BuildOutputTargetFolder)$(DefaultNetCoreTargetFramework)</ManagedAssetsPackagePath>
<!-- Target framework is not append to this because native assets to not have a target framework. --> <!-- Target framework is not append to this because native assets to not have a target framework. -->
<NativeAssetsPackagePath>runtimes/$(RuntimeIdentifier)/native/</NativeAssetsPackagePath> <NativeAssetsPackagePath>runtimes/$(RuntimeIdentifier)/native/</NativeAssetsPackagePath>
@ -457,6 +459,8 @@ This package is an internal implementation of the .NET Core SDK and is not meant
<RepoTasks.CreateFrameworkListFile <RepoTasks.CreateFrameworkListFile
Files="@(SharedFxContent)" Files="@(SharedFxContent)"
TargetFile="$(FrameworkListOutputPath)" TargetFile="$(FrameworkListOutputPath)"
ManagedRoot="$(ManagedAssetsPackagePath)"
NativeRoot="$(NativeAssetsPackagePath)"
RootAttributes="@(FrameworkListRootAttributes)" /> RootAttributes="@(FrameworkListRootAttributes)" />
<ItemGroup> <ItemGroup>

View File

@ -5,6 +5,10 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
using System.Runtime.CompilerServices;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Xunit; using Xunit;
using Xunit.Abstractions; using Xunit.Abstractions;
@ -24,6 +28,36 @@ namespace Microsoft.AspNetCore
_targetingPackRoot = Path.Combine(TestData.GetTestDataValue("TargetingPackLayoutRoot"), "packs", "Microsoft.AspNetCore.App.Ref", TestData.GetTestDataValue("TargetingPackVersion")); _targetingPackRoot = Path.Combine(TestData.GetTestDataValue("TargetingPackLayoutRoot"), "packs", "Microsoft.AspNetCore.App.Ref", TestData.GetTestDataValue("TargetingPackVersion"));
} }
[Fact]
public void AssembliesAreReferenceAssemblies()
{
IEnumerable<string> dlls = Directory.GetFiles(_targetingPackRoot, "*.dll", SearchOption.AllDirectories);
Assert.NotEmpty(dlls);
// Workaround https://github.com/aspnet/AspNetCore/issues/11206
dlls = dlls.Where(d => !d.Contains("System.IO.Pipelines"));
Assert.All(dlls, path =>
{
var assemblyName = AssemblyName.GetAssemblyName(path);
using var fileStream = File.OpenRead(path);
using var peReader = new PEReader(fileStream, PEStreamOptions.Default);
var reader = peReader.GetMetadataReader(MetadataReaderOptions.Default);
var assemblyDefinition = reader.GetAssemblyDefinition();
var hasRefAssemblyAttribute = assemblyDefinition.GetCustomAttributes().Any(attr =>
{
var attribute = reader.GetCustomAttribute(attr);
var attributeConstructor = reader.GetMemberReference((MemberReferenceHandle)attribute.Constructor);
var attributeType = reader.GetTypeReference((TypeReferenceHandle)attributeConstructor.Parent);
return reader.StringComparer.Equals(attributeType.Namespace, typeof(ReferenceAssemblyAttribute).Namespace)
&& reader.StringComparer.Equals(attributeType.Name, nameof(ReferenceAssemblyAttribute));
});
Assert.True(hasRefAssemblyAttribute, $"{path} should have {nameof(ReferenceAssemblyAttribute)}");
Assert.Equal(ProcessorArchitecture.None, assemblyName.ProcessorArchitecture);
});
}
[Fact] [Fact]
public void PlatformManifestListsAllFiles() public void PlatformManifestListsAllFiles()
{ {

View File

@ -121,6 +121,7 @@ namespace Microsoft.AspNetCore.Hosting
public static readonly string ServerUrlsKey; public static readonly string ServerUrlsKey;
public static readonly string ShutdownTimeoutKey; public static readonly string ShutdownTimeoutKey;
public static readonly string StartupAssemblyKey; public static readonly string StartupAssemblyKey;
public static readonly string StaticWebAssetsKey;
public static readonly string SuppressStatusMessagesKey; public static readonly string SuppressStatusMessagesKey;
public static readonly string WebRootKey; public static readonly string WebRootKey;
} }

View File

@ -21,5 +21,6 @@ namespace Microsoft.AspNetCore.Hosting
public static readonly string SuppressStatusMessagesKey = "suppressStatusMessages"; public static readonly string SuppressStatusMessagesKey = "suppressStatusMessages";
public static readonly string ShutdownTimeoutKey = "shutdownTimeoutSeconds"; public static readonly string ShutdownTimeoutKey = "shutdownTimeoutSeconds";
public static readonly string StaticWebAssetsKey = "staticWebAssets";
} }
} }

View File

@ -82,7 +82,7 @@ namespace Microsoft.AspNetCore.Hosting.StaticWebAssets
public partial class StaticWebAssetsLoader public partial class StaticWebAssetsLoader
{ {
public StaticWebAssetsLoader() { } public StaticWebAssetsLoader() { }
public static void UseStaticWebAssets(Microsoft.AspNetCore.Hosting.IWebHostEnvironment environment) { } public static void UseStaticWebAssets(Microsoft.AspNetCore.Hosting.IWebHostEnvironment environment, Microsoft.Extensions.Configuration.IConfiguration configuration) { }
} }
} }
namespace Microsoft.Extensions.Hosting namespace Microsoft.Extensions.Hosting

View File

@ -75,8 +75,6 @@ namespace Microsoft.AspNetCore.Hosting
options.HostingStartupExceptions = _hostingStartupErrors; options.HostingStartupExceptions = _hostingStartupErrors;
}); });
services.AddHostedService<GenericWebHostService>();
// REVIEW: This is bad since we don't own this type. Anybody could add one of these and it would mess things up // REVIEW: This is bad since we don't own this type. Anybody could add one of these and it would mess things up
// We need to flow this differently // We need to flow this differently
var listener = new DiagnosticListener("Microsoft.AspNetCore"); var listener = new DiagnosticListener("Microsoft.AspNetCore");

View File

@ -1,5 +1,6 @@
using System; using System;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.Extensions.Hosting namespace Microsoft.Extensions.Hosting
{ {
@ -9,6 +10,7 @@ namespace Microsoft.Extensions.Hosting
{ {
var webhostBuilder = new GenericWebHostBuilder(builder); var webhostBuilder = new GenericWebHostBuilder(builder);
configure(webhostBuilder); configure(webhostBuilder);
builder.ConfigureServices((context, services) => services.AddHostedService<GenericWebHostService>());
return builder; return builder;
} }
} }

View File

@ -7,6 +7,7 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.FileProviders;
namespace Microsoft.AspNetCore.Hosting.StaticWebAssets namespace Microsoft.AspNetCore.Hosting.StaticWebAssets
@ -21,10 +22,11 @@ namespace Microsoft.AspNetCore.Hosting.StaticWebAssets
/// <summary> /// <summary>
/// Configure the <see cref="IWebHostEnvironment"/> to use static web assets. /// Configure the <see cref="IWebHostEnvironment"/> to use static web assets.
/// </summary> /// </summary>
/// <param name="environment"></param> /// <param name="environment">The application <see cref="IWebHostEnvironment"/>.</param>
public static void UseStaticWebAssets(IWebHostEnvironment environment) /// <param name="configuration">The host <see cref="IConfiguration"/>.</param>
public static void UseStaticWebAssets(IWebHostEnvironment environment, IConfiguration configuration)
{ {
using (var manifest = ResolveManifest(environment)) using (var manifest = ResolveManifest(environment, configuration))
{ {
if (manifest != null) if (manifest != null)
{ {
@ -54,13 +56,13 @@ namespace Microsoft.AspNetCore.Hosting.StaticWebAssets
} }
} }
internal static Stream ResolveManifest(IWebHostEnvironment environment) internal static Stream ResolveManifest(IWebHostEnvironment environment, IConfiguration configuration)
{ {
try try
{ {
var manifestPath = configuration.GetValue<string>(WebHostDefaults.StaticWebAssetsKey);
var filePath = manifestPath ?? ResolveRelativeToAssembly(environment);
var assembly = Assembly.Load(environment.ApplicationName);
var filePath = Path.Combine(Path.GetDirectoryName(GetAssemblyLocation(assembly)), $"{environment.ApplicationName}.StaticWebAssets.xml");
if (File.Exists(filePath)) if (File.Exists(filePath))
{ {
return File.OpenRead(filePath); return File.OpenRead(filePath);
@ -79,6 +81,12 @@ namespace Microsoft.AspNetCore.Hosting.StaticWebAssets
} }
} }
private static string ResolveRelativeToAssembly(IWebHostEnvironment environment)
{
var assembly = Assembly.Load(environment.ApplicationName);
return Path.Combine(Path.GetDirectoryName(GetAssemblyLocation(assembly)), $"{environment.ApplicationName}.StaticWebAssets.xml");
}
internal static string GetAssemblyLocation(Assembly assembly) internal static string GetAssemblyLocation(Assembly assembly)
{ {
if (Uri.TryCreate(assembly.CodeBase, UriKind.Absolute, out var result) && if (Uri.TryCreate(assembly.CodeBase, UriKind.Absolute, out var result) &&

View File

@ -189,7 +189,7 @@ namespace Microsoft.AspNetCore.Hosting
{ {
builder.ConfigureAppConfiguration((context, configBuilder) => builder.ConfigureAppConfiguration((context, configBuilder) =>
{ {
StaticWebAssetsLoader.UseStaticWebAssets(context.HostingEnvironment); StaticWebAssetsLoader.UseStaticWebAssets(context.HostingEnvironment, context.Configuration);
}); });
return builder; return builder;

View File

@ -23,6 +23,7 @@ namespace Microsoft.AspNetCore.Hosting.Tests.Fakes
// This is the only one that doesn't pass through // This is the only one that doesn't pass through
public IWebHost Build() public IWebHost Build()
{ {
_hostBuilder.ConfigureServices((context, services) => services.AddHostedService<GenericWebHostService>());
return new GenericWebHost(_hostBuilder.Build()); return new GenericWebHost(_hostBuilder.Build());
} }

View File

@ -5,7 +5,6 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.Tracing; using System.Diagnostics.Tracing;
using System.Threading; using System.Threading;
using System.Threading.Channels;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Internal; using Microsoft.AspNetCore.Internal;
@ -185,7 +184,7 @@ namespace Microsoft.AspNetCore.Hosting
public async Task VerifyCountersFireWithCorrectValues() public async Task VerifyCountersFireWithCorrectValues()
{ {
// Arrange // Arrange
var eventListener = new CounterListener(new[] { var eventListener = new TestCounterListener(new[] {
"requests-per-second", "requests-per-second",
"total-requests", "total-requests",
"current-requests", "current-requests",
@ -207,6 +206,7 @@ namespace Microsoft.AspNetCore.Hosting
{ "EventCounterIntervalSec", "1" } { "EventCounterIntervalSec", "1" }
}); });
// Act & Assert
hostingEventSource.RequestStart("GET", "/"); hostingEventSource.RequestStart("GET", "/");
Assert.Equal(1, await totalRequestValues.FirstOrDefault(v => v == 1)); Assert.Equal(1, await totalRequestValues.FirstOrDefault(v => v == 1));
@ -241,36 +241,5 @@ namespace Microsoft.AspNetCore.Hosting
{ {
return new HostingEventSource(Guid.NewGuid().ToString()); return new HostingEventSource(Guid.NewGuid().ToString());
} }
private class CounterListener : EventListener
{
private readonly Dictionary<string, Channel<double>> _counters = new Dictionary<string, Channel<double>>();
public CounterListener(string[] counterNames)
{
foreach (var item in counterNames)
{
_counters[item] = Channel.CreateUnbounded<double>();
}
}
public IAsyncEnumerable<double> GetCounterValues(string counterName, CancellationToken cancellationToken = default)
{
return _counters[counterName].Reader.ReadAllAsync(cancellationToken);
}
protected override void OnEventWritten(EventWrittenEventArgs eventData)
{
if (eventData.EventName == "EventCounters")
{
var payload = (IDictionary<string, object>)eventData.Payload[0];
var counter = (string)payload["Name"];
payload.TryGetValue("Increment", out var increment);
payload.TryGetValue("Mean", out var mean);
var writer = _counters[counter].Writer;
writer.TryWrite((double)(increment ?? mean));
}
}
}
} }
} }

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
@ -7,6 +7,7 @@
<ItemGroup> <ItemGroup>
<Compile Include="$(SharedSourceRoot)test\SkipOnHelixAttribute.cs" /> <Compile Include="$(SharedSourceRoot)test\SkipOnHelixAttribute.cs" />
<Compile Include="$(SharedSourceRoot)EventSource.Testing\TestEventListener.cs" /> <Compile Include="$(SharedSourceRoot)EventSource.Testing\TestEventListener.cs" />
<Compile Include="$(SharedSourceRoot)EventSource.Testing\TestCounterListener.cs" />
<Content Include="testroot\**\*" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="PreserveNewest" /> <Content Include="testroot\**\*" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="PreserveNewest" />
<Content Include="Microsoft.AspNetCore.Hosting.StaticWebAssets.xml" CopyToOutputDirectory="PreserveNewest" /> <Content Include="Microsoft.AspNetCore.Hosting.StaticWebAssets.xml" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup> </ItemGroup>

View File

@ -2,10 +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; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.Hosting.StaticWebAssets namespace Microsoft.AspNetCore.Hosting.StaticWebAssets
@ -72,12 +75,39 @@ namespace Microsoft.AspNetCore.Hosting.StaticWebAssets
}; };
// Act // Act
var manifest = StaticWebAssetsLoader.ResolveManifest(environment); var manifest = StaticWebAssetsLoader.ResolveManifest(environment, new ConfigurationBuilder().Build());
// Assert // Assert
Assert.Equal(expectedManifest, new StreamReader(manifest).ReadToEnd()); Assert.Equal(expectedManifest, new StreamReader(manifest).ReadToEnd());
} }
[Fact]
public void ResolveManifest_UsesConfigurationKey_WhenProvided()
{
// Arrange
var expectedManifest = @"<StaticWebAssets Version=""1.0"">
<ContentRoot Path=""/Path"" BasePath=""/BasePath"" />
</StaticWebAssets>
";
var path = Path.ChangeExtension(new Uri(typeof(StaticWebAssetsLoader).Assembly.CodeBase).LocalPath, ".StaticWebAssets.xml");
var environment = new HostingEnvironment()
{
ApplicationName = "NonExistingDll"
};
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string>() {
[WebHostDefaults.StaticWebAssetsKey] = path
}).Build();
// Act
var manifest = StaticWebAssetsLoader.ResolveManifest(environment, configuration);
// Assert
Assert.Equal(expectedManifest, new StreamReader(manifest).ReadToEnd());
}
private Stream CreateManifest(string manifestContent) private Stream CreateManifest(string manifestContent)
{ {
return new MemoryStream(Encoding.UTF8.GetBytes(manifestContent)); return new MemoryStream(Encoding.UTF8.GetBytes(manifestContent));

View File

@ -1271,6 +1271,80 @@ namespace Microsoft.AspNetCore.Hosting
Assert.True(service.StopCalled); Assert.True(service.StopCalled);
} }
[Theory]
[MemberData(nameof(DefaultWebHostBuilders))]
public async Task HostedServicesStartedBeforeServer(IWebHostBuilder builder)
{
builder.Configure(app => { })
.ConfigureServices(services =>
{
services.AddSingleton<StartOrder>();
services.AddHostedService<MustBeStartedFirst>();
services.AddSingleton<IServer, ServerMustBeStartedSecond>();
});
using var host = builder.Build();
await host.StartAsync();
var ordering = host.Services.GetRequiredService<StartOrder>();
Assert.Equal(2, ordering.Order);
await host.StopAsync();
}
private class StartOrder
{
public int Order { get; set; }
}
private class MustBeStartedFirst : IHostedService
{
public MustBeStartedFirst(StartOrder ordering)
{
Ordering = ordering;
}
public StartOrder Ordering { get; }
public Task StartAsync(CancellationToken cancellationToken)
{
Assert.Equal(0, Ordering.Order);
Ordering.Order++;
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
private class ServerMustBeStartedSecond : IServer
{
public ServerMustBeStartedSecond(StartOrder ordering)
{
Ordering = ordering;
}
public StartOrder Ordering { get; }
public IFeatureCollection Features => null;
public Task StartAsync<TContext>(IHttpApplication<TContext> application, CancellationToken cancellationToken)
{
Assert.Equal(1, Ordering.Order);
Ordering.Order++;
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
public void Dispose()
{
}
}
private static void StaticConfigureMethod(IApplicationBuilder app) { } private static void StaticConfigureMethod(IApplicationBuilder app) { }
private IWebHostBuilder CreateWebHostBuilder() private IWebHostBuilder CreateWebHostBuilder()

View File

@ -17,6 +17,7 @@ namespace Microsoft.AspNetCore.TestHost
public partial class RequestBuilder public partial class RequestBuilder
{ {
public RequestBuilder(Microsoft.AspNetCore.TestHost.TestServer server, string path) { } public RequestBuilder(Microsoft.AspNetCore.TestHost.TestServer server, string path) { }
public Microsoft.AspNetCore.TestHost.TestServer TestServer { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public Microsoft.AspNetCore.TestHost.RequestBuilder AddHeader(string name, string value) { throw null; } public Microsoft.AspNetCore.TestHost.RequestBuilder AddHeader(string name, string value) { throw null; }
public Microsoft.AspNetCore.TestHost.RequestBuilder And(System.Action<System.Net.Http.HttpRequestMessage> configure) { throw null; } public Microsoft.AspNetCore.TestHost.RequestBuilder And(System.Action<System.Net.Http.HttpRequestMessage> configure) { throw null; }
public System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage> GetAsync() { throw null; } public System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage> GetAsync() { throw null; }
@ -25,15 +26,16 @@ namespace Microsoft.AspNetCore.TestHost
} }
public partial class TestServer : Microsoft.AspNetCore.Hosting.Server.IServer, System.IDisposable public partial class TestServer : Microsoft.AspNetCore.Hosting.Server.IServer, System.IDisposable
{ {
public TestServer() { }
public TestServer(Microsoft.AspNetCore.Hosting.IWebHostBuilder builder) { } public TestServer(Microsoft.AspNetCore.Hosting.IWebHostBuilder builder) { }
public TestServer(Microsoft.AspNetCore.Hosting.IWebHostBuilder builder, Microsoft.AspNetCore.Http.Features.IFeatureCollection featureCollection) { } public TestServer(Microsoft.AspNetCore.Hosting.IWebHostBuilder builder, Microsoft.AspNetCore.Http.Features.IFeatureCollection featureCollection) { }
public TestServer(Microsoft.AspNetCore.Http.Features.IFeatureCollection featureCollection) { } public TestServer(System.IServiceProvider services) { }
public TestServer(System.IServiceProvider services, Microsoft.AspNetCore.Http.Features.IFeatureCollection featureCollection) { }
public bool AllowSynchronousIO { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public bool AllowSynchronousIO { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public System.Uri BaseAddress { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public System.Uri BaseAddress { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public Microsoft.AspNetCore.Http.Features.IFeatureCollection Features { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public Microsoft.AspNetCore.Http.Features.IFeatureCollection Features { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public Microsoft.AspNetCore.Hosting.IWebHost Host { get { throw null; } } public Microsoft.AspNetCore.Hosting.IWebHost Host { get { throw null; } }
public bool PreserveExecutionContext { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public bool PreserveExecutionContext { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public System.IServiceProvider Services { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public System.Net.Http.HttpClient CreateClient() { throw null; } public System.Net.Http.HttpClient CreateClient() { throw null; }
public System.Net.Http.HttpMessageHandler CreateHandler() { throw null; } public System.Net.Http.HttpMessageHandler CreateHandler() { throw null; }
public Microsoft.AspNetCore.TestHost.RequestBuilder CreateRequest(string path) { throw null; } public Microsoft.AspNetCore.TestHost.RequestBuilder CreateRequest(string path) { throw null; }

View File

@ -64,7 +64,6 @@ namespace Microsoft.AspNetCore.TestHost
var contextBuilder = new HttpContextBuilder(_application, AllowSynchronousIO, PreserveExecutionContext); var contextBuilder = new HttpContextBuilder(_application, AllowSynchronousIO, PreserveExecutionContext);
Stream responseBody = null;
var requestContent = request.Content ?? new StreamContent(Stream.Null); var requestContent = request.Content ?? new StreamContent(Stream.Null);
var body = await requestContent.ReadAsStreamAsync(); var body = await requestContent.ReadAsStreamAsync();
contextBuilder.Configure(context => contextBuilder.Configure(context =>
@ -114,8 +113,6 @@ namespace Microsoft.AspNetCore.TestHost
body.Seek(0, SeekOrigin.Begin); body.Seek(0, SeekOrigin.Begin);
} }
req.Body = new AsyncStreamWrapper(body, () => contextBuilder.AllowSynchronousIO); req.Body = new AsyncStreamWrapper(body, () => contextBuilder.AllowSynchronousIO);
responseBody = context.Response.Body;
}); });
var response = new HttpResponseMessage(); var response = new HttpResponseMessage();
@ -138,7 +135,7 @@ namespace Microsoft.AspNetCore.TestHost
response.ReasonPhrase = httpContext.Features.Get<IHttpResponseFeature>().ReasonPhrase; response.ReasonPhrase = httpContext.Features.Get<IHttpResponseFeature>().ReasonPhrase;
response.RequestMessage = request; response.RequestMessage = request;
response.Content = new StreamContent(responseBody); response.Content = new StreamContent(httpContext.Response.Body);
foreach (var header in httpContext.Response.Headers) foreach (var header in httpContext.Response.Headers)
{ {

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.IO.Pipelines;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
@ -16,7 +17,8 @@ namespace Microsoft.AspNetCore.TestHost
private readonly HttpContext _httpContext; private readonly HttpContext _httpContext;
private readonly TaskCompletionSource<HttpContext> _responseTcs = new TaskCompletionSource<HttpContext>(TaskCreationOptions.RunContinuationsAsynchronously); private readonly TaskCompletionSource<HttpContext> _responseTcs = new TaskCompletionSource<HttpContext>(TaskCreationOptions.RunContinuationsAsynchronously);
private readonly ResponseStream _responseStream; private readonly ResponseBodyReaderStream _responseReaderStream;
private readonly ResponseBodyPipeWriter _responsePipeWriter;
private readonly ResponseFeature _responseFeature; private readonly ResponseFeature _responseFeature;
private readonly RequestLifetimeFeature _requestLifetimeFeature = new RequestLifetimeFeature(); private readonly RequestLifetimeFeature _requestLifetimeFeature = new RequestLifetimeFeature();
private readonly ResponseTrailersFeature _responseTrailersFeature = new ResponseTrailersFeature(); private readonly ResponseTrailersFeature _responseTrailersFeature = new ResponseTrailersFeature();
@ -37,14 +39,19 @@ namespace Microsoft.AspNetCore.TestHost
request.Protocol = "HTTP/1.1"; request.Protocol = "HTTP/1.1";
request.Method = HttpMethods.Get; request.Method = HttpMethods.Get;
var pipe = new Pipe();
_responseReaderStream = new ResponseBodyReaderStream(pipe, AbortRequest, () => _responseReadCompleteCallback?.Invoke(_httpContext));
_responsePipeWriter = new ResponseBodyPipeWriter(pipe, ReturnResponseMessageAsync);
_responseFeature.Body = new ResponseBodyWriterStream(_responsePipeWriter, () => AllowSynchronousIO);
_responseFeature.BodySnapshot = _responseFeature.Body;
_responseFeature.BodyWriter = _responsePipeWriter;
_httpContext.Features.Set<IHttpBodyControlFeature>(this); _httpContext.Features.Set<IHttpBodyControlFeature>(this);
_httpContext.Features.Set<IHttpResponseFeature>(_responseFeature); _httpContext.Features.Set<IHttpResponseFeature>(_responseFeature);
_httpContext.Features.Set<IHttpResponseStartFeature>(_responseFeature); _httpContext.Features.Set<IHttpResponseStartFeature>(_responseFeature);
_httpContext.Features.Set<IHttpRequestLifetimeFeature>(_requestLifetimeFeature); _httpContext.Features.Set<IHttpRequestLifetimeFeature>(_requestLifetimeFeature);
_httpContext.Features.Set<IHttpResponseTrailersFeature>(_responseTrailersFeature); _httpContext.Features.Set<IHttpResponseTrailersFeature>(_responseTrailersFeature);
_httpContext.Features.Set<IResponseBodyPipeFeature>(_responseFeature);
_responseStream = new ResponseStream(ReturnResponseMessageAsync, AbortRequest, () => AllowSynchronousIO, () => _responseReadCompleteCallback?.Invoke(_httpContext));
_responseFeature.Body = _responseStream;
} }
public bool AllowSynchronousIO { get; set; } public bool AllowSynchronousIO { get; set; }
@ -119,14 +126,14 @@ namespace Microsoft.AspNetCore.TestHost
{ {
_requestLifetimeFeature.Abort(); _requestLifetimeFeature.Abort();
} }
_responseStream.CompleteWrites(); _responsePipeWriter.Complete();
} }
internal async Task CompleteResponseAsync() internal async Task CompleteResponseAsync()
{ {
_pipelineFinished = true; _pipelineFinished = true;
await ReturnResponseMessageAsync(); await ReturnResponseMessageAsync();
_responseStream.CompleteWrites(); _responsePipeWriter.Complete();
await _responseFeature.FireOnResponseCompletedAsync(); await _responseFeature.FireOnResponseCompletedAsync();
} }
@ -155,6 +162,16 @@ namespace Microsoft.AspNetCore.TestHost
{ {
newFeatures[pair.Key] = pair.Value; newFeatures[pair.Key] = pair.Value;
} }
var serverResponseFeature = _httpContext.Features.Get<IHttpResponseFeature>();
// The client gets a deep copy of this so they can interact with the body stream independently of the server.
var clientResponseFeature = new HttpResponseFeature()
{
StatusCode = serverResponseFeature.StatusCode,
ReasonPhrase = serverResponseFeature.ReasonPhrase,
Headers = serverResponseFeature.Headers,
Body = _responseReaderStream
};
newFeatures.Set<IHttpResponseFeature>(clientResponseFeature);
_responseTcs.TrySetResult(new DefaultHttpContext(newFeatures)); _responseTcs.TrySetResult(new DefaultHttpContext(newFeatures));
} }
} }
@ -162,7 +179,8 @@ namespace Microsoft.AspNetCore.TestHost
internal void Abort(Exception exception) internal void Abort(Exception exception)
{ {
_pipelineFinished = true; _pipelineFinished = true;
_responseStream.Abort(exception); _responsePipeWriter.Abort(exception);
_responseReaderStream.Abort(exception);
_responseTcs.TrySetException(exception); _responseTcs.TrySetException(exception);
} }
} }

View File

@ -13,7 +13,6 @@ namespace Microsoft.AspNetCore.TestHost
/// </summary> /// </summary>
public class RequestBuilder public class RequestBuilder
{ {
private readonly TestServer _server;
private readonly HttpRequestMessage _req; private readonly HttpRequestMessage _req;
/// <summary> /// <summary>
@ -23,15 +22,15 @@ namespace Microsoft.AspNetCore.TestHost
/// <param name="path"></param> /// <param name="path"></param>
public RequestBuilder(TestServer server, string path) public RequestBuilder(TestServer server, string path)
{ {
if (server == null) TestServer = server ?? throw new ArgumentNullException(nameof(server));
{
throw new ArgumentNullException(nameof(server));
}
_server = server;
_req = new HttpRequestMessage(HttpMethod.Get, path); _req = new HttpRequestMessage(HttpMethod.Get, path);
} }
/// <summary>
/// Gets the <see cref="TestServer"/> instance for which the request is being built.
/// </summary>
public TestServer TestServer { get; }
/// <summary> /// <summary>
/// Configure any HttpRequestMessage properties. /// Configure any HttpRequestMessage properties.
/// </summary> /// </summary>
@ -79,7 +78,7 @@ namespace Microsoft.AspNetCore.TestHost
public Task<HttpResponseMessage> SendAsync(string method) public Task<HttpResponseMessage> SendAsync(string method)
{ {
_req.Method = new HttpMethod(method); _req.Method = new HttpMethod(method);
return _server.CreateClient().SendAsync(_req); return TestServer.CreateClient().SendAsync(_req);
} }
/// <summary> /// <summary>
@ -89,7 +88,7 @@ namespace Microsoft.AspNetCore.TestHost
public Task<HttpResponseMessage> GetAsync() public Task<HttpResponseMessage> GetAsync()
{ {
_req.Method = HttpMethod.Get; _req.Method = HttpMethod.Get;
return _server.CreateClient().SendAsync(_req); return TestServer.CreateClient().SendAsync(_req);
} }
/// <summary> /// <summary>
@ -99,7 +98,7 @@ namespace Microsoft.AspNetCore.TestHost
public Task<HttpResponseMessage> PostAsync() public Task<HttpResponseMessage> PostAsync()
{ {
_req.Method = HttpMethod.Post; _req.Method = HttpMethod.Post;
return _server.CreateClient().SendAsync(_req); return TestServer.CreateClient().SendAsync(_req);
} }
} }
} }

View File

@ -0,0 +1,107 @@
// 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.Diagnostics.Contracts;
using System.IO;
using System.IO.Pipelines;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http.Features;
namespace Microsoft.AspNetCore.TestHost
{
internal class ResponseBodyPipeWriter : PipeWriter
{
private readonly Func<Task> _onFirstWriteAsync;
private readonly Pipe _pipe;
private bool _firstWrite;
private bool _complete;
internal ResponseBodyPipeWriter(Pipe pipe, Func<Task> onFirstWriteAsync)
{
_pipe = pipe ?? throw new ArgumentNullException(nameof(pipe));
_onFirstWriteAsync = onFirstWriteAsync ?? throw new ArgumentNullException(nameof(onFirstWriteAsync));
_firstWrite = true;
}
public override async ValueTask<FlushResult> FlushAsync(CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
CheckNotComplete();
await FirstWriteAsync();
return await _pipe.Writer.FlushAsync(cancellationToken);
}
private Task FirstWriteAsync()
{
if (_firstWrite)
{
_firstWrite = false;
return _onFirstWriteAsync();
}
return Task.CompletedTask;
}
internal void Abort(Exception innerException)
{
Contract.Requires(innerException != null);
_complete = true;
_pipe.Writer.Complete(new IOException(string.Empty, innerException));
}
internal void Complete()
{
if (_complete)
{
return;
}
// Throw for further writes, but not reads. Allow reads to drain the buffered data and then return 0 for further reads.
_complete = true;
_pipe.Writer.Complete();
}
private void CheckNotComplete()
{
if (_complete)
{
throw new IOException("The request was aborted or the pipeline has finished.");
}
}
public override void Complete(Exception exception = null)
{
// No-op in the non-error case
if (exception != null)
{
Abort(exception);
}
}
public override void CancelPendingFlush() => _pipe.Writer.CancelPendingFlush();
public override void OnReaderCompleted(Action<Exception, object> callback, object state)
=> _pipe.Writer.OnReaderCompleted(callback, state);
public override void Advance(int bytes)
{
CheckNotComplete();
_pipe.Writer.Advance(bytes);
}
public override Memory<byte> GetMemory(int sizeHint = 0)
{
CheckNotComplete();
return _pipe.Writer.GetMemory(sizeHint);
}
public override Span<byte> GetSpan(int sizeHint = 0)
{
CheckNotComplete();
return _pipe.Writer.GetSpan(sizeHint);
}
}
}

View File

@ -0,0 +1,146 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Buffers;
using System.Diagnostics.Contracts;
using System.IO;
using System.IO.Pipelines;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNetCore.TestHost
{
/// <summary>
/// The client's view of the response body.
/// </summary>
internal class ResponseBodyReaderStream : Stream
{
private bool _readerComplete;
private bool _aborted;
private Exception _abortException;
private readonly Action _abortRequest;
private readonly Action _readComplete;
private readonly Pipe _pipe;
internal ResponseBodyReaderStream(Pipe pipe, Action abortRequest, Action readComplete)
{
_pipe = pipe ?? throw new ArgumentNullException(nameof(pipe));
_abortRequest = abortRequest ?? throw new ArgumentNullException(nameof(abortRequest));
_readComplete = readComplete;
}
public override bool CanRead => true;
public override bool CanSeek => false;
public override bool CanWrite => false;
#region NotSupported
public override long Length => throw new NotSupportedException();
public override long Position
{
get => throw new NotSupportedException();
set => throw new NotSupportedException();
}
public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException();
public override void SetLength(long value) => throw new NotSupportedException();
public override void Flush() => throw new NotSupportedException();
public override Task FlushAsync(CancellationToken cancellationToken) => throw new NotSupportedException();
// Write with count 0 will still trigger OnFirstWrite
public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException();
public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) => throw new NotSupportedException();
#endregion NotSupported
public override int Read(byte[] buffer, int offset, int count)
{
return ReadAsync(buffer, offset, count, CancellationToken.None).GetAwaiter().GetResult();
}
public async override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
VerifyBuffer(buffer, offset, count);
CheckAborted();
if (_readerComplete)
{
return 0;
}
using var registration = cancellationToken.Register(Cancel);
var result = await _pipe.Reader.ReadAsync(cancellationToken);
if (result.Buffer.IsEmpty && result.IsCompleted)
{
_pipe.Reader.Complete();
_readComplete();
_readerComplete = true;
return 0;
}
var readableBuffer = result.Buffer;
var actual = Math.Min(readableBuffer.Length, count);
readableBuffer = readableBuffer.Slice(0, actual);
readableBuffer.CopyTo(new Span<byte>(buffer, offset, count));
_pipe.Reader.AdvanceTo(readableBuffer.End);
return (int)actual;
}
private static void VerifyBuffer(byte[] buffer, int offset, int count)
{
if (buffer == null)
{
throw new ArgumentNullException("buffer");
}
if (offset < 0 || offset > buffer.Length)
{
throw new ArgumentOutOfRangeException("offset", offset, string.Empty);
}
if (count <= 0 || count > buffer.Length - offset)
{
throw new ArgumentOutOfRangeException("count", count, string.Empty);
}
}
internal void Cancel()
{
_aborted = true;
_abortException = new OperationCanceledException();
_pipe.Writer.Complete(_abortException);
}
internal void Abort(Exception innerException)
{
Contract.Requires(innerException != null);
_aborted = true;
_abortException = innerException;
}
private void CheckAborted()
{
if (_aborted)
{
throw new IOException(string.Empty, _abortException);
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_abortRequest();
}
base.Dispose(disposing);
}
}
}

View File

@ -0,0 +1,73 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNetCore.TestHost
{
internal class ResponseBodyWriterStream : Stream
{
private readonly ResponseBodyPipeWriter _responseWriter;
private readonly Func<bool> _allowSynchronousIO;
public ResponseBodyWriterStream(ResponseBodyPipeWriter responseWriter, Func<bool> allowSynchronousIO)
{
_responseWriter = responseWriter;
_allowSynchronousIO = allowSynchronousIO;
}
public override bool CanRead => false;
public override bool CanSeek => false;
public override bool CanWrite => true;
public override long Length => throw new NotSupportedException();
public override long Position { get => throw new NotSupportedException(); set => throw new NotSupportedException(); }
public override int Read(byte[] buffer, int offset, int count)
{
throw new NotSupportedException();
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();
}
public override void SetLength(long value)
{
throw new NotSupportedException();
}
public override void Flush()
{
FlushAsync().GetAwaiter().GetResult();
}
public override async Task FlushAsync(CancellationToken cancellationToken)
{
await _responseWriter.FlushAsync(cancellationToken);
}
public override void Write(byte[] buffer, int offset, int count)
{
if (!_allowSynchronousIO())
{
throw new InvalidOperationException("Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true.");
}
// The Pipe Write method requires calling FlushAsync to notify the reader. Call WriteAsync instead.
WriteAsync(buffer, offset, count).GetAwaiter().GetResult();
}
public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
await _responseWriter.WriteAsync(new ReadOnlyMemory<byte>(buffer, offset, count), cancellationToken);
}
}
}

View File

@ -3,6 +3,7 @@
using System; using System;
using System.IO; using System.IO;
using System.IO.Pipelines;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
@ -10,7 +11,7 @@ using Microsoft.AspNetCore.Http.Features;
namespace Microsoft.AspNetCore.TestHost namespace Microsoft.AspNetCore.TestHost
{ {
internal class ResponseFeature : IHttpResponseFeature, IHttpResponseStartFeature internal class ResponseFeature : IHttpResponseFeature, IHttpResponseStartFeature, IResponseBodyPipeFeature
{ {
private readonly HeaderDictionary _headers = new HeaderDictionary(); private readonly HeaderDictionary _headers = new HeaderDictionary();
private readonly Action<Exception> _abort; private readonly Action<Exception> _abort;
@ -67,6 +68,30 @@ namespace Microsoft.AspNetCore.TestHost
public Stream Body { get; set; } public Stream Body { get; set; }
internal Stream BodySnapshot { get; set; }
internal PipeWriter BodyWriter { get; set; }
public PipeWriter Writer
{
get
{
if (!ReferenceEquals(BodySnapshot, Body))
{
BodySnapshot = Body;
BodyWriter = PipeWriter.Create(Body);
OnCompleted((self) =>
{
((PipeWriter)self).Complete();
return Task.CompletedTask;
}, BodyWriter);
}
return BodyWriter;
}
}
public bool HasStarted { get; set; } public bool HasStarted { get; set; }
public void OnStarting(Func<object, Task> callback, object state) public void OnStarting(Func<object, Task> callback, object state)

View File

@ -1,259 +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.
using System;
using System.Buffers;
using System.Diagnostics;
using System.Diagnostics.Contracts;
using System.IO;
using System.IO.Pipelines;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.AspNetCore.TestHost
{
// This steam accepts writes from the server/app, buffers them internally, and returns the data via Reads
// when requested by the client.
internal class ResponseStream : Stream
{
private bool _complete;
private bool _readerComplete;
private bool _aborted;
private Exception _abortException;
private bool _firstWrite;
private readonly SemaphoreSlim _writeLock;
private readonly Func<Task> _onFirstWriteAsync;
private readonly Action _abortRequest;
private readonly Func<bool> _allowSynchronousIO;
private readonly Action _readComplete;
private readonly Pipe _pipe = new Pipe();
internal ResponseStream(Func<Task> onFirstWriteAsync, Action abortRequest, Func<bool> allowSynchronousIO, Action readComplete)
{
_onFirstWriteAsync = onFirstWriteAsync ?? throw new ArgumentNullException(nameof(onFirstWriteAsync));
_abortRequest = abortRequest ?? throw new ArgumentNullException(nameof(abortRequest));
_allowSynchronousIO = allowSynchronousIO ?? throw new ArgumentNullException(nameof(allowSynchronousIO));
_readComplete = readComplete;
_firstWrite = true;
_writeLock = new SemaphoreSlim(1, 1);
}
public override bool CanRead
{
get { return true; }
}
public override bool CanSeek
{
get { return false; }
}
public override bool CanWrite
{
get { return true; }
}
#region NotSupported
public override long Length
{
get { throw new NotSupportedException(); }
}
public override long Position
{
get { throw new NotSupportedException(); }
set { throw new NotSupportedException(); }
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();
}
public override void SetLength(long value)
{
throw new NotSupportedException();
}
#endregion NotSupported
public override void Flush()
{
FlushAsync().GetAwaiter().GetResult();
}
public override async Task FlushAsync(CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
CheckNotComplete();
await _writeLock.WaitAsync(cancellationToken);
try
{
await FirstWriteAsync();
await _pipe.Writer.FlushAsync(cancellationToken);
}
finally
{
_writeLock.Release();
}
}
public override int Read(byte[] buffer, int offset, int count)
{
return ReadAsync(buffer, offset, count, CancellationToken.None).GetAwaiter().GetResult();
}
public async override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
VerifyBuffer(buffer, offset, count, allowEmpty: false);
CheckAborted();
if (_readerComplete)
{
return 0;
}
var registration = cancellationToken.Register(Cancel);
try
{
var result = await _pipe.Reader.ReadAsync(cancellationToken);
if (result.Buffer.IsEmpty && result.IsCompleted)
{
_pipe.Reader.Complete();
_readComplete();
_readerComplete = true;
return 0;
}
var readableBuffer = result.Buffer;
var actual = Math.Min(readableBuffer.Length, count);
readableBuffer = readableBuffer.Slice(0, actual);
readableBuffer.CopyTo(new Span<byte>(buffer, offset, count));
_pipe.Reader.AdvanceTo(readableBuffer.End, readableBuffer.End);
return (int)actual;
}
finally
{
registration.Dispose();
}
}
// Called under write-lock.
private Task FirstWriteAsync()
{
if (_firstWrite)
{
_firstWrite = false;
return _onFirstWriteAsync();
}
return Task.FromResult(true);
}
// Write with count 0 will still trigger OnFirstWrite
public override void Write(byte[] buffer, int offset, int count)
{
if (!_allowSynchronousIO())
{
throw new InvalidOperationException("Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true.");
}
// The Pipe Write method requires calling FlushAsync to notify the reader. Call WriteAsync instead.
WriteAsync(buffer, offset, count).GetAwaiter().GetResult();
}
public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
VerifyBuffer(buffer, offset, count, allowEmpty: true);
CheckNotComplete();
await _writeLock.WaitAsync(cancellationToken);
try
{
await FirstWriteAsync();
await _pipe.Writer.WriteAsync(new ReadOnlyMemory<byte>(buffer, offset, count), cancellationToken);
}
finally
{
_writeLock.Release();
}
}
private static void VerifyBuffer(byte[] buffer, int offset, int count, bool allowEmpty)
{
if (buffer == null)
{
throw new ArgumentNullException("buffer");
}
if (offset < 0 || offset > buffer.Length)
{
throw new ArgumentOutOfRangeException("offset", offset, string.Empty);
}
if (count < 0 || count > buffer.Length - offset
|| (!allowEmpty && count == 0))
{
throw new ArgumentOutOfRangeException("count", count, string.Empty);
}
}
internal void Cancel()
{
_aborted = true;
_abortException = new OperationCanceledException();
_complete = true;
_pipe.Writer.Complete(_abortException);
}
internal void Abort(Exception innerException)
{
Contract.Requires(innerException != null);
_aborted = true;
_abortException = innerException;
_complete = true;
_pipe.Writer.Complete(new IOException(string.Empty, innerException));
}
internal void CompleteWrites()
{
// If HttpClient.Dispose gets called while HttpClient.SetTask...() is called
// there is a chance that this method will be called twice and hang on the lock
// to prevent this we can check if there is already a thread inside the lock
if (_complete)
{
return;
}
// Throw for further writes, but not reads. Allow reads to drain the buffered data and then return 0 for further reads.
_complete = true;
_pipe.Writer.Complete();
}
private void CheckAborted()
{
if (_aborted)
{
throw new IOException(string.Empty, _abortException);
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_abortRequest();
}
base.Dispose(disposing);
}
private void CheckNotComplete()
{
if (_complete)
{
throw new IOException("The request was aborted or the pipeline has finished");
}
}
}
}

View File

@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.Server; using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.TestHost namespace Microsoft.AspNetCore.TestHost
{ {
@ -19,19 +20,22 @@ namespace Microsoft.AspNetCore.TestHost
private ApplicationWrapper _application; private ApplicationWrapper _application;
/// <summary> /// <summary>
/// For use with IHostBuilder or IWebHostBuilder. /// For use with IHostBuilder.
/// </summary> /// </summary>
public TestServer() /// <param name="services"></param>
: this(new FeatureCollection()) public TestServer(IServiceProvider services)
: this(services, new FeatureCollection())
{ {
} }
/// <summary> /// <summary>
/// For use with IHostBuilder or IWebHostBuilder. /// For use with IHostBuilder.
/// </summary> /// </summary>
/// <param name="services"></param>
/// <param name="featureCollection"></param> /// <param name="featureCollection"></param>
public TestServer(IFeatureCollection featureCollection) public TestServer(IServiceProvider services, IFeatureCollection featureCollection)
{ {
Services = services ?? throw new ArgumentNullException(nameof(services));
Features = featureCollection ?? throw new ArgumentNullException(nameof(featureCollection)); Features = featureCollection ?? throw new ArgumentNullException(nameof(featureCollection));
} }
@ -50,16 +54,19 @@ namespace Microsoft.AspNetCore.TestHost
/// <param name="builder"></param> /// <param name="builder"></param>
/// <param name="featureCollection"></param> /// <param name="featureCollection"></param>
public TestServer(IWebHostBuilder builder, IFeatureCollection featureCollection) public TestServer(IWebHostBuilder builder, IFeatureCollection featureCollection)
: this(featureCollection)
{ {
if (builder == null) if (builder == null)
{ {
throw new ArgumentNullException(nameof(builder)); throw new ArgumentNullException(nameof(builder));
} }
Features = featureCollection ?? throw new ArgumentNullException(nameof(featureCollection));
var host = builder.UseServer(this).Build(); var host = builder.UseServer(this).Build();
host.StartAsync().GetAwaiter().GetResult(); host.StartAsync().GetAwaiter().GetResult();
_hostInstance = host; _hostInstance = host;
Services = host.Services;
} }
public Uri BaseAddress { get; set; } = new Uri("http://localhost/"); public Uri BaseAddress { get; set; } = new Uri("http://localhost/");
@ -73,6 +80,8 @@ namespace Microsoft.AspNetCore.TestHost
} }
} }
public IServiceProvider Services { get; }
public IFeatureCollection Features { get; } public IFeatureCollection Features { get; }
/// <summary> /// <summary>

View File

@ -34,5 +34,19 @@ namespace Microsoft.AspNetCore.TestHost
Assert.Equal("Test/Value", request.Content.Headers.ContentType.ToString()); Assert.Equal("Test/Value", request.Content.Headers.ContentType.ToString());
}); });
} }
[Fact]
public void TestServer_PropertyShouldHoldTestServerInstance()
{
// Arrange
var builder = new WebHostBuilder().Configure(app => { });
var server = new TestServer(builder);
// Act
var requestBuilder = server.CreateRequest("/");
// Assert
Assert.Equal(server, requestBuilder.TestServer);
}
} }
} }

View File

@ -0,0 +1,64 @@
// 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.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Hosting;
using Xunit;
namespace Microsoft.AspNetCore.TestHost.Tests
{
public class ResponseBodyTests
{
[Fact]
public async Task BodyWriter_GetMemoryAdvance_AutoCompleted()
{
var length = -1;
using var host = await CreateHost(httpContext =>
{
var writer = httpContext.Response.BodyWriter;
length = writer.GetMemory().Length;
writer.Advance(length);
return Task.CompletedTask;
});
var response = await host.GetTestServer().CreateClient().GetAsync("/");
var bytes = await response.Content.ReadAsByteArrayAsync();
Assert.Equal(length, bytes.Length);
}
[Fact]
public async Task BodyWriter_StartAsyncGetMemoryAdvance_AutoCompleted()
{
var length = -1;
using var host = await CreateHost(async httpContext =>
{
await httpContext.Response.StartAsync();
var writer = httpContext.Response.BodyWriter;
length = writer.GetMemory().Length;
writer.Advance(length);
});
var response = await host.GetTestServer().CreateClient().GetAsync("/");
var bytes = await response.Content.ReadAsByteArrayAsync();
Assert.Equal(length, bytes.Length);
}
private Task<IHost> CreateHost(RequestDelegate appDelegate)
{
return new HostBuilder()
.ConfigureWebHost(webBuilder =>
{
webBuilder
.UseTestServer()
.Configure(app =>
{
app.Run(appDelegate);
});
})
.StartAsync();
}
}
}

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