Merge branch 'master' into 10332-work

This commit is contained in:
Ryan Brandenburg 2019-06-06 10:26:34 -07:00 коммит произвёл GitHub
Родитель c4790a0228 c18fc3d7ca
Коммит 27b00fe95f
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
93 изменённых файлов: 1112 добавлений и 1151 удалений

Просмотреть файл

@ -328,7 +328,7 @@ jobs:
agentOs: Windows
isTestingJob: true
buildScript: ./eng/scripts/cibuild.cmd
buildArgs: -test -BuildNative "/p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISForwardsCompatibilityTests=true /p:RunTemplateTests=false /p:BuildSiteExtensions=false"
buildArgs: -test -BuildNative "/p:SkipIISNewHandlerTests=true /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISNewShimTests=true /p:RunTemplateTests=false /p:BuildSiteExtensions=false"
beforeBuild:
- powershell: "& ./src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/Servers/IIS/tools/update_schema.ps1"
displayName: Setup IISExpress test certificates and schema

Просмотреть файл

@ -13,384 +13,384 @@
<Uri>https://github.com/aspnet/Blazor</Uri>
<Sha>9bc8036bf68fd159fffa56f93f8b2471bf96efd4</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="3.0.0-preview7.19303.10">
<Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="3.0.0-preview7.19304.5">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>6fcd12e60b3d828988cabdebb55d30397c21d0db</Sha>
<Sha>1954d93d9091707fef3958e63fc39b20325696df</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="3.0.0-preview7.19303.10">
<Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="3.0.0-preview7.19304.5">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>6fcd12e60b3d828988cabdebb55d30397c21d0db</Sha>
<Sha>1954d93d9091707fef3958e63fc39b20325696df</Sha>
</Dependency>
<Dependency Name="Microsoft.CodeAnalysis.Razor" Version="3.0.0-preview7.19303.10">
<Dependency Name="Microsoft.CodeAnalysis.Razor" Version="3.0.0-preview7.19304.5">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>6fcd12e60b3d828988cabdebb55d30397c21d0db</Sha>
<Sha>1954d93d9091707fef3958e63fc39b20325696df</Sha>
</Dependency>
<Dependency Name="Microsoft.NET.Sdk.Razor" Version="3.0.0-preview7.19303.10">
<Dependency Name="Microsoft.NET.Sdk.Razor" Version="3.0.0-preview7.19304.5">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>6fcd12e60b3d828988cabdebb55d30397c21d0db</Sha>
<Sha>1954d93d9091707fef3958e63fc39b20325696df</Sha>
</Dependency>
<Dependency Name="dotnet-ef" Version="3.0.0-preview7.19303.12">
<Dependency Name="dotnet-ef" Version="3.0.0-preview7.19304.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>b9c9b57de1ba41f75427db0a51b2e897d0354656</Sha>
<Sha>d09c10d233d284cd6406e04c31730c520c0e5cc5</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="3.0.0-preview7.19303.12">
<Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="3.0.0-preview7.19304.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>b9c9b57de1ba41f75427db0a51b2e897d0354656</Sha>
<Sha>d09c10d233d284cd6406e04c31730c520c0e5cc5</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="3.0.0-preview7.19303.12">
<Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="3.0.0-preview7.19304.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>b9c9b57de1ba41f75427db0a51b2e897d0354656</Sha>
<Sha>d09c10d233d284cd6406e04c31730c520c0e5cc5</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0-preview7.19303.12">
<Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0-preview7.19304.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>b9c9b57de1ba41f75427db0a51b2e897d0354656</Sha>
<Sha>d09c10d233d284cd6406e04c31730c520c0e5cc5</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview7.19303.12">
<Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview7.19304.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>b9c9b57de1ba41f75427db0a51b2e897d0354656</Sha>
<Sha>d09c10d233d284cd6406e04c31730c520c0e5cc5</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0-preview7.19303.12">
<Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0-preview7.19304.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>b9c9b57de1ba41f75427db0a51b2e897d0354656</Sha>
<Sha>d09c10d233d284cd6406e04c31730c520c0e5cc5</Sha>
</Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore" Version="3.0.0-preview7.19303.12">
<Dependency Name="Microsoft.EntityFrameworkCore" Version="3.0.0-preview7.19304.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>b9c9b57de1ba41f75427db0a51b2e897d0354656</Sha>
<Sha>d09c10d233d284cd6406e04c31730c520c0e5cc5</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.ActivatorUtilities.Sources" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.ActivatorUtilities.Sources" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.Memory" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Caching.Memory" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.CommandLineUtils.Sources" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.CommandLineUtils.Sources" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Json" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.Json" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.KeyPerFile" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.KeyPerFile" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Configuration" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Configuration" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DependencyInjection" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.DependencyInjection" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Embedded" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.FileProviders.Embedded" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.HashCodeCombiner.Sources" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.HashCodeCombiner.Sources" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Hosting" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Hosting" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Http" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Http" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Localization.Abstractions" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Localization.Abstractions" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Localization" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Localization" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Console" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.Console" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Debug" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.Debug" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Testing" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging.Testing" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Logging" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Logging" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.ObjectPool" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.ObjectPool" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Options" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Options" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.ParameterDefaultValue.Sources" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.ParameterDefaultValue.Sources" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.Primitives" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.Primitives" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.TypeNameHelper.Sources" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.TypeNameHelper.Sources" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.ValueStopwatch.Sources" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.ValueStopwatch.Sources" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.WebEncoders" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Extensions.WebEncoders" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.Internal.Extensions.Refs" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.Internal.Extensions.Refs" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.JSInterop" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.JSInterop" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Mono.WebAssembly.Interop" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Mono.WebAssembly.Interop" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.CSharp" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="Microsoft.CSharp" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="Microsoft.Win32.Registry" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="Microsoft.Win32.Registry" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.ComponentModel.Annotations" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.ComponentModel.Annotations" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.Data.SqlClient" Version="4.7.0-preview6.19264.9" CoherentParentDependency="Microsoft.NETCore.App" Pinned="true">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>a28176b5ec68b6da1472934fe9493790d1665cae</Sha>
</Dependency>
<Dependency Name="System.Diagnostics.EventLog" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Diagnostics.EventLog" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.IO.Pipelines" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.IO.Pipelines" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.Net.Http.WinHttpHandler" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Net.Http.WinHttpHandler" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.Reflection.Metadata" Version="1.7.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Reflection.Metadata" Version="1.7.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.Security.Cryptography.Cng" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Security.Cryptography.Cng" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.Security.Cryptography.Pkcs" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Security.Cryptography.Pkcs" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.Security.Cryptography.Xml" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Security.Cryptography.Xml" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.Security.Permissions" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Security.Permissions" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.Security.Principal.Windows" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Security.Principal.Windows" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.ServiceProcess.ServiceController" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.ServiceProcess.ServiceController" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.Text.Encodings.Web" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Text.Encodings.Web" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.Text.Json" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Text.Json" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="System.Threading.Channels" Version="4.6.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="System.Threading.Channels" Version="4.6.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="Microsoft.Extensions.DependencyModel" Version="3.0.0-preview6-27804-01" CoherentParentDependency="Microsoft.Extensions.Logging">
<Dependency Name="Microsoft.Extensions.DependencyModel" Version="3.0.0-preview7-27803-11" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>fdf81c6faf7c7e0463d191a3a1d36c25c201e5cb</Sha>
<Sha>c113140681cdb8224dffc2da8df3e2f9bcbdc4a0</Sha>
</Dependency>
<Dependency Name="Microsoft.NETCore.App" Version="3.0.0-preview6-27804-01" CoherentParentDependency="Microsoft.Extensions.Logging">
<Dependency Name="Microsoft.NETCore.App" Version="3.0.0-preview7-27803-11" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>fdf81c6faf7c7e0463d191a3a1d36c25c201e5cb</Sha>
<Sha>c113140681cdb8224dffc2da8df3e2f9bcbdc4a0</Sha>
</Dependency>
<Dependency Name="NETStandard.Library.Ref" Version="2.1.0-preview6-27804-01" CoherentParentDependency="Microsoft.Extensions.Logging">
<Dependency Name="NETStandard.Library.Ref" Version="2.1.0-preview7-27803-11" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>fdf81c6faf7c7e0463d191a3a1d36c25c201e5cb</Sha>
<Sha>c113140681cdb8224dffc2da8df3e2f9bcbdc4a0</Sha>
</Dependency>
</ProductDependencies>
<ToolsetDependencies>
<!-- Listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
<Dependency Name="Microsoft.NETCore.Platforms" Version="3.0.0-preview6.19303.8" CoherentParentDependency="Microsoft.NETCore.App">
<Dependency Name="Microsoft.NETCore.Platforms" Version="3.0.0-preview7.19303.5" CoherentParentDependency="Microsoft.NETCore.App">
<Uri>https://github.com/dotnet/corefx</Uri>
<Sha>d47cae744ddfb625db8e391cecb261e4c3d7bb1c</Sha>
<Sha>55950a7c733de83f2efbafd3b5cad23e3ea6873a</Sha>
</Dependency>
<Dependency Name="Internal.AspNetCore.Analyzers" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Internal.AspNetCore.Analyzers" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
<Dependency Name="Microsoft.DotNet.GenAPI" Version="1.0.0-beta.19302.2">
<Uri>https://github.com/dotnet/arcade</Uri>
@ -404,9 +404,9 @@
<Uri>https://github.com/dotnet/arcade</Uri>
<Sha>e6a5d5f970bb872451c6310ae34eda31041fb552</Sha>
</Dependency>
<Dependency Name="Microsoft.AspNetCore.Testing" Version="3.0.0-preview6.19304.6" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Dependency Name="Microsoft.AspNetCore.Testing" Version="3.0.0-preview7.19304.12" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>54d51a340698b6883dd3e47be372c07e0acf75bc</Sha>
<Sha>ef5d488c054c3aa850c29c10d851fcdc8a004eed</Sha>
</Dependency>
</ToolsetDependencies>
</Dependencies>

Просмотреть файл

@ -23,108 +23,108 @@
<!-- Packages from dotnet/arcade -->
<MicrosoftDotNetGenAPIPackageVersion>1.0.0-beta.19302.2</MicrosoftDotNetGenAPIPackageVersion>
<!-- Packages from dotnet/core-setup -->
<MicrosoftExtensionsDependencyModelPackageVersion>3.0.0-preview6-27804-01</MicrosoftExtensionsDependencyModelPackageVersion>
<MicrosoftNETCoreAppPackageVersion>3.0.0-preview6-27804-01</MicrosoftNETCoreAppPackageVersion>
<NETStandardLibraryRefPackageVersion>2.1.0-preview6-27804-01</NETStandardLibraryRefPackageVersion>
<MicrosoftExtensionsDependencyModelPackageVersion>3.0.0-preview7-27803-11</MicrosoftExtensionsDependencyModelPackageVersion>
<MicrosoftNETCoreAppPackageVersion>3.0.0-preview7-27803-11</MicrosoftNETCoreAppPackageVersion>
<NETStandardLibraryRefPackageVersion>2.1.0-preview7-27803-11</NETStandardLibraryRefPackageVersion>
<!-- Packages from dotnet/corefx -->
<MicrosoftCSharpPackageVersion>4.6.0-preview6.19303.8</MicrosoftCSharpPackageVersion>
<MicrosoftWin32RegistryPackageVersion>4.6.0-preview6.19303.8</MicrosoftWin32RegistryPackageVersion>
<SystemComponentModelAnnotationsPackageVersion>4.6.0-preview6.19303.8</SystemComponentModelAnnotationsPackageVersion>
<MicrosoftCSharpPackageVersion>4.6.0-preview7.19303.5</MicrosoftCSharpPackageVersion>
<MicrosoftWin32RegistryPackageVersion>4.6.0-preview7.19303.5</MicrosoftWin32RegistryPackageVersion>
<SystemComponentModelAnnotationsPackageVersion>4.6.0-preview7.19303.5</SystemComponentModelAnnotationsPackageVersion>
<SystemDataSqlClientPackageVersion>4.7.0-preview6.19264.9</SystemDataSqlClientPackageVersion>
<SystemDiagnosticsEventLogPackageVersion>4.6.0-preview6.19303.8</SystemDiagnosticsEventLogPackageVersion>
<SystemIOPipelinesPackageVersion>4.6.0-preview6.19303.8</SystemIOPipelinesPackageVersion>
<SystemNetHttpWinHttpHandlerPackageVersion>4.6.0-preview6.19303.8</SystemNetHttpWinHttpHandlerPackageVersion>
<SystemNetWebSocketsWebSocketProtocolPackageVersion>4.6.0-preview6.19303.8</SystemNetWebSocketsWebSocketProtocolPackageVersion>
<SystemReflectionMetadataPackageVersion>1.7.0-preview6.19303.8</SystemReflectionMetadataPackageVersion>
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.6.0-preview6.19303.8</SystemRuntimeCompilerServicesUnsafePackageVersion>
<SystemSecurityCryptographyCngPackageVersion>4.6.0-preview6.19303.8</SystemSecurityCryptographyCngPackageVersion>
<SystemSecurityCryptographyPkcsPackageVersion>4.6.0-preview6.19303.8</SystemSecurityCryptographyPkcsPackageVersion>
<SystemSecurityCryptographyXmlPackageVersion>4.6.0-preview6.19303.8</SystemSecurityCryptographyXmlPackageVersion>
<SystemSecurityPermissionsPackageVersion>4.6.0-preview6.19303.8</SystemSecurityPermissionsPackageVersion>
<SystemSecurityPrincipalWindowsPackageVersion>4.6.0-preview6.19303.8</SystemSecurityPrincipalWindowsPackageVersion>
<SystemServiceProcessServiceControllerPackageVersion>4.6.0-preview6.19303.8</SystemServiceProcessServiceControllerPackageVersion>
<SystemTextEncodingsWebPackageVersion>4.6.0-preview6.19303.8</SystemTextEncodingsWebPackageVersion>
<SystemTextJsonPackageVersion>4.6.0-preview6.19303.8</SystemTextJsonPackageVersion>
<SystemThreadingChannelsPackageVersion>4.6.0-preview6.19303.8</SystemThreadingChannelsPackageVersion>
<SystemDiagnosticsEventLogPackageVersion>4.6.0-preview7.19303.5</SystemDiagnosticsEventLogPackageVersion>
<SystemIOPipelinesPackageVersion>4.6.0-preview7.19303.5</SystemIOPipelinesPackageVersion>
<SystemNetHttpWinHttpHandlerPackageVersion>4.6.0-preview7.19303.5</SystemNetHttpWinHttpHandlerPackageVersion>
<SystemNetWebSocketsWebSocketProtocolPackageVersion>4.6.0-preview7.19303.5</SystemNetWebSocketsWebSocketProtocolPackageVersion>
<SystemReflectionMetadataPackageVersion>1.7.0-preview7.19303.5</SystemReflectionMetadataPackageVersion>
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.6.0-preview7.19303.5</SystemRuntimeCompilerServicesUnsafePackageVersion>
<SystemSecurityCryptographyCngPackageVersion>4.6.0-preview7.19303.5</SystemSecurityCryptographyCngPackageVersion>
<SystemSecurityCryptographyPkcsPackageVersion>4.6.0-preview7.19303.5</SystemSecurityCryptographyPkcsPackageVersion>
<SystemSecurityCryptographyXmlPackageVersion>4.6.0-preview7.19303.5</SystemSecurityCryptographyXmlPackageVersion>
<SystemSecurityPermissionsPackageVersion>4.6.0-preview7.19303.5</SystemSecurityPermissionsPackageVersion>
<SystemSecurityPrincipalWindowsPackageVersion>4.6.0-preview7.19303.5</SystemSecurityPrincipalWindowsPackageVersion>
<SystemServiceProcessServiceControllerPackageVersion>4.6.0-preview7.19303.5</SystemServiceProcessServiceControllerPackageVersion>
<SystemTextEncodingsWebPackageVersion>4.6.0-preview7.19303.5</SystemTextEncodingsWebPackageVersion>
<SystemTextJsonPackageVersion>4.6.0-preview7.19303.5</SystemTextJsonPackageVersion>
<SystemThreadingChannelsPackageVersion>4.6.0-preview7.19303.5</SystemThreadingChannelsPackageVersion>
<!-- Only listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
<MicrosoftNETCorePlatformsPackageVersion>3.0.0-preview6.19303.8</MicrosoftNETCorePlatformsPackageVersion>
<MicrosoftNETCorePlatformsPackageVersion>3.0.0-preview7.19303.5</MicrosoftNETCorePlatformsPackageVersion>
<!-- Packages from aspnet/Blazor -->
<MicrosoftAspNetCoreBlazorMonoPackageVersion>0.10.0-preview7.19303.2</MicrosoftAspNetCoreBlazorMonoPackageVersion>
<!-- Packages from aspnet/Extensions -->
<InternalAspNetCoreAnalyzersPackageVersion>3.0.0-preview6.19304.6</InternalAspNetCoreAnalyzersPackageVersion>
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.0.0-preview6.19304.6</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>3.0.0-preview6.19304.6</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
<MicrosoftAspNetCoreTestingPackageVersion>3.0.0-preview6.19304.6</MicrosoftAspNetCoreTestingPackageVersion>
<MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>
<MicrosoftExtensionsCachingAbstractionsPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsCachingAbstractionsPackageVersion>
<MicrosoftExtensionsCachingMemoryPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsCachingMemoryPackageVersion>
<MicrosoftExtensionsCachingSqlServerPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsCachingSqlServerPackageVersion>
<MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>
<MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>
<MicrosoftExtensionsConfigurationAbstractionsPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
<MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>
<MicrosoftExtensionsConfigurationBinderPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsConfigurationBinderPackageVersion>
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
<MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>
<MicrosoftExtensionsConfigurationIniPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsConfigurationIniPackageVersion>
<MicrosoftExtensionsConfigurationJsonPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsConfigurationJsonPackageVersion>
<MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>
<MicrosoftExtensionsConfigurationPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsConfigurationPackageVersion>
<MicrosoftExtensionsConfigurationUserSecretsPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsConfigurationUserSecretsPackageVersion>
<MicrosoftExtensionsConfigurationXmlPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsConfigurationXmlPackageVersion>
<MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>
<MicrosoftExtensionsDependencyInjectionPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsDependencyInjectionPackageVersion>
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
<MicrosoftExtensionsFileProvidersCompositePackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsFileProvidersCompositePackageVersion>
<MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>
<MicrosoftExtensionsFileProvidersPhysicalPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsFileProvidersPhysicalPackageVersion>
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
<MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>
<MicrosoftExtensionsHostingAbstractionsPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsHostingAbstractionsPackageVersion>
<MicrosoftExtensionsHostingPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsHostingPackageVersion>
<MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>
<MicrosoftExtensionsHttpPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsHttpPackageVersion>
<MicrosoftExtensionsLocalizationAbstractionsPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsLocalizationAbstractionsPackageVersion>
<MicrosoftExtensionsLocalizationPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsLocalizationPackageVersion>
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
<MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>
<MicrosoftExtensionsLoggingConfigurationPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsLoggingConfigurationPackageVersion>
<MicrosoftExtensionsLoggingConsolePackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsLoggingConsolePackageVersion>
<MicrosoftExtensionsLoggingDebugPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsLoggingDebugPackageVersion>
<MicrosoftExtensionsLoggingEventSourcePackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsLoggingEventSourcePackageVersion>
<MicrosoftExtensionsLoggingEventLogPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsLoggingEventLogPackageVersion>
<MicrosoftExtensionsLoggingPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsLoggingPackageVersion>
<MicrosoftExtensionsLoggingTestingPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsLoggingTestingPackageVersion>
<MicrosoftExtensionsLoggingTraceSourcePackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsLoggingTraceSourcePackageVersion>
<MicrosoftExtensionsObjectPoolPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsObjectPoolPackageVersion>
<MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>
<MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>
<MicrosoftExtensionsOptionsPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsOptionsPackageVersion>
<MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>
<MicrosoftExtensionsPrimitivesPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsPrimitivesPackageVersion>
<MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>
<MicrosoftExtensionsValueStopwatchSourcesPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsValueStopwatchSourcesPackageVersion>
<MicrosoftExtensionsWebEncodersPackageVersion>3.0.0-preview6.19304.6</MicrosoftExtensionsWebEncodersPackageVersion>
<MicrosoftInternalExtensionsRefsPackageVersion>3.0.0-preview6.19304.6</MicrosoftInternalExtensionsRefsPackageVersion>
<MicrosoftJSInteropPackageVersion>3.0.0-preview6.19304.6</MicrosoftJSInteropPackageVersion>
<MonoWebAssemblyInteropPackageVersion>3.0.0-preview6.19304.6</MonoWebAssemblyInteropPackageVersion>
<InternalAspNetCoreAnalyzersPackageVersion>3.0.0-preview7.19304.12</InternalAspNetCoreAnalyzersPackageVersion>
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.0.0-preview7.19304.12</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>3.0.0-preview7.19304.12</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
<MicrosoftAspNetCoreTestingPackageVersion>3.0.0-preview7.19304.12</MicrosoftAspNetCoreTestingPackageVersion>
<MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>
<MicrosoftExtensionsCachingAbstractionsPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsCachingAbstractionsPackageVersion>
<MicrosoftExtensionsCachingMemoryPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsCachingMemoryPackageVersion>
<MicrosoftExtensionsCachingSqlServerPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsCachingSqlServerPackageVersion>
<MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>
<MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>
<MicrosoftExtensionsConfigurationAbstractionsPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
<MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>
<MicrosoftExtensionsConfigurationBinderPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsConfigurationBinderPackageVersion>
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
<MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>
<MicrosoftExtensionsConfigurationIniPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsConfigurationIniPackageVersion>
<MicrosoftExtensionsConfigurationJsonPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsConfigurationJsonPackageVersion>
<MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>
<MicrosoftExtensionsConfigurationPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsConfigurationPackageVersion>
<MicrosoftExtensionsConfigurationUserSecretsPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsConfigurationUserSecretsPackageVersion>
<MicrosoftExtensionsConfigurationXmlPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsConfigurationXmlPackageVersion>
<MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>
<MicrosoftExtensionsDependencyInjectionPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsDependencyInjectionPackageVersion>
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
<MicrosoftExtensionsFileProvidersCompositePackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsFileProvidersCompositePackageVersion>
<MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>
<MicrosoftExtensionsFileProvidersPhysicalPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsFileProvidersPhysicalPackageVersion>
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
<MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>
<MicrosoftExtensionsHostingAbstractionsPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsHostingAbstractionsPackageVersion>
<MicrosoftExtensionsHostingPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsHostingPackageVersion>
<MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>
<MicrosoftExtensionsHttpPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsHttpPackageVersion>
<MicrosoftExtensionsLocalizationAbstractionsPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsLocalizationAbstractionsPackageVersion>
<MicrosoftExtensionsLocalizationPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsLocalizationPackageVersion>
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
<MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>
<MicrosoftExtensionsLoggingConfigurationPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsLoggingConfigurationPackageVersion>
<MicrosoftExtensionsLoggingConsolePackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsLoggingConsolePackageVersion>
<MicrosoftExtensionsLoggingDebugPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsLoggingDebugPackageVersion>
<MicrosoftExtensionsLoggingEventSourcePackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsLoggingEventSourcePackageVersion>
<MicrosoftExtensionsLoggingEventLogPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsLoggingEventLogPackageVersion>
<MicrosoftExtensionsLoggingPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsLoggingPackageVersion>
<MicrosoftExtensionsLoggingTestingPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsLoggingTestingPackageVersion>
<MicrosoftExtensionsLoggingTraceSourcePackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsLoggingTraceSourcePackageVersion>
<MicrosoftExtensionsObjectPoolPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsObjectPoolPackageVersion>
<MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>
<MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>
<MicrosoftExtensionsOptionsPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsOptionsPackageVersion>
<MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>
<MicrosoftExtensionsPrimitivesPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsPrimitivesPackageVersion>
<MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>
<MicrosoftExtensionsValueStopwatchSourcesPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsValueStopwatchSourcesPackageVersion>
<MicrosoftExtensionsWebEncodersPackageVersion>3.0.0-preview7.19304.12</MicrosoftExtensionsWebEncodersPackageVersion>
<MicrosoftInternalExtensionsRefsPackageVersion>3.0.0-preview7.19304.12</MicrosoftInternalExtensionsRefsPackageVersion>
<MicrosoftJSInteropPackageVersion>3.0.0-preview7.19304.12</MicrosoftJSInteropPackageVersion>
<MonoWebAssemblyInteropPackageVersion>3.0.0-preview7.19304.12</MonoWebAssemblyInteropPackageVersion>
<!-- Packages from aspnet/EntityFrameworkCore -->
<dotnetefPackageVersion>3.0.0-preview7.19303.12</dotnetefPackageVersion>
<MicrosoftEntityFrameworkCoreInMemoryPackageVersion>3.0.0-preview7.19303.12</MicrosoftEntityFrameworkCoreInMemoryPackageVersion>
<MicrosoftEntityFrameworkCoreRelationalPackageVersion>3.0.0-preview7.19303.12</MicrosoftEntityFrameworkCoreRelationalPackageVersion>
<MicrosoftEntityFrameworkCoreSqlitePackageVersion>3.0.0-preview7.19303.12</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
<MicrosoftEntityFrameworkCoreSqlServerPackageVersion>3.0.0-preview7.19303.12</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
<MicrosoftEntityFrameworkCoreToolsPackageVersion>3.0.0-preview7.19303.12</MicrosoftEntityFrameworkCoreToolsPackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>3.0.0-preview7.19303.12</MicrosoftEntityFrameworkCorePackageVersion>
<dotnetefPackageVersion>3.0.0-preview7.19304.9</dotnetefPackageVersion>
<MicrosoftEntityFrameworkCoreInMemoryPackageVersion>3.0.0-preview7.19304.9</MicrosoftEntityFrameworkCoreInMemoryPackageVersion>
<MicrosoftEntityFrameworkCoreRelationalPackageVersion>3.0.0-preview7.19304.9</MicrosoftEntityFrameworkCoreRelationalPackageVersion>
<MicrosoftEntityFrameworkCoreSqlitePackageVersion>3.0.0-preview7.19304.9</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
<MicrosoftEntityFrameworkCoreSqlServerPackageVersion>3.0.0-preview7.19304.9</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
<MicrosoftEntityFrameworkCoreToolsPackageVersion>3.0.0-preview7.19304.9</MicrosoftEntityFrameworkCoreToolsPackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>3.0.0-preview7.19304.9</MicrosoftEntityFrameworkCorePackageVersion>
<!-- Packages from aspnet/AspNetCore-Tooling -->
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.0.0-preview7.19303.10</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
<MicrosoftAspNetCoreRazorLanguagePackageVersion>3.0.0-preview7.19303.10</MicrosoftAspNetCoreRazorLanguagePackageVersion>
<MicrosoftCodeAnalysisRazorPackageVersion>3.0.0-preview7.19303.10</MicrosoftCodeAnalysisRazorPackageVersion>
<MicrosoftNETSdkRazorPackageVersion>3.0.0-preview7.19303.10</MicrosoftNETSdkRazorPackageVersion>
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.0.0-preview7.19304.5</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
<MicrosoftAspNetCoreRazorLanguagePackageVersion>3.0.0-preview7.19304.5</MicrosoftAspNetCoreRazorLanguagePackageVersion>
<MicrosoftCodeAnalysisRazorPackageVersion>3.0.0-preview7.19304.5</MicrosoftCodeAnalysisRazorPackageVersion>
<MicrosoftNETSdkRazorPackageVersion>3.0.0-preview7.19304.5</MicrosoftNETSdkRazorPackageVersion>
</PropertyGroup>
<!--

Просмотреть файл

@ -12,9 +12,4 @@
<_ProjectExtensionsWereImported>true</_ProjectExtensionsWereImported>
<WixTargetsPath>$(WixInstallPath)\wix2010.targets</WixTargetsPath>
</PropertyGroup>
<!-- Workaround https://developercommunity.visualstudio.com/content/problem/434385/vs2019-preview-2-targetframeworkversion-or-platfor.html -->
<PropertyGroup>
<VCToolsVersion Condition = "'$(VCToolsVersion)' == ''" >14.16.27023</VCToolsVersion>
</PropertyGroup>
</Project>

Просмотреть файл

@ -17,8 +17,6 @@
"Microsoft.VisualStudio.Component.NuGet.BuildTools",
"Microsoft.VisualStudio.Component.VC.ATL",
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
"Microsoft.VisualStudio.Component.VC.v141.ATL",
"Microsoft.VisualStudio.Component.VC.v141.x86.x64",
"Microsoft.VisualStudio.Component.Windows10SDK.17134",
"Microsoft.VisualStudio.Workload.ManagedDesktopBuildTools",
"Microsoft.VisualStudio.Workload.MSBuildTools",

Просмотреть файл

@ -15,8 +15,6 @@
"Microsoft.VisualStudio.Component.Azure.Storage.Emulator",
"Microsoft.VisualStudio.Component.VC.ATL",
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
"Microsoft.VisualStudio.Component.VC.v141.ATL",
"Microsoft.VisualStudio.Component.VC.v141.x86.x64",
"Microsoft.VisualStudio.Component.Windows10SDK.17134",
"Microsoft.VisualStudio.Workload.ManagedDesktop",
"Microsoft.VisualStudio.Workload.NativeDesktop",

Просмотреть файл

@ -16,8 +16,6 @@
"requiredWorkloads": [
"Microsoft.VisualStudio.Component.VC.ATL",
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
"Microsoft.VisualStudio.Component.VC.v141.ATL",
"Microsoft.VisualStudio.Component.VC.v141.x86.x64",
"Microsoft.VisualStudio.Component.Windows10SDK.17134"
]
}

Просмотреть файл

@ -145,7 +145,6 @@ namespace Microsoft.AspNetCore.Hosting.Internal
public static void Initialize(this Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment, string contentRootPath, Microsoft.AspNetCore.Hosting.Internal.WebHostOptions options) { }
public static void Initialize(this Microsoft.AspNetCore.Hosting.IWebHostEnvironment hostingEnvironment, string contentRootPath, Microsoft.AspNetCore.Hosting.Internal.WebHostOptions options) { }
}
[System.Diagnostics.Tracing.EventSourceAttribute(Name="Microsoft-AspNetCore-Hosting")]
public sealed partial class HostingEventSource : System.Diagnostics.Tracing.EventSource
{
internal HostingEventSource() { }
@ -154,6 +153,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
public void HostStart() { }
[System.Diagnostics.Tracing.EventAttribute(2, Level=System.Diagnostics.Tracing.EventLevel.Informational)]
public void HostStop() { }
protected override void OnEventCommand(System.Diagnostics.Tracing.EventCommandEventArgs command) { }
[System.Diagnostics.Tracing.EventAttribute(3, Level=System.Diagnostics.Tracing.EventLevel.Informational)]
public void RequestStart(string method, string path) { }
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)][System.Diagnostics.Tracing.EventAttribute(4, Level=System.Diagnostics.Tracing.EventLevel.Informational)]

Просмотреть файл

@ -136,10 +136,19 @@ namespace Microsoft.AspNetCore.Hosting.Internal
StopActivity(httpContext, activity, context.HasDiagnosticListener);
}
if (context.EventLogEnabled && exception != null)
if (context.EventLogEnabled)
{
// Non-inline
HostingEventSource.Log.UnhandledException();
if (exception != null)
{
// Non-inline
HostingEventSource.Log.UnhandledException();
}
// Count 500 as failed requests
if (httpContext.Response.StatusCode >= 500)
{
HostingEventSource.Log.RequestFailed();
}
}
// Logging Scope is finshed with

Просмотреть файл

@ -1,17 +1,37 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Diagnostics.Tracing;
using System.Runtime.CompilerServices;
using System.Threading;
namespace Microsoft.AspNetCore.Hosting.Internal
{
[EventSource(Name = "Microsoft-AspNetCore-Hosting")]
public sealed class HostingEventSource : EventSource
{
public static readonly HostingEventSource Log = new HostingEventSource();
private HostingEventSource() { }
private IncrementingPollingCounter _requestsPerSecondCounter;
private PollingCounter _totalRequestsCounter;
private PollingCounter _failedRequestsCounter;
private PollingCounter _currentRequestsCounter;
private long _totalRequests;
private long _currentRequests;
private long _failedRequests;
internal HostingEventSource()
: this("Microsoft.AspNetCore.Hosting")
{
}
// Used for testing
internal HostingEventSource(string eventSourceName)
: base(eventSourceName)
{
}
// NOTE
// - The 'Start' and 'Stop' suffixes on the following event names have special meaning in EventSource. They
@ -35,6 +55,8 @@ namespace Microsoft.AspNetCore.Hosting.Internal
[Event(3, Level = EventLevel.Informational)]
public void RequestStart(string method, string path)
{
Interlocked.Increment(ref _totalRequests);
Interlocked.Increment(ref _currentRequests);
WriteEvent(3, method, path);
}
@ -42,6 +64,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
[Event(4, Level = EventLevel.Informational)]
public void RequestStop()
{
Interlocked.Decrement(ref _currentRequests);
WriteEvent(4);
}
@ -51,5 +74,40 @@ namespace Microsoft.AspNetCore.Hosting.Internal
{
WriteEvent(5);
}
internal void RequestFailed()
{
Interlocked.Increment(ref _failedRequests);
}
protected override void OnEventCommand(EventCommandEventArgs command)
{
if (command.Command == EventCommand.Enable)
{
// This is the convention for initializing counters in the RuntimeEventSource (lazily on the first enable command).
// They aren't disabled afterwards...
_requestsPerSecondCounter ??= new IncrementingPollingCounter("requests-per-second", this, () => _totalRequests)
{
DisplayName = "Request Rate",
DisplayRateTimeScale = TimeSpan.FromSeconds(1)
};
_totalRequestsCounter ??= new PollingCounter("total-requests", this, () => _totalRequests)
{
DisplayName = "Total Requests",
};
_currentRequestsCounter ??= new PollingCounter("current-requests", this, () => _currentRequests)
{
DisplayName = "Current Requests"
};
_failedRequestsCounter ??= new PollingCounter("failed-requests", this, () => _failedRequests)
{
DisplayName = "Failed Requests"
};
}
}
}
}

Просмотреть файл

@ -0,0 +1,23 @@
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace System.Collections.Generic
{
internal static class AsyncEnumerableExtensions
{
public static async Task<T> FirstOrDefault<T>(this IAsyncEnumerator<T> values, Func<T, bool> filter)
{
while (await values.MoveNextAsync())
{
if (filter(values.Current))
{
return values.Current;
}
}
return default;
}
}
}

Просмотреть файл

@ -2,8 +2,11 @@
// 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.Tracing;
using System.Reflection;
using System.Threading;
using System.Threading.Channels;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit;
@ -17,16 +20,11 @@ namespace Microsoft.AspNetCore.Hosting.Internal
public void MatchesNameAndGuid()
{
// Arrange & Act
var eventSourceType = typeof(WebHost).GetTypeInfo().Assembly.GetType(
"Microsoft.AspNetCore.Hosting.Internal.HostingEventSource",
throwOnError: true,
ignoreCase: false);
var eventSource = new HostingEventSource();
// Assert
Assert.NotNull(eventSourceType);
Assert.Equal("Microsoft-AspNetCore-Hosting", EventSource.GetName(eventSourceType));
Assert.Equal(Guid.Parse("9e620d2a-55d4-5ade-deb7-c26046d245a8"), EventSource.GetGuid(eventSourceType));
Assert.NotEmpty(EventSource.GenerateManifest(eventSourceType, "assemblyPathToIncludeInManifest"));
Assert.Equal("Microsoft.AspNetCore.Hosting", eventSource.Name);
Assert.Equal(Guid.Parse("9ded64a4-414c-5251-dcf7-1e4e20c15e70"), eventSource.Guid);
}
[Fact]
@ -35,7 +33,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
// Arrange
var expectedEventId = 1;
var eventListener = new TestEventListener(expectedEventId);
var hostingEventSource = HostingEventSource.Log;
var hostingEventSource = GetHostingEventSource();
eventListener.EnableEvents(hostingEventSource, EventLevel.Informational);
// Act
@ -58,7 +56,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
// Arrange
var expectedEventId = 2;
var eventListener = new TestEventListener(expectedEventId);
var hostingEventSource = HostingEventSource.Log;
var hostingEventSource = GetHostingEventSource();
eventListener.EnableEvents(hostingEventSource, EventLevel.Informational);
// Act
@ -115,7 +113,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
// Arrange
var expectedEventId = 3;
var eventListener = new TestEventListener(expectedEventId);
var hostingEventSource = HostingEventSource.Log;
var hostingEventSource = GetHostingEventSource();
eventListener.EnableEvents(hostingEventSource, EventLevel.Informational);
// Act
@ -144,7 +142,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
// Arrange
var expectedEventId = 4;
var eventListener = new TestEventListener(expectedEventId);
var hostingEventSource = HostingEventSource.Log;
var hostingEventSource = GetHostingEventSource();
eventListener.EnableEvents(hostingEventSource, EventLevel.Informational);
// Act
@ -166,7 +164,7 @@ namespace Microsoft.AspNetCore.Hosting.Internal
// Arrange
var expectedEventId = 5;
var eventListener = new TestEventListener(expectedEventId);
var hostingEventSource = HostingEventSource.Log;
var hostingEventSource = GetHostingEventSource();
eventListener.EnableEvents(hostingEventSource, EventLevel.Informational);
// Act
@ -182,16 +180,65 @@ namespace Microsoft.AspNetCore.Hosting.Internal
Assert.Empty(eventData.Payload);
}
private static Exception GetException()
[Fact]
public async Task VerifyCountersFireWithCorrectValues()
{
try
{
throw new InvalidOperationException("An invalid operation has occurred");
}
catch (Exception ex)
{
return ex;
}
// Arrange
var eventListener = new CounterListener(new[] {
"requests-per-second",
"total-requests",
"current-requests",
"failed-requests"
});
var hostingEventSource = GetHostingEventSource();
using var timeoutTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(5));
var rpsValues = eventListener.GetCounterValues("requests-per-second", timeoutTokenSource.Token).GetAsyncEnumerator();
var totalRequestValues = eventListener.GetCounterValues("total-requests", timeoutTokenSource.Token).GetAsyncEnumerator();
var currentRequestValues = eventListener.GetCounterValues("current-requests", timeoutTokenSource.Token).GetAsyncEnumerator();
var failedRequestValues = eventListener.GetCounterValues("failed-requests", timeoutTokenSource.Token).GetAsyncEnumerator();
eventListener.EnableEvents(hostingEventSource, EventLevel.Informational, EventKeywords.None,
new Dictionary<string, string>
{
{ "EventCounterIntervalSec", "1" }
});
hostingEventSource.RequestStart("GET", "/");
Assert.Equal(1, await totalRequestValues.FirstOrDefault(v => v == 1));
Assert.Equal(1, await rpsValues.FirstOrDefault(v => v == 1));
Assert.Equal(1, await currentRequestValues.FirstOrDefault(v => v == 1));
Assert.Equal(0, await failedRequestValues.FirstOrDefault(v => v == 0));
hostingEventSource.RequestStop();
Assert.Equal(1, await totalRequestValues.FirstOrDefault(v => v == 1));
Assert.Equal(0, await rpsValues.FirstOrDefault(v => v == 0));
Assert.Equal(0, await currentRequestValues.FirstOrDefault(v => v == 0));
Assert.Equal(0, await failedRequestValues.FirstOrDefault(v => v == 0));
hostingEventSource.RequestStart("POST", "/");
Assert.Equal(2, await totalRequestValues.FirstOrDefault(v => v == 2));
Assert.Equal(1, await rpsValues.FirstOrDefault(v => v == 1));
Assert.Equal(1, await currentRequestValues.FirstOrDefault(v => v == 1));
Assert.Equal(0, await failedRequestValues.FirstOrDefault(v => v == 0));
hostingEventSource.RequestFailed();
hostingEventSource.RequestStop();
Assert.Equal(2, await totalRequestValues.FirstOrDefault(v => v == 2));
Assert.Equal(0, await rpsValues.FirstOrDefault(v => v == 0));
Assert.Equal(0, await currentRequestValues.FirstOrDefault(v => v == 0));
Assert.Equal(1, await failedRequestValues.FirstOrDefault(v => v == 1));
}
private static HostingEventSource GetHostingEventSource()
{
return new HostingEventSource(Guid.NewGuid().ToString());
}
private class TestEventListener : EventListener
@ -216,5 +263,36 @@ namespace Microsoft.AspNetCore.Hosting.Internal
}
}
}
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));
}
}
}
}
}

Просмотреть файл

@ -19,6 +19,7 @@
<Reference Include="Microsoft.Extensions.Hosting" />
<Reference Include="Microsoft.Extensions.Logging.Testing" />
<Reference Include="Microsoft.Extensions.Options" />
<Reference Include="System.Threading.Channels" />
</ItemGroup>
</Project>

Просмотреть файл

@ -312,8 +312,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore
throw new ArgumentNullException(nameof(user));
}
// TODO: Fix once EF query works Issue #10668
return (await UserClaims.Where(uc => uc.UserId.Equals(user.Id)).ToListAsync(cancellationToken)).Select(c => c.ToClaim()).ToList();
return await UserClaims.Where(uc => uc.UserId.Equals(user.Id)).Select(c => c.ToClaim()).ToListAsync(cancellationToken);
}
/// <summary>

Просмотреть файл

@ -445,8 +445,7 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore
throw new ArgumentNullException(nameof(user));
}
// TODO: Fix once EF query works Issue #10668
return (await UserClaims.Where(uc => uc.UserId.Equals(user.Id)).ToListAsync(cancellationToken)).Select(c => c.ToClaim()).ToList();
return await UserClaims.Where(uc => uc.UserId.Equals(user.Id)).Select(c => c.ToClaim()).ToListAsync(cancellationToken);
}
/// <summary>

Просмотреть файл

@ -29,9 +29,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanUpdateNameGuid()
{
using (var db = new CustomDbContext<Guid>(
@ -54,9 +51,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanUpdateNameString()
{
using (var db = new CustomDbContext<string>(
@ -79,9 +73,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanCreateUserInt()
{
using (var db = new CustomDbContext<int>(
@ -102,9 +93,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanCreateUserIntViaSet()
{
using (var db = new CustomDbContext<int>(
@ -126,9 +114,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanUpdateNameInt()
{
using (var db = new CustomDbContext<int>(
@ -151,9 +136,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanUpdateNameIntWithSet()
{
using (var db = new CustomDbContext<int>(

Просмотреть файл

@ -44,11 +44,9 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
{
var count = 0;
// TODO: Use new API once EF is updated. Issue #10671
foreach (var property in context.Model.GetEntityTypes().Single(e => (string)e.FindAnnotation("Relational:TableName")?.Value == table).GetProperties())
foreach (var property in context.Model.GetEntityTypes().Single(e => e.GetTableName() == table).GetProperties())
{
// TODO: Use new API once EF is updated. Issue #10671
if (!columns.Contains((string)property.FindAnnotation("Relational:ColumnName")?.Value ?? property.Name))
if (!columns.Contains(property.GetColumnName()))
{
continue;
}

Просмотреть файл

@ -16,7 +16,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
public class DefaultPocoTest : IClassFixture<ScratchDatabaseFixture>
{
private readonly ApplicationBuilder _builder;
private const string DatabaseName = nameof(DefaultPocoTest);
public DefaultPocoTest(ScratchDatabaseFixture fixture)
{
@ -42,9 +41,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task EnsureStartupUsageWorks()
{
var userStore = _builder.ApplicationServices.GetRequiredService<IUserStore<IdentityUser>>();

Просмотреть файл

@ -15,7 +15,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
public class MaxKeyLengthSchemaTest : IClassFixture<ScratchDatabaseFixture>
{
private readonly ApplicationBuilder _builder;
private const string DatabaseName = nameof(MaxKeyLengthSchemaTest);
public MaxKeyLengthSchemaTest(ScratchDatabaseFixture fixture)
{
@ -49,9 +48,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public void EnsureDefaultSchema()
{
using (var scope = _builder.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())

Просмотреть файл

@ -1,10 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<!-- These tests are broken in Azure Pipelines right now due to deadlocks in EFCore on machines with few CPU cores. -->
<SkipTests Condition=" '$(BUILD_REASON)' == 'PullRequest' ">true</SkipTests>
</PropertyGroup>
<ItemGroup>

Просмотреть файл

@ -2,13 +2,11 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Data.SqlClient;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity.Test;
using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
@ -73,9 +71,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public void EnsureDefaultSchema()
{
VerifyDefaultSchema(CreateContext());
@ -107,9 +102,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task DeleteUserRemovesTokensTest()
{
// Need fail if not empty?
@ -127,9 +119,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public void CanCreateUserUsingEF()
{
using (var db = CreateContext())
@ -143,9 +132,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanCreateUsingManager()
{
var manager = CreateManager();
@ -172,9 +158,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task LoadFromDbFindByIdTest()
{
var db = CreateContext();
@ -191,9 +174,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task LoadFromDbFindByNameTest()
{
var db = CreateContext();
@ -209,9 +189,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task LoadFromDbFindByLoginTest()
{
var db = CreateContext();
@ -227,9 +204,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task LoadFromDbFindByEmailTest()
{
var db = CreateContext();

Просмотреть файл

@ -2,13 +2,11 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Data.SqlClient;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity.Test;
using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
@ -120,9 +118,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public void EnsureDefaultSchema()
{
VerifyDefaultSchema(CreateContext());
@ -155,9 +150,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task DeleteRoleNonEmptySucceedsTest()
{
// Need fail if not empty?
@ -183,9 +175,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task DeleteUserRemovesFromRoleTest()
{
// Need fail if not empty?
@ -209,9 +198,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task DeleteUserRemovesTokensTest()
{
// Need fail if not empty?
@ -229,9 +215,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public void CanCreateUserUsingEF()
{
using (var db = CreateContext())
@ -245,9 +228,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanCreateUsingManager()
{
var manager = CreateManager();
@ -281,9 +261,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task LoadFromDbFindByIdTest()
{
var db = CreateContext();
@ -300,9 +277,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task LoadFromDbFindByNameTest()
{
var db = CreateContext();
@ -318,9 +292,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task LoadFromDbFindByLoginTest()
{
var db = CreateContext();
@ -336,9 +307,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task GetSecurityStampThrowsIfNull()
{
var manager = CreateManager();
@ -350,9 +318,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task LoadFromDbFindByEmailTest()
{
var db = CreateContext();

Просмотреть файл

@ -16,7 +16,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
public class UserOnlyCustomContextTest : IClassFixture<ScratchDatabaseFixture>
{
private readonly ApplicationBuilder _builder;
private const string DatabaseName = nameof(UserOnlyCustomContextTest);
public class CustomContext : DbContext
{
@ -87,9 +86,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task EnsureStartupUsageWorks()
{
var userStore = _builder.ApplicationServices.GetRequiredService<IUserStore<IdentityUser>>();

Просмотреть файл

@ -17,7 +17,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
public class UserOnlyTest : IClassFixture<ScratchDatabaseFixture>
{
private readonly ApplicationBuilder _builder;
private const string DatabaseName = nameof(UserOnlyTest);
public class TestUserDbContext : IdentityUserContext<IdentityUser>
{
@ -49,9 +48,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task EnsureStartupUsageWorks()
{
var userStore = _builder.ApplicationServices.GetRequiredService<IUserStore<IdentityUser>>();
@ -68,9 +64,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task FindByEmailThrowsWithTwoUsersWithSameEmail()
{
var userStore = _builder.ApplicationServices.GetRequiredService<IUserStore<IdentityUser>>();

Просмотреть файл

@ -7,7 +7,6 @@ using System.Linq.Expressions;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity.Test;
using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.AspNetCore.Testing;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
@ -30,9 +29,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public void CanCreateUserUsingEF()
{
using (var db = CreateContext())
@ -167,9 +163,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task CanCreateUsingManager()
{
var manager = CreateManager();
@ -180,9 +173,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task TwoUsersSamePasswordDifferentHash()
{
var manager = CreateManager();
@ -195,9 +185,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task FindByEmailThrowsWithTwoUsersWithSameEmail()
{
var manager = CreateManager();
@ -212,9 +199,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task AddUserToUnknownRoleFails()
{
var manager = CreateManager();
@ -225,9 +209,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task ConcurrentUpdatesWillFail()
{
var options = new DbContextOptionsBuilder().UseSqlite($"Data Source=D{Guid.NewGuid()}.db").Options;
@ -259,9 +240,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task ConcurrentUpdatesWillFailWithDetachedUser()
{
var options = new DbContextOptionsBuilder().UseSqlite($"Data Source=D{Guid.NewGuid()}.db").Options;
@ -291,9 +269,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task DeleteAModifiedUserWillFail()
{
var options = new DbContextOptionsBuilder().UseSqlite($"Data Source=D{Guid.NewGuid()}.db").Options;
@ -324,9 +299,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task ConcurrentRoleUpdatesWillFail()
{
var options = new DbContextOptionsBuilder().UseSqlite($"Data Source=D{Guid.NewGuid()}.db").Options;
@ -358,9 +330,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task ConcurrentRoleUpdatesWillFailWithDetachedRole()
{
var options = new DbContextOptionsBuilder().UseSqlite($"Data Source=D{Guid.NewGuid()}.db").Options;
@ -391,9 +360,6 @@ namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.Test
}
[ConditionalFact]
[FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
public async Task DeleteAModifiedRoleWillFail()
{
var options = new DbContextOptionsBuilder().UseSqlite($"Data Source=D{Guid.NewGuid()}.db").Options;

Просмотреть файл

@ -979,7 +979,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact]
public async Task PasswordValidatorBlocksCreate()
{
// TODO: Can switch to Mock eventually
var manager = MockHelpers.TestUserManager(new EmptyStore());
manager.PasswordValidators.Clear();
manager.PasswordValidators.Add(new BadPasswordValidator<PocoUser>(true));
@ -990,7 +989,6 @@ namespace Microsoft.AspNetCore.Identity.Test
[Fact]
public async Task PasswordValidatorWithoutErrorsBlocksCreate()
{
// TODO: Can switch to Mock eventually
var manager = MockHelpers.TestUserManager(new EmptyStore());
manager.PasswordValidators.Clear();
manager.PasswordValidators.Add(new BadPasswordValidator<PocoUser>());

Просмотреть файл

@ -42,7 +42,7 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup>
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Release'">

Просмотреть файл

@ -31,7 +31,7 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup>
<ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Release'">
<WholeProgramOptimization>false</WholeProgramOptimization>

Просмотреть файл

@ -47,7 +47,7 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup>
<ConfigurationType>StaticLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Release'">
<WholeProgramOptimization>true</WholeProgramOptimization>

Просмотреть файл

@ -74,7 +74,7 @@
<PropertyGroup>
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<PropertyGroup Label="Configuration">

Просмотреть файл

@ -212,12 +212,10 @@ namespace Microsoft.AspNetCore.Mvc
[NonAction]
public virtual ObjectResult StatusCode([ActionResultStatusCode] int statusCode, [ActionResultObjectValue] object value)
{
var result = new ObjectResult(value)
return new ObjectResult(value)
{
StatusCode = statusCode
};
return result;
}
/// <summary>
@ -270,13 +268,11 @@ namespace Microsoft.AspNetCore.Mvc
[NonAction]
public virtual ContentResult Content(string content, MediaTypeHeaderValue contentType)
{
var result = new ContentResult
return new ContentResult
{
Content = content,
ContentType = contentType?.ToString()
};
return result;
}
/// <summary>
@ -1772,9 +1768,7 @@ namespace Microsoft.AspNetCore.Mvc
/// <returns>The created <see cref="UnprocessableEntityResult"/> for the response.</returns>
[NonAction]
public virtual UnprocessableEntityResult UnprocessableEntity()
{
return new UnprocessableEntityResult();
}
=> new UnprocessableEntityResult();
/// <summary>
/// Creates an <see cref="UnprocessableEntityObjectResult"/> that produces a <see cref="StatusCodes.Status422UnprocessableEntity"/> response.
@ -1783,9 +1777,7 @@ namespace Microsoft.AspNetCore.Mvc
/// <returns>The created <see cref="UnprocessableEntityObjectResult"/> for the response.</returns>
[NonAction]
public virtual UnprocessableEntityObjectResult UnprocessableEntity([ActionResultObjectValue] object error)
{
return new UnprocessableEntityObjectResult(error);
}
=> new UnprocessableEntityObjectResult(error);
/// <summary>
/// Creates an <see cref="UnprocessableEntityObjectResult"/> that produces a <see cref="StatusCodes.Status422UnprocessableEntity"/> response.

Просмотреть файл

@ -41,12 +41,7 @@ namespace Microsoft.AspNetCore.Mvc
public PhysicalFileResult(string fileName, MediaTypeHeaderValue contentType)
: base(contentType?.ToString())
{
if (fileName == null)
{
throw new ArgumentNullException(nameof(fileName));
}
FileName = fileName;
FileName = fileName ?? throw new ArgumentNullException(nameof(fileName));
}
/// <summary>
@ -55,15 +50,7 @@ namespace Microsoft.AspNetCore.Mvc
public string FileName
{
get => _fileName;
set
{
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
_fileName = value;
}
set => _fileName = value ?? throw new ArgumentNullException(nameof(value));
}
/// <inheritdoc />

Просмотреть файл

@ -25,13 +25,8 @@ namespace Microsoft.AspNetCore.Mvc
/// </summary>
/// <param name="type">The <see cref="Type"/> of object that is going to be written in the response.</param>
public ProducesAttribute(Type type)
{
if (type == null)
{
throw new ArgumentNullException(nameof(type));
}
Type = type;
{
Type = type ?? throw new ArgumentNullException(nameof(type));
ContentTypes = new MediaTypeCollection();
}

Просмотреть файл

@ -29,12 +29,7 @@ namespace Microsoft.AspNetCore.Mvc
/// <param name="statusCode">The HTTP response status code.</param>
public ProducesResponseTypeAttribute(Type type, int statusCode)
{
if (type == null)
{
throw new ArgumentNullException(nameof(type));
}
Type = type;
Type = type ?? throw new ArgumentNullException(nameof(type));
StatusCode = statusCode;
}

Просмотреть файл

@ -20,12 +20,7 @@ namespace Microsoft.AspNetCore.Mvc
/// <param name="template">The route template. May not be null.</param>
public RouteAttribute(string template)
{
if (template == null)
{
throw new ArgumentNullException(nameof(template));
}
Template = template;
Template = template ?? throw new ArgumentNullException(nameof(template));
}
/// <inheritdoc />

Просмотреть файл

@ -30,12 +30,7 @@ namespace Microsoft.AspNetCore.Mvc
/// <param name="type">The <see cref="Type"/> of filter to find.</param>
public ServiceFilterAttribute(Type type)
{
if (type == null)
{
throw new ArgumentNullException(nameof(type));
}
ServiceType = type;
ServiceType = type ?? throw new ArgumentNullException(nameof(type));
}
/// <inheritdoc />

Просмотреть файл

@ -35,19 +35,9 @@ namespace Microsoft.AspNetCore.Mvc
/// <param name="principal">The claims principal containing the user claims.</param>
/// <param name="properties"><see cref="AuthenticationProperties"/> used to perform the sign-in operation.</param>
public SignInResult(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties)
{
if (authenticationScheme == null)
{
throw new ArgumentNullException(nameof(authenticationScheme));
}
if (principal == null)
{
throw new ArgumentNullException(nameof(principal));
}
AuthenticationScheme = authenticationScheme;
Principal = principal;
{
AuthenticationScheme = authenticationScheme ?? throw new ArgumentNullException(nameof(authenticationScheme));
Principal = principal ?? throw new ArgumentNullException(nameof(principal));
Properties = properties;
}

Просмотреть файл

@ -62,13 +62,8 @@ namespace Microsoft.AspNetCore.Mvc
/// <param name="authenticationSchemes">The authentication scheme to use when signing out the user.</param>
/// <param name="properties"><see cref="AuthenticationProperties"/> used to perform the sign-out operation.</param>
public SignOutResult(IList<string> authenticationSchemes, AuthenticationProperties properties)
{
if (authenticationSchemes == null)
{
throw new ArgumentNullException(nameof(authenticationSchemes));
}
AuthenticationSchemes = authenticationSchemes;
{
AuthenticationSchemes = authenticationSchemes ?? throw new ArgumentNullException(nameof(authenticationSchemes));
Properties = properties;
}

Просмотреть файл

@ -34,12 +34,7 @@ namespace Microsoft.AspNetCore.Mvc
/// <param name="type">The <see cref="Type"/> of filter to create.</param>
public TypeFilterAttribute(Type type)
{
if (type == null)
{
throw new ArgumentNullException(nameof(type));
}
ImplementationType = type;
ImplementationType = type ?? throw new ArgumentNullException(nameof(type));
}
/// <summary>

Просмотреть файл

@ -43,12 +43,7 @@ namespace Microsoft.AspNetCore.Mvc
public VirtualFileResult(string fileName, MediaTypeHeaderValue contentType)
: base(contentType?.ToString())
{
if (fileName == null)
{
throw new ArgumentNullException(nameof(fileName));
}
FileName = fileName;
FileName = fileName ?? throw new ArgumentNullException(nameof(fileName));
}
/// <summary>
@ -56,19 +51,8 @@ namespace Microsoft.AspNetCore.Mvc
/// </summary>
public string FileName
{
get
{
return _fileName;
}
set
{
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
_fileName = value;
}
get => _fileName;
set => _fileName = value ?? throw new ArgumentNullException(nameof(value));
}
/// <summary>

Просмотреть файл

@ -53,7 +53,7 @@ export class LoginComponent implements OnInit {
switch (result.status) {
case AuthenticationResultStatus.Redirect:
// We replace the location here so that in case the user hits the back
// arrow from within the login page he doesn't get into an infinite
// arrow from within the login page they don't get into an infinite
// redirect loop.
window.location.replace(result.redirectUrl);
break;
@ -120,7 +120,7 @@ export class LoginComponent implements OnInit {
private redirectToApiAuthorizationPath(apiAuthorizationPath: string) {
// It's important that we do a replace here so that when the user hits the back arrow on the
// browser he gets sent back to where it was on the app instead of to an endpoint on this
// browser they get sent back to where it was on the app instead of to an endpoint on this
// component.
const redirectUrl = `${window.location.origin}${apiAuthorizationPath}`;
window.location.replace(redirectUrl);

Просмотреть файл

@ -54,7 +54,7 @@ export class LogoutComponent implements OnInit {
switch (result.status) {
case AuthenticationResultStatus.Redirect:
// We replace the location here so that in case the user hits the back
// arrow from within the IdP he doesn't get into an infinite redirect loop.
// arrow from within the IdP they don't get into an infinite redirect loop.
window.location.replace(result.redirectUrl);
break;
case AuthenticationResultStatus.Success:

Просмотреть файл

@ -64,6 +64,7 @@ HandlerResolver::LoadRequestHandlerAssembly(const IHttpApplication &pApplication
pConfiguration.QueryProcessPath(),
pApplication.GetApplicationPhysicalPath(),
pConfiguration.QueryArguments(),
errorContext,
options));
location = options->GetDotnetExeLocation();

Просмотреть файл

@ -196,6 +196,7 @@
</Lib>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="ErrorContext.h" />
<ClInclude Include="PollingAppOfflineApplication.h" />
<ClInclude Include="application.h" />
<ClInclude Include="BindingInformation.h" />
@ -245,7 +246,6 @@
<ClCompile Include="file_utility.cpp" />
<ClCompile Include="fx_ver.cpp" />
<ClCompile Include="GlobalVersionUtility.cpp" />
<ClCompile Include="HandleWrapper.cpp" />
<ClCompile Include="HostFxr.cpp" />
<ClCompile Include="HostFxrResolver.cpp" />
<ClCompile Include="HostFxrResolutionResult.cpp" />
@ -279,4 +279,4 @@
<Import Project="..\..\build\native.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

Просмотреть файл

@ -0,0 +1,14 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
#pragma once
struct ErrorContext
{
// TODO consider adding HRESULT here
std::string detailedErrorContent;
USHORT statusCode;
USHORT subStatusCode;
std::string generalErrorType;
std::string errorReason;
};

Просмотреть файл

@ -1,8 +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.
#include "HandleWrapper.h"
// Workaround for VC++ bug https://developercommunity.visualstudio.com/content/problem/33928/constexpr-failing-on-nullptr-v141-compiler-regress.html
const HANDLE InvalidHandleTraits::DefaultHandle = INVALID_HANDLE_VALUE;
const HANDLE FindFileHandleTraits::DefaultHandle = INVALID_HANDLE_VALUE;

Просмотреть файл

@ -9,7 +9,7 @@
struct InvalidHandleTraits
{
using HandleType = HANDLE;
static const HANDLE DefaultHandle;
static constexpr HANDLE DefaultHandle = nullptr;
static void Close(HANDLE handle) noexcept { CloseHandle(handle); }
};
@ -23,7 +23,7 @@ struct NullHandleTraits
struct FindFileHandleTraits
{
using HandleType = HANDLE;
static const HANDLE DefaultHandle;
static constexpr HANDLE DefaultHandle = nullptr;
static void Close(HANDLE handle) noexcept { FindClose(handle); }
};
@ -35,16 +35,16 @@ struct ModuleHandleTraits
};
// Code analysis doesn't like nullptr usages via traits
#pragma warning( push )
#pragma warning ( disable : 26477 ) // disable Use 'nullptr' rather than 0 or NULL (es.47).
#pragma warning(push)
#pragma warning(disable : 26477) // disable Use 'nullptr' rather than 0 or NULL (es.47).
template<typename traits>
template <typename traits>
class HandleWrapper
{
public:
using HandleType = typename traits::HandleType;
HandleWrapper(HandleType handle = traits::DefaultHandle) noexcept : m_handle(handle) { }
HandleWrapper(HandleType handle = traits::DefaultHandle) noexcept : m_handle(handle) {}
~HandleWrapper()
{
if (m_handle != traits::DefaultHandle)
@ -54,14 +54,14 @@ public:
}
operator HandleType() noexcept { return m_handle; }
HandleWrapper& operator =(HandleType value) noexcept
HandleWrapper &operator=(HandleType value) noexcept
{
DBG_ASSERT(m_handle == traits::DefaultHandle);
m_handle = value;
return *this;
}
HandleType* operator&() noexcept { return &m_handle; }
HandleType *operator&() noexcept { return &m_handle; }
HandleType release() noexcept
{
@ -74,4 +74,4 @@ private:
HandleType m_handle;
};
#pragma warning( pop )
#pragma warning(pop)

Просмотреть файл

@ -28,16 +28,6 @@ typedef int(*hostfxr_set_runtime_property_value_fn)(void* host_context_handle, P
typedef int(*hostfxr_run_app_fn)(void* host_context_handle);
typedef int(*hostfxr_close_fn)(void* hostfxr_context_handle);
struct ErrorContext
{
// TODO consider adding HRESULT here
std::string detailedErrorContent;
USHORT statusCode;
USHORT subStatusCode;
std::string generalErrorType;
std::string errorReason;
};
class HostFxrErrorRedirector: NonCopyable
{
public:

Просмотреть файл

@ -23,6 +23,7 @@ HRESULT HostFxrResolutionResult::Create(
_In_ const std::wstring& pcwzProcessPath,
_In_ const std::wstring& pcwzApplicationPhysicalPath,
_In_ const std::wstring& pcwzArguments,
_In_ ErrorContext& errorContext,
_Out_ std::unique_ptr<HostFxrResolutionResult>& ppWrapper)
{
std::filesystem::path knownDotnetLocation;
@ -42,7 +43,8 @@ HRESULT HostFxrResolutionResult::Create(
pcwzArguments,
hostFxrDllPath,
knownDotnetLocation,
arguments);
arguments,
errorContext);
LOG_INFOF(L"Parsed hostfxr options: dotnet location: '%ls' hostfxr path: '%ls' arguments:", knownDotnetLocation.c_str(), hostFxrDllPath.c_str());
for (size_t i = 0; i < arguments.size(); i++)

Просмотреть файл

@ -10,6 +10,8 @@
#include <vector>
#include <string>
#include "ErrorContext.h"
class HostFxrResolutionResult
{
public:
@ -44,6 +46,7 @@ public:
_In_ const std::wstring& pcwzProcessPath,
_In_ const std::wstring& pcwzApplicationPhysicalPath,
_In_ const std::wstring& pcwzArguments,
_In_ ErrorContext& errorContext,
_Out_ std::unique_ptr<HostFxrResolutionResult>& ppWrapper);
private:

Просмотреть файл

@ -21,7 +21,8 @@ HostFxrResolver::GetHostFxrParameters(
const std::wstring &applicationArguments,
fs::path &hostFxrDllPath,
fs::path &dotnetExePath,
std::vector<std::wstring> &arguments
std::vector<std::wstring> &arguments,
ErrorContext& errorContext
)
{
LOG_INFOF(L"Resolving hostfxr parameters for application: '%ls' arguments: '%ls' path: '%ls'",
@ -93,7 +94,13 @@ HostFxrResolver::GetHostFxrParameters(
LOG_INFOF(L"Checking application.dll at '%ls'", applicationDllPath.c_str());
if (!is_regular_file(applicationDllPath))
{
throw InvalidOperationException(format(L"Application .dll was not found at %s", applicationDllPath.c_str()));
errorContext.subStatusCode = 38;
errorContext.errorReason = "Application DLL not found. Confirm the application dll is present. Single-file deployments are not supported in IIS.";
errorContext.generalErrorType = "ANCM Application DLL Not Found";
errorContext.detailedErrorContent = format("Application DLL was not found at %s.", to_multi_byte_string(applicationDllPath, CP_UTF8).c_str());
throw InvalidOperationException(
format(L"Application DLL was not found at %s. Confirm the application dll is present. Single-file deployments are not supported in IIS.",
applicationDllPath.c_str()));
}
hostFxrDllPath = executablePath.parent_path() / "hostfxr.dll";

Просмотреть файл

@ -9,6 +9,8 @@
#include <optional>
#include <string>
#include "ErrorContext.h"
#define READ_BUFFER_SIZE 4096
class HostFxrResolver
@ -23,7 +25,8 @@ public:
const std::wstring &applicationArguments,
std::filesystem::path &hostFxrDllPath,
std::filesystem::path &dotnetExePath,
std::vector<std::wstring> &arguments
std::vector<std::wstring> &arguments,
ErrorContext& errorContext
);
static

Просмотреть файл

@ -43,7 +43,6 @@
<ClCompile Include="ConfigUtilityTests.cpp" />
<ClCompile Include="GlobalVersionTests.cpp" />
<ClCompile Include="Helpers.cpp" />
<ClCompile Include="hostfxr_utility_tests.cpp" />
<ClCompile Include="inprocess_application_tests.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="StandardOutputRedirectionTest.cpp" />
@ -187,4 +186,4 @@
<PropertyGroup>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
</Project>
</Project>

Просмотреть файл

@ -1,122 +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.
#include "stdafx.h"
#include <filesystem>
#include <vector>
#include <string>
#include "HostFxrResolver.h"
#include "Environment.h"
TEST(ParseHostFxrArguments, BasicHostFxrArguments)
{
std::vector<std::wstring> bstrArray;
HostFxrResolver::AppendArguments(
L"exec \"test.dll\"", // args
L"invalid", // physical path to application
bstrArray); // args array.
EXPECT_EQ(2, bstrArray.size());
ASSERT_STREQ(L"exec", bstrArray[0].c_str());
ASSERT_STREQ(L"test.dll", bstrArray[1].c_str());
}
TEST(ParseHostFxrArguments, NoExecProvided)
{
std::vector<std::wstring> bstrArray;
HostFxrResolver::AppendArguments(
L"test.dll", // args
L"ignored", // physical path to application
bstrArray); // args array.
EXPECT_EQ(1, bstrArray.size());
ASSERT_STREQ(L"test.dll", bstrArray[0].c_str());
}
TEST(ParseHostFxrArguments, ConvertDllToAbsolutePath)
{
std::vector<std::wstring> bstrArray;
// we need to use existing dll so let's use ntdll that we know exists everywhere
auto system32 = Environment::ExpandEnvironmentVariables(L"%WINDIR%\\System32");
HostFxrResolver::AppendArguments(
L"exec \"ntdll.dll\"", // args
system32, // physical path to application
bstrArray, // args array.
true); // expandDllPaths
EXPECT_EQ(2, bstrArray.size());
ASSERT_STREQ(L"exec", bstrArray[0].c_str());
ASSERT_STREQ((system32 + L"\\ntdll.dll").c_str(), bstrArray[1].c_str());
}
TEST(ParseHostFxrArguments, ProvideNoArgs_InvalidArgs)
{
std::vector<std::wstring> bstrArray;
std::filesystem::path struHostFxrDllLocation;
std::filesystem::path struExeLocation;
EXPECT_THROW(HostFxrResolver::GetHostFxrParameters(
L"dotnet", // processPath
L"some\\path", // application physical path, ignored.
L"", //arguments
struHostFxrDllLocation,
struExeLocation,
bstrArray), // args array.
InvalidOperationException);
}
TEST(GetAbsolutePathToDotnetFromProgramFiles, BackupWorks)
{
STRU struAbsolutePathToDotnet;
BOOL fDotnetInProgramFiles;
BOOL is64Bit;
BOOL fIsWow64 = FALSE;
SYSTEM_INFO systemInfo;
IsWow64Process(GetCurrentProcess(), &fIsWow64);
if (fIsWow64)
{
is64Bit = FALSE;
}
else
{
GetNativeSystemInfo(&systemInfo);
is64Bit = systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64;
}
if (is64Bit)
{
fDotnetInProgramFiles = std::filesystem::is_regular_file(L"C:/Program Files/dotnet/dotnet.exe");
}
else
{
fDotnetInProgramFiles = std::filesystem::is_regular_file(L"C:/Program Files (x86)/dotnet/dotnet.exe");
}
auto dotnetPath = HostFxrResolver::GetAbsolutePathToDotnetFromProgramFiles();
if (fDotnetInProgramFiles)
{
EXPECT_TRUE(dotnetPath.has_value());
}
else
{
EXPECT_FALSE(dotnetPath.has_value());
}
}
TEST(GetHostFxrArguments, InvalidParams)
{
std::vector<std::wstring> bstrArray;
std::filesystem::path struHostFxrDllLocation;
std::filesystem::path struExeLocation;
EXPECT_THROW(HostFxrResolver::GetHostFxrParameters(
L"bogus", // processPath
L"", // application physical path, ignored.
L"ignored", //arguments
struHostFxrDllLocation,
struExeLocation,
bstrArray), // args array.
InvalidOperationException);
}

Просмотреть файл

@ -195,6 +195,8 @@ IN_PROCESS_APPLICATION::ExecuteApplication()
auto context = std::make_shared<ExecuteClrContext>();
ErrorContext errorContext; // unused
if (s_fMainCallback == nullptr)
{
THROW_IF_FAILED(HostFxrResolutionResult::Create(
@ -202,6 +204,7 @@ IN_PROCESS_APPLICATION::ExecuteApplication()
m_pConfig->QueryProcessPath(),
QueryApplicationPhysicalPath(),
m_pConfig->QueryArguments(),
errorContext,
hostFxrResolutionResult
));

Просмотреть файл

@ -365,6 +365,24 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests.InProcess
EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessFailedToFindNativeDependencies(deploymentResult), Logger);
}
[ConditionalFact]
public async Task SingleExecutable_FailedToFindNativeDependencies()
{
var deploymentParameters = Fixture.GetBaseDeploymentParameters(Fixture.InProcessTestSite);
deploymentParameters.ApplicationType = ApplicationType.Standalone;
var deploymentResult = await DeployAsync(deploymentParameters);
File.Delete(Path.Combine(deploymentResult.ContentRoot, "InProcessWebSite.dll"));
if (DeployerSelector.HasNewShim)
{
await AssertSiteFailsToStartWithInProcessStaticContent(deploymentResult, "HTTP Error 500.38 - ANCM Application DLL Not Found");
}
else
{
await AssertSiteFailsToStartWithInProcessStaticContent(deploymentResult);
}
}
[ConditionalFact]
public async Task TargedDifferenceSharedFramework_FailedToFindNativeDependenciesErrorInResponse()
{

Просмотреть файл

@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
public static string GetInProcessTestSitesName()
{
return DeployerSelector.IsForwardsCompatibilityTest ? "InProcessForwardsCompatWebSite" : "InProcessWebSite";
return DeployerSelector.IsNewShimTest ? "InProcessNewShimWebSite" : "InProcessWebSite";
}
public static async Task AssertStarts(this IISDeploymentResult deploymentResult, string path = "/HelloWorld")

Просмотреть файл

@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
public static class DeployerSelector
{
public static ServerType ServerType => ServerType.IIS;
public static bool IsForwardsCompatibilityTest => false;
public static bool IsNewShimTest => false;
public static bool HasNewShim => true;
public static bool HasNewHandler => true;
}

Просмотреть файл

@ -12,8 +12,6 @@
<ItemGroup>
<ProjectReference Include="..\Common.Tests\Common.Tests.csproj" />
<ProjectReference Include="$(RepoRoot)src\Servers\IIS\IntegrationTesting.IIS\src\Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj" />
<ProjectReference Include="$(RepoRoot)src\Hosting\Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj" />
<ProjectReference Include="..\testassets\InProcessWebSite\InProcessWebSite.csproj">
<ReferenceOutputAssembly>False</ReferenceOutputAssembly>

Просмотреть файл

@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
public static class DeployerSelector
{
public static ServerType ServerType => ServerType.IIS;
public static bool IsForwardsCompatibilityTest => false;
public static bool IsNewShimTest => false;
public static bool HasNewShim => false;
public static bool HasNewHandler => true;
}

Просмотреть файл

@ -2,9 +2,9 @@
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<TestGroupName>IISBackwardsCompatibility.FunctionalTests</TestGroupName>
<TestGroupName>IISNewHandler.FunctionalTests</TestGroupName>
<DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
<SkipTests Condition=" '$(SkipIISBackwardsCompatibilityTests)' == 'true' ">true</SkipTests>
<SkipTests Condition=" '$(SkipIISNewHandlerTests)' == 'true' ">true</SkipTests>
</PropertyGroup>
<Import Project="../FunctionalTest.props" />
@ -16,9 +16,6 @@
<ItemGroup>
<ProjectReference Include="..\Common.Tests\Common.Tests.csproj" />
<ProjectReference Include="..\testassets\**\*.csproj">
<ReferenceOutputAssembly>False</ReferenceOutputAssembly>
</ProjectReference>
<ProjectReference Include="..\testassets\InProcessWebSite\InProcessWebSite.csproj">
<ReferenceOutputAssembly>False</ReferenceOutputAssembly>
</ProjectReference>
@ -39,11 +36,4 @@
<Reference Include="System.Net.WebSockets.WebSocketProtocol" />
</ItemGroup>
<Target Name="RemoveSourceOverride" BeforeTargets="_CopyOutOfDateSourceItemsToOutputDirectory">
<ItemGroup>
<SourceItemsToRemove Include="@(_SourceItemsToCopyToOutputDirectory)" Condition="$([System.String]::Copy(%(_SourceItemsToCopyToOutputDirectory.FullPath)).Contains('IIS\AspNetCoreModule')) == 'true'" />
<_SourceItemsToCopyToOutputDirectory Remove="@(SourceItemsToRemove)" />
</ItemGroup>
</Target>
</Project>

Просмотреть файл

@ -10,17 +10,17 @@ using Xunit.Sdk;
namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
{
[Collection(IISTestSiteCollection.Name)]
public class BackwardsCompatibilityTests : FixtureLoggedTest
public class NewHandlerTests : FixtureLoggedTest
{
private readonly IISTestSiteFixture _fixture;
public BackwardsCompatibilityTests(IISTestSiteFixture fixture) : base(fixture)
public NewHandlerTests(IISTestSiteFixture fixture) : base(fixture)
{
_fixture = fixture;
}
[ConditionalFact]
public async Task CheckBackwardsCompatibilityIsUsed()
public async Task CheckNewHandlerIsUsed()
{
var response = await _fixture.Client.GetAsync("/HelloWorld");
@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
foreach (ProcessModule handle in handles)
{
if (handle.ModuleName == "aspnetcorev2.dll")
if (handle.ModuleName == "aspnetcorev2.dll" || handle.ModuleName == "aspnetcorev2_outofprocess.dll")
{
Assert.Equal("12.2.18316.0", handle.FileVersionInfo.FileVersion);
return;

Просмотреть файл

@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
public static class DeployerSelector
{
public static ServerType ServerType => ServerType.IIS;
public static bool IsForwardsCompatibilityTest => true;
public static bool IsNewShimTest => true;
public static bool HasNewShim => true;
public static bool HasNewHandler => false;
}

Просмотреть файл

@ -10,17 +10,17 @@ using Xunit.Sdk;
namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
{
[Collection(IISTestSiteCollection.Name)]
public class ForwardsCompatibilityTests : FixtureLoggedTest
public class NewShimTests : FixtureLoggedTest
{
private readonly IISTestSiteFixture _fixture;
public ForwardsCompatibilityTests(IISTestSiteFixture fixture) : base(fixture)
public NewShimTests(IISTestSiteFixture fixture) : base(fixture)
{
_fixture = fixture;
}
[ConditionalFact]
public async Task CheckForwardsCompatibilityIsUsed()
public async Task CheckNewShimIsUsed()
{
var response = await _fixture.Client.GetAsync("/HelloWorld");
var handles = _fixture.DeploymentResult.HostProcess.Modules;

Просмотреть файл

@ -2,9 +2,9 @@
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<TestGroupName>IISForwardsCompatibility.FunctionalTests</TestGroupName>
<TestGroupName>IISNewShim.FunctionalTests</TestGroupName>
<DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
<SkipTests Condition=" '$(SkipIISForwardsCompatibilityTests)' == 'true' ">true</SkipTests>
<SkipTests Condition=" '$(SkipIISNewShimTests)' == 'true' ">true</SkipTests>
</PropertyGroup>
<Import Project="../FunctionalTest.props" />
@ -13,7 +13,7 @@
<ProjectReference Include="..\Common.Tests\Common.Tests.csproj" />
<ProjectReference Include="$(RepoRoot)src\Hosting\Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj" />
<ProjectReference Include="..\testassets\InProcessForwardsCompatWebSite\InProcessForwardsCompatWebSite.csproj">
<ProjectReference Include="..\testassets\InProcessNewShimWebSite\InProcessNewShimWebSite.csproj">
<ReferenceOutputAssembly>False</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>

Просмотреть файл

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http.Features;

Просмотреть файл

@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
public static class DeployerSelector
{
public static ServerType ServerType => ServerType.IISExpress;
public static bool IsForwardsCompatibilityTest => false;
public static bool IsNewShimTest => false;
public static bool HasNewShim => true;
public static bool HasNewHandler => true;
}

Просмотреть файл

@ -5,7 +5,7 @@
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>InProcessWebSite</AssemblyName>
<TestAssetOutputName>InProcessForwardsCompatWebSite</TestAssetOutputName>
<TestAssetOutputName>InProcessNewShimWebSite</TestAssetOutputName>
<DefineConstants>FORWARDCOMPAT</DefineConstants>
</PropertyGroup>

Просмотреть файл

@ -63,9 +63,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IIS.Tests", "IIS\test\IIS.T
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.Tests", "IIS\test\Common.Tests\Common.Tests.csproj", "{D17B7B35-5361-4A50-B499-E03E5C3CC095}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IIS.BackwardsCompatibility.FunctionalTests", "IIS\test\IIS.BackwardsCompatibility.FunctionalTests\IIS.BackwardsCompatibility.FunctionalTests.csproj", "{582B07BC-73F4-4689-8557-B039298BD82C}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IIS.NewHandler.FunctionalTests", "IIS\test\IIS.NewHandler.FunctionalTests\IIS.NewHandler.FunctionalTests.csproj", "{582B07BC-73F4-4689-8557-B039298BD82C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IIS.ForwardsCompatibility.FunctionalTests", "IIS\test\IIS.ForwardsCompatibility.FunctionalTests\IIS.ForwardsCompatibility.FunctionalTests.csproj", "{D1EA5D99-28FD-4197-81DE-17098846B38B}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IIS.NewShim.FunctionalTests", "IIS\test\IIS.NewShim.FunctionalTests\IIS.NewShim.FunctionalTests.csproj", "{D1EA5D99-28FD-4197-81DE-17098846B38B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestTasks", "IIS\test\testassets\TestTasks\TestTasks.csproj", "{2DD1269D-131C-4531-BB0D-7BE0EF8E56D0}"
EndProject

Просмотреть файл

@ -27,7 +27,7 @@
Condition="!Exists('$(AspNetCoreModuleV2ShimDll)') OR !Exists('$(AspNetCoreModuleV2OutOfProcessHandlerDll)')" />
</Target>
<ItemGroup Condition="'$(BuildIisNativeProjects)' == 'true' AND '$(VCTargetsPath)' != ''">
<ItemGroup Condition="'$(BuildIisNativeProjects)' == 'true' AND '$(VCTargetsPath)' != '' AND '$(TestGroupName)' != 'IISNewHandler.FunctionalTests'">
<NativeProjectReference Include="$(MSBuildThisFileDirectory)..\..\AspNetCoreModuleV2\AspNetCore\AspNetCore.vcxproj" Platform="x64"/>
<NativeProjectReference Include="$(MSBuildThisFileDirectory)..\..\AspNetCoreModuleV2\OutOfProcessRequestHandler\OutOfProcessRequestHandler.vcxproj" Platform="x64" />

Просмотреть файл

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Diagnostics;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2.HPack
{
@ -9,6 +10,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2.HPack
{
public static bool Encode(int i, int n, Span<byte> buffer, out int length)
{
Debug.Assert(i >= 0);
Debug.Assert(n >= 1 && n <= 8);
var j = 0;
length = 0;
@ -37,7 +41,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2.HPack
{
buffer[j++] = (byte)(i % 128 + 128);
if (j > buffer.Length)
if (j >= buffer.Length)
{
return false;
}

Просмотреть файл

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2.HPack;
using Xunit;
@ -35,5 +37,55 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
}
}
}
[Theory]
[MemberData(nameof(IntegerCodecSamples))]
public void EncodeSamples(int value, int bits, byte[] expectedResult)
{
Span<byte> actualResult = new byte[64];
bool success = IntegerEncoder.Encode(value, bits, actualResult, out int bytesWritten);
Assert.True(success);
Assert.Equal(expectedResult.Length, bytesWritten);
Assert.True(actualResult.Slice(0, bytesWritten).SequenceEqual(expectedResult));
}
[Theory]
[MemberData(nameof(IntegerCodecSamples))]
public void EncodeSamplesWithShortBuffer(int value, int bits, byte[] expectedResult)
{
Span<byte> actualResult = new byte[expectedResult.Length - 1];
bool success = IntegerEncoder.Encode(value, bits, actualResult, out int bytesWritten);
Assert.False(success);
}
[Theory]
[MemberData(nameof(IntegerCodecSamples))]
public void DecodeSamples(int expectedResult, int bits, byte[] encoded)
{
var integerDecoder = new IntegerDecoder();
bool finished = integerDecoder.BeginTryDecode(encoded[0], bits, out int actualResult);
int i = 1;
for (; !finished && i < encoded.Length; ++i)
{
finished = integerDecoder.TryDecode(encoded[i], out actualResult);
}
Assert.True(finished);
Assert.Equal(encoded.Length, i);
Assert.Equal(expectedResult, actualResult);
}
// integer, prefix length, encoded
public static IEnumerable<object[]> IntegerCodecSamples()
{
yield return new object[] { 10, 5, new byte[] { 0x0A } };
yield return new object[] { 1337, 5, new byte[] { 0x1F, 0x9A, 0x0A } };
yield return new object[] { 42, 8, new byte[] { 0x2A } };
}
}
}

Просмотреть файл

@ -42,6 +42,10 @@ namespace Microsoft.AspNetCore.Certificates.Generation
private static readonly string MacOSTrustCertificateCommandLineArguments = "security add-trusted-cert -d -r trustRoot -k " + MacOSSystemKeyChain + " ";
private const int UserCancelledErrorCode = 1223;
// Setting to 0 means we don't append the version byte,
// which is what all machines currently have.
public int AspNetHttpsCertificateVersion { get; set; } = 1;
public IList<X509Certificate2> ListCertificates(
CertificatePurpose purpose,
StoreName storeName,
@ -83,7 +87,8 @@ namespace Microsoft.AspNetCore.Certificates.Generation
var validCertificates = matchingCertificates
.Where(c => c.NotBefore <= now &&
now <= c.NotAfter &&
(!requireExportable || !RuntimeInformation.IsOSPlatform(OSPlatform.Windows) || IsExportable(c)))
(!requireExportable || !RuntimeInformation.IsOSPlatform(OSPlatform.Windows) || IsExportable(c))
&& MatchesVersion(c))
.ToArray();
var invalidCertificates = matchingCertificates.Except(validCertificates);
@ -117,6 +122,25 @@ namespace Microsoft.AspNetCore.Certificates.Generation
bool HasOid(X509Certificate2 certificate, string oid) =>
certificate.Extensions.OfType<X509Extension>()
.Any(e => string.Equals(oid, e.Oid.Value, StringComparison.Ordinal));
bool MatchesVersion(X509Certificate2 c)
{
var byteArray = c.Extensions.OfType<X509Extension>()
.Where(e => string.Equals(AspNetHttpsOid, e.Oid.Value, StringComparison.Ordinal))
.Single()
.RawData;
if ((byteArray.Length == AspNetHttpsOidFriendlyName.Length && byteArray[0] == (byte)'A') || byteArray.Length == 0)
{
// No Version set, default to 0
return 0 >= AspNetHttpsCertificateVersion;
}
else
{
// Version is in the only byte of the byte array.
return byteArray[0] >= AspNetHttpsCertificateVersion;
}
}
#if !XPLAT
bool IsExportable(X509Certificate2 c) =>
((c.GetRSAPrivateKey() is RSACryptoServiceProvider rsaPrivateKey &&
@ -171,10 +195,22 @@ namespace Microsoft.AspNetCore.Certificates.Generation
pathLengthConstraint: 0,
critical: true);
byte[] bytePayload;
if (AspNetHttpsCertificateVersion != 0)
{
bytePayload = new byte[1];
bytePayload[0] = (byte)AspNetHttpsCertificateVersion;
}
else
{
bytePayload = Encoding.ASCII.GetBytes(AspNetHttpsOidFriendlyName);
}
var aspNetHttpsExtension = new X509Extension(
new AsnEncodedData(
new Oid(AspNetHttpsOid, AspNetHttpsOidFriendlyName),
Encoding.ASCII.GetBytes(AspNetHttpsOidFriendlyName)),
bytePayload),
critical: false);
extensions.Add(basicConstraints);
@ -633,7 +669,7 @@ namespace Microsoft.AspNetCore.Certificates.Generation
}
}
public EnsureCertificateResult EnsureAspNetCoreHttpsDevelopmentCertificate(
public DetailedEnsureCertificateResult EnsureAspNetCoreHttpsDevelopmentCertificate(
DateTimeOffset notBefore,
DateTimeOffset notAfter,
string path = null,
@ -645,109 +681,7 @@ namespace Microsoft.AspNetCore.Certificates.Generation
return EnsureValidCertificateExists(notBefore, notAfter, CertificatePurpose.HTTPS, path, trust, includePrivateKey, password, subject);
}
public EnsureCertificateResult EnsureValidCertificateExists(
DateTimeOffset notBefore,
DateTimeOffset notAfter,
CertificatePurpose purpose,
string path = null,
bool trust = false,
bool includePrivateKey = false,
string password = null,
string subjectOverride = null)
{
if (purpose == CertificatePurpose.All)
{
throw new ArgumentException("The certificate must have a specific purpose.");
}
var certificates = ListCertificates(purpose, StoreName.My, StoreLocation.CurrentUser, isValid: true).Concat(
ListCertificates(purpose, StoreName.My, StoreLocation.LocalMachine, isValid: true));
certificates = subjectOverride == null ? certificates : certificates.Where(c => c.Subject == subjectOverride);
var result = EnsureCertificateResult.Succeeded;
X509Certificate2 certificate = null;
if (certificates.Count() > 0)
{
certificate = certificates.FirstOrDefault();
result = EnsureCertificateResult.ValidCertificatePresent;
}
else
{
try
{
switch (purpose)
{
case CertificatePurpose.All:
throw new InvalidOperationException("The certificate must have a specific purpose.");
case CertificatePurpose.HTTPS:
certificate = CreateAspNetCoreHttpsDevelopmentCertificate(notBefore, notAfter, subjectOverride);
break;
default:
throw new InvalidOperationException("The certificate must have a purpose.");
}
}
catch
{
return EnsureCertificateResult.ErrorCreatingTheCertificate;
}
try
{
certificate = SaveCertificateInStore(certificate, StoreName.My, StoreLocation.CurrentUser);
}
catch
{
return EnsureCertificateResult.ErrorSavingTheCertificateIntoTheCurrentUserPersonalStore;
}
}
if (path != null)
{
try
{
ExportCertificate(certificate, path, includePrivateKey, password);
}
catch
{
return EnsureCertificateResult.ErrorExportingTheCertificate;
}
}
if ((RuntimeInformation.IsOSPlatform(OSPlatform.Windows) || RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) && trust)
{
try
{
TrustCertificate(certificate);
}
catch (UserCancelledTrustException)
{
return EnsureCertificateResult.UserCancelledTrustStep;
}
catch
{
return EnsureCertificateResult.FailedToTrustTheCertificate;
}
}
return result;
}
// This is just to avoid breaking changes across repos.
// Will be renamed back to EnsureAspNetCoreHttpsDevelopmentCertificate once updates are made elsewhere.
public DetailedEnsureCertificateResult EnsureAspNetCoreHttpsDevelopmentCertificate2(
DateTimeOffset notBefore,
DateTimeOffset notAfter,
string path = null,
bool trust = false,
bool includePrivateKey = false,
string password = null,
string subject = LocalhostHttpsDistinguishedName)
{
return EnsureValidCertificateExists2(notBefore, notAfter, CertificatePurpose.HTTPS, path, trust, includePrivateKey, password, subject);
}
public DetailedEnsureCertificateResult EnsureValidCertificateExists2(
public DetailedEnsureCertificateResult EnsureValidCertificateExists(
DateTimeOffset notBefore,
DateTimeOffset notAfter,
CertificatePurpose purpose,

Просмотреть файл

@ -15,19 +15,9 @@ namespace Microsoft.Extensions.Internal
public PropertyActivator(
PropertyInfo propertyInfo,
Func<TContext, object> valueAccessor)
{
if (propertyInfo == null)
{
throw new ArgumentNullException(nameof(propertyInfo));
}
if (valueAccessor == null)
{
throw new ArgumentNullException(nameof(valueAccessor));
}
PropertyInfo = propertyInfo;
_valueAccessor = valueAccessor;
{
PropertyInfo = propertyInfo ?? throw new ArgumentNullException(nameof(propertyInfo));
_valueAccessor = valueAccessor ?? throw new ArgumentNullException(nameof(valueAccessor));
_fastPropertySetter = PropertyHelper.MakeFastPropertySetter(propertyInfo);
}
@ -107,4 +97,4 @@ namespace Microsoft.Extensions.Internal
return properties.Select(createActivateInfo).ToArray();
}
}
}
}

Просмотреть файл

@ -51,13 +51,8 @@ namespace Microsoft.Extensions.Internal
/// This constructor does not cache the helper. For caching, use <see cref="GetProperties(Type)"/>.
/// </summary>
public PropertyHelper(PropertyInfo property)
{
if (property == null)
{
throw new ArgumentNullException(nameof(property));
}
Property = property;
{
Property = property ?? throw new ArgumentNullException(nameof(property));
Name = property.Name;
}

Просмотреть файл

@ -1,20 +1,20 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { IReconnectPolicy } from "./IReconnectPolicy";
import { IRetryPolicy, RetryContext } from "./IRetryPolicy";
// 0, 2, 10, 30 second delays before reconnect attempts.
const DEFAULT_RETRY_DELAYS_IN_MILLISECONDS = [0, 2000, 10000, 30000, null];
/** @private */
export class DefaultReconnectPolicy implements IReconnectPolicy {
export class DefaultReconnectPolicy implements IRetryPolicy {
private readonly retryDelays: Array<number | null>;
constructor(retryDelays?: number[]) {
this.retryDelays = retryDelays !== undefined ? [...retryDelays, null] : DEFAULT_RETRY_DELAYS_IN_MILLISECONDS;
}
public nextRetryDelayInMilliseconds(previousRetryCount: number): number | null {
return this.retryDelays[previousRetryCount];
public nextRetryDelayInMilliseconds(retryContext: RetryContext): number | null {
return this.retryDelays[retryContext.previousRetryCount];
}
}

Просмотреть файл

@ -5,7 +5,7 @@ import { HandshakeProtocol, HandshakeRequestMessage, HandshakeResponseMessage }
import { IConnection } from "./IConnection";
import { CancelInvocationMessage, CompletionMessage, IHubProtocol, InvocationMessage, MessageType, StreamInvocationMessage, StreamItemMessage } from "./IHubProtocol";
import { ILogger, LogLevel } from "./ILogger";
import { IReconnectPolicy } from "./IReconnectPolicy";
import { IRetryPolicy } from "./IRetryPolicy";
import { IStreamResult } from "./Stream";
import { Subject } from "./Subject";
import { Arg } from "./Utils";
@ -32,7 +32,7 @@ export class HubConnection {
private readonly cachedPingMessage: string | ArrayBuffer;
private readonly connection: IConnection;
private readonly logger: ILogger;
private readonly reconnectPolicy?: IReconnectPolicy;
private readonly reconnectPolicy?: IRetryPolicy;
private protocol: IHubProtocol;
private handshakeProtocol: HandshakeProtocol;
private callbacks: { [invocationId: string]: (invocationEvent: StreamItemMessage | CompletionMessage | null, error?: Error) => void };
@ -81,11 +81,11 @@ export class HubConnection {
// create method that can be used by HubConnectionBuilder. An "internal" constructor would just
// be stripped away and the '.d.ts' file would have no constructor, which is interpreted as a
// public parameter-less constructor.
public static create(connection: IConnection, logger: ILogger, protocol: IHubProtocol, reconnectPolicy?: IReconnectPolicy): HubConnection {
public static create(connection: IConnection, logger: ILogger, protocol: IHubProtocol, reconnectPolicy?: IRetryPolicy): HubConnection {
return new HubConnection(connection, logger, protocol, reconnectPolicy);
}
private constructor(connection: IConnection, logger: ILogger, protocol: IHubProtocol, reconnectPolicy?: IReconnectPolicy) {
private constructor(connection: IConnection, logger: ILogger, protocol: IHubProtocol, reconnectPolicy?: IRetryPolicy) {
Arg.isRequired(connection, "connection");
Arg.isRequired(logger, "logger");
Arg.isRequired(protocol, "protocol");
@ -666,11 +666,12 @@ export class HubConnection {
private async reconnect(error?: Error) {
const reconnectStartTime = Date.now();
let previousReconnectAttempts = 0;
let retryError = error !== undefined ? error : new Error("Attempting to reconnect due to a unknown error.");
let nextRetryDelay = this.getNextRetryDelay(previousReconnectAttempts++, 0);
let nextRetryDelay = this.getNextRetryDelay(previousReconnectAttempts++, 0, retryError);
if (nextRetryDelay === null) {
this.logger.log(LogLevel.Debug, "Connection not reconnecting because the IReconnectPolicy returned null on the first reconnect attempt.");
this.logger.log(LogLevel.Debug, "Connection not reconnecting because the IRetryPolicy returned null on the first reconnect attempt.");
this.completeClose(error);
return;
}
@ -732,9 +733,10 @@ export class HubConnection {
this.logger.log(LogLevel.Debug, "Connection left the reconnecting state during reconnect attempt. Done reconnecting.");
return;
}
}
nextRetryDelay = this.getNextRetryDelay(previousReconnectAttempts++, Date.now() - reconnectStartTime);
retryError = e instanceof Error ? e : new Error(e.toString());
nextRetryDelay = this.getNextRetryDelay(previousReconnectAttempts++, Date.now() - reconnectStartTime, retryError);
}
}
this.logger.log(LogLevel.Information, `Reconnect retries have been exhausted after ${Date.now() - reconnectStartTime} ms and ${previousReconnectAttempts} failed attempts. Connection disconnecting.`);
@ -742,11 +744,15 @@ export class HubConnection {
this.completeClose();
}
private getNextRetryDelay(previousRetryCount: number, elapsedMilliseconds: number) {
private getNextRetryDelay(previousRetryCount: number, elapsedMilliseconds: number, retryReason: Error) {
try {
return this.reconnectPolicy!.nextRetryDelayInMilliseconds(previousRetryCount, elapsedMilliseconds);
return this.reconnectPolicy!.nextRetryDelayInMilliseconds({
elapsedMilliseconds,
previousRetryCount,
retryReason,
});
} catch (e) {
this.logger.log(LogLevel.Error, `IReconnectPolicy.nextRetryDelayInMilliseconds(${previousRetryCount}, ${elapsedMilliseconds}) threw error '${e}'.`);
this.logger.log(LogLevel.Error, `IRetryPolicy.nextRetryDelayInMilliseconds(${previousRetryCount}, ${elapsedMilliseconds}) threw error '${e}'.`);
return null;
}
}

Просмотреть файл

@ -7,7 +7,7 @@ import { HubConnection } from "./HubConnection";
import { IHttpConnectionOptions } from "./IHttpConnectionOptions";
import { IHubProtocol } from "./IHubProtocol";
import { ILogger, LogLevel } from "./ILogger";
import { IReconnectPolicy } from "./IReconnectPolicy";
import { IRetryPolicy } from "./IRetryPolicy";
import { HttpTransportType } from "./ITransport";
import { JsonHubProtocol } from "./JsonHubProtocol";
import { NullLogger } from "./Loggers";
@ -51,7 +51,7 @@ export class HubConnectionBuilder {
/** If defined, this indicates the client should automatically attempt to reconnect if the connection is lost. */
/** @internal */
public reconnectPolicy?: IReconnectPolicy;
public reconnectPolicy?: IRetryPolicy;
/** Configures console logging for the {@link @aspnet/signalr.HubConnection}.
*
@ -164,10 +164,10 @@ export class HubConnectionBuilder {
/** Configures the {@link @aspnet/signalr.HubConnection} to automatically attempt to reconnect if the connection is lost.
*
* @param {IReconnectPolicy} reconnectPolicy An {@link @aspnet/signalR.IReconnectPolicy} that controls the timing and number of reconnect attempts.
* @param {IRetryPolicy} reconnectPolicy An {@link @aspnet/signalR.IRetryPolicy} that controls the timing and number of reconnect attempts.
*/
public withAutomaticReconnect(reconnectPolicy: IReconnectPolicy): HubConnectionBuilder;
public withAutomaticReconnect(retryDelaysOrReconnectPolicy?: number[] | IReconnectPolicy): HubConnectionBuilder {
public withAutomaticReconnect(reconnectPolicy: IRetryPolicy): HubConnectionBuilder;
public withAutomaticReconnect(retryDelaysOrReconnectPolicy?: number[] | IRetryPolicy): HubConnectionBuilder {
if (this.reconnectPolicy) {
throw new Error("A reconnectPolicy has already been set.");
}

Просмотреть файл

@ -1,15 +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.
/** An abstraction that controls when the client attempts to reconnect and how many times it does so. */
export interface IReconnectPolicy {
/** Called after the transport loses the connection.
*
* @param {number} previousRetryCount The number of consecutive failed reconnect attempts so far.
*
* @param {number} elapsedMilliseconds The amount of time in milliseconds spent reconnecting so far.
*
* @returns {number | null} The amount of time in milliseconds to wait before the next reconnect attempt. `null` tells the client to stop retrying and close.
*/
nextRetryDelayInMilliseconds(previousRetryCount: number, elapsedMilliseconds: number): number | null;
}

Просмотреть файл

@ -0,0 +1,30 @@
// 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.
/** An abstraction that controls when the client attempts to reconnect and how many times it does so. */
export interface IRetryPolicy {
/** Called after the transport loses the connection.
*
* @param {RetryContext} retryContext Details related to the retry event to help determine how long to wait for the next retry.
*
* @returns {number | null} The amount of time in milliseconds to wait before the next retry. `null` tells the client to stop retrying.
*/
nextRetryDelayInMilliseconds(retryContext: RetryContext): number | null;
}
export interface RetryContext {
/**
* The number of consecutive failed tries so far.
*/
readonly previousRetryCount: number;
/**
* The amount of time in milliseconds spent retrying so far.
*/
readonly elapsedMilliseconds: number;
/**
* The error that forced the upcoming retry.
*/
readonly retryReason: Error;
}

Просмотреть файл

@ -21,4 +21,4 @@ export { IStreamSubscriber, IStreamResult, ISubscription } from "./Stream";
export { NullLogger } from "./Loggers";
export { JsonHubProtocol } from "./JsonHubProtocol";
export { Subject } from "./Subject";
export { IReconnectPolicy } from "./IReconnectPolicy";
export { IRetryPolicy, RetryContext } from "./IRetryPolicy";

Просмотреть файл

@ -3,6 +3,7 @@
import { DefaultReconnectPolicy } from "../src/DefaultReconnectPolicy";
import { HubConnection, HubConnectionState } from "../src/HubConnection";
import { RetryContext } from "../src/IRetryPolicy";
import { JsonHubProtocol } from "../src/JsonHubProtocol";
import { VerifyLogger } from "./Common";
@ -46,15 +47,17 @@ describe("auto reconnect", () => {
let lastRetryCount = -1;
let lastElapsedMs = -1;
let retryReason = null;
let onreconnectingCount = 0;
let onreconnectedCount = 0;
let closeCount = 0;
const connection = new TestConnection();
const hubConnection = HubConnection.create(connection, logger, new JsonHubProtocol(), {
nextRetryDelayInMilliseconds(previousRetryCount: number, elapsedMilliseconds: number) {
lastRetryCount = previousRetryCount;
lastElapsedMs = elapsedMilliseconds;
nextRetryDelayInMilliseconds(retryContext: RetryContext) {
lastRetryCount = retryContext.previousRetryCount;
lastElapsedMs = retryContext.elapsedMilliseconds;
retryReason = retryContext.retryReason;
nextRetryDelayCalledPromise.resolve();
return 0;
},
@ -81,8 +84,11 @@ describe("auto reconnect", () => {
return promise;
};
const oncloseError = new Error("Connection lost");
const continueRetryingError = new Error("Reconnect attempt failed");
// Typically this would be called by the transport
connection.onclose!(new Error("Connection lost"));
connection.onclose!(oncloseError);
await nextRetryDelayCalledPromise;
nextRetryDelayCalledPromise = new PromiseSource();
@ -90,17 +96,19 @@ describe("auto reconnect", () => {
expect(hubConnection.state).toBe(HubConnectionState.Reconnecting);
expect(lastRetryCount).toBe(0);
expect(lastElapsedMs).toBe(0);
expect(retryReason).toBe(oncloseError);
expect(onreconnectingCount).toBe(1);
expect(onreconnectedCount).toBe(0);
expect(closeCount).toBe(0);
// Make sure the the Promise is "handled" immediately upon rejection or else this test fails.
continueRetryingPromise.catch(() => { });
continueRetryingPromise.reject(new Error("Reconnect attempt failed"));
continueRetryingPromise.reject(continueRetryingError);
await nextRetryDelayCalledPromise;
expect(lastRetryCount).toBe(1);
expect(lastElapsedMs).toBeGreaterThanOrEqual(0);
expect(retryReason).toBe(continueRetryingError);
expect(onreconnectingCount).toBe(1);
expect(onreconnectedCount).toBe(0);
expect(closeCount).toBe(0);
@ -133,18 +141,20 @@ describe("auto reconnect", () => {
let lastRetryCount = -1;
let lastElapsedMs = -1;
let retryReason = null;
let onreconnectingCount = 0;
let onreconnectedCount = 0;
let closeCount = 0;
const connection = new TestConnection();
const hubConnection = HubConnection.create(connection, logger, new JsonHubProtocol(), {
nextRetryDelayInMilliseconds(previousRetryCount: number, elapsedMilliseconds: number) {
lastRetryCount = previousRetryCount;
lastElapsedMs = elapsedMilliseconds;
nextRetryDelayInMilliseconds(retryContext: RetryContext) {
lastRetryCount = retryContext.previousRetryCount;
lastElapsedMs = retryContext.elapsedMilliseconds;
retryReason = retryContext.retryReason;
nextRetryDelayCalledPromise.resolve();
return previousRetryCount === 0 ? 0 : null;
return retryContext.previousRetryCount === 0 ? 0 : null;
},
});
@ -163,12 +173,15 @@ describe("auto reconnect", () => {
await hubConnection.start();
const oncloseError = new Error("Connection lost");
const startError = new Error("Reconnect attempt failed");
connection.start = () => {
return Promise.reject("Reconnect attempt failed");
throw startError;
};
// Typically this would be called by the transport
connection.onclose!(new Error("Connection lost"));
connection.onclose!(oncloseError);
await nextRetryDelayCalledPromise;
nextRetryDelayCalledPromise = new PromiseSource();
@ -176,6 +189,7 @@ describe("auto reconnect", () => {
expect(hubConnection.state).toBe(HubConnectionState.Reconnecting);
expect(lastRetryCount).toBe(0);
expect(lastElapsedMs).toBe(0);
expect(retryReason).toBe(oncloseError);
expect(onreconnectingCount).toBe(1);
expect(onreconnectedCount).toBe(0);
expect(closeCount).toBe(0);
@ -185,6 +199,7 @@ describe("auto reconnect", () => {
expect(hubConnection.state).toBe(HubConnectionState.Disconnected);
expect(lastRetryCount).toBe(1);
expect(lastElapsedMs).toBeGreaterThanOrEqual(0);
expect(retryReason).toBe(startError);
expect(onreconnectingCount).toBe(1);
expect(onreconnectedCount).toBe(0);
expect(closeCount).toBe(1);
@ -198,15 +213,17 @@ describe("auto reconnect", () => {
let lastRetryCount = -1;
let lastElapsedMs = -1;
let retryReason = null;
let onreconnectingCount = 0;
let onreconnectedCount = 0;
let closeCount = 0;
const connection = new TestConnection();
const hubConnection = HubConnection.create(connection, logger, new JsonHubProtocol(), {
nextRetryDelayInMilliseconds(previousRetryCount: number, elapsedMilliseconds: number) {
lastRetryCount = previousRetryCount;
lastElapsedMs = elapsedMilliseconds;
nextRetryDelayInMilliseconds(retryContext: RetryContext) {
lastRetryCount = retryContext.previousRetryCount;
lastElapsedMs = retryContext.elapsedMilliseconds;
retryReason = retryContext.retryReason;
nextRetryDelayCalledPromise.resolve();
return 0;
},
@ -227,8 +244,11 @@ describe("auto reconnect", () => {
await hubConnection.start();
const oncloseError = new Error("Connection lost 1");
const oncloseError2 = new Error("Connection lost 2");
// Typically this would be called by the transport
connection.onclose!(new Error("Connection lost"));
connection.onclose!(oncloseError);
await nextRetryDelayCalledPromise;
nextRetryDelayCalledPromise = new PromiseSource();
@ -236,6 +256,7 @@ describe("auto reconnect", () => {
expect(hubConnection.state).toBe(HubConnectionState.Reconnecting);
expect(lastRetryCount).toBe(0);
expect(lastElapsedMs).toBe(0);
expect(retryReason).toBe(oncloseError);
expect(onreconnectingCount).toBe(1);
expect(onreconnectedCount).toBe(0);
expect(closeCount).toBe(0);
@ -250,13 +271,14 @@ describe("auto reconnect", () => {
expect(onreconnectedCount).toBe(1);
expect(closeCount).toBe(0);
connection.onclose!(new Error("Connection lost"));
connection.onclose!(oncloseError2);
await nextRetryDelayCalledPromise;
expect(hubConnection.state).toBe(HubConnectionState.Reconnecting);
expect(lastRetryCount).toBe(0);
expect(lastElapsedMs).toBe(0);
expect(retryReason).toBe(oncloseError2);
expect(onreconnectingCount).toBe(2);
expect(onreconnectedCount).toBe(1);
expect(closeCount).toBe(0);
@ -362,6 +384,7 @@ describe("auto reconnect", () => {
let nextRetryDelayCalledPromise = new PromiseSource();
let lastRetryCount = 0;
let retryReason = null;
let onreconnectingCount = 0;
let onreconnectedCount = 0;
let closeCount = 0;
@ -369,8 +392,9 @@ describe("auto reconnect", () => {
// Disable autoHandshake in TestConnection
const connection = new TestConnection(false);
const hubConnection = HubConnection.create(connection, logger, new JsonHubProtocol(), {
nextRetryDelayInMilliseconds(previousRetryCount: number) {
lastRetryCount = previousRetryCount;
nextRetryDelayInMilliseconds(retryContext: RetryContext) {
lastRetryCount = retryContext.previousRetryCount;
retryReason = retryContext.retryReason;
nextRetryDelayCalledPromise.resolve();
return 0;
},
@ -400,14 +424,18 @@ describe("auto reconnect", () => {
return Promise.resolve();
};
const oncloseError = new Error("Connection lost 1");
const oncloseError2 = new Error("Connection lost 2");
// Typically this would be called by the transport
connection.onclose!(new Error("Connection lost"));
connection.onclose!(oncloseError);
await nextRetryDelayCalledPromise;
nextRetryDelayCalledPromise = new PromiseSource();
expect(hubConnection.state).toBe(HubConnectionState.Reconnecting);
expect(lastRetryCount).toBe(0);
expect(retryReason).toBe(oncloseError);
expect(onreconnectingCount).toBe(1);
expect(onreconnectedCount).toBe(0);
expect(closeCount).toBe(0);
@ -416,12 +444,13 @@ describe("auto reconnect", () => {
replacedStartCalledPromise = new PromiseSource();
// Fail underlying connection during reconnect during handshake
connection.onclose!(new Error("Connection lost"));
connection.onclose!(oncloseError2);
await nextRetryDelayCalledPromise;
expect(hubConnection.state).toBe(HubConnectionState.Reconnecting);
expect(lastRetryCount).toBe(1);
expect(retryReason).toBe(oncloseError2);
expect(onreconnectingCount).toBe(1);
expect(onreconnectedCount).toBe(0);
expect(closeCount).toBe(0);
@ -461,8 +490,8 @@ describe("auto reconnect", () => {
// Disable autoHandshake in TestConnection
const connection = new TestConnection(false);
const hubConnection = HubConnection.create(connection, logger, new JsonHubProtocol(), {
nextRetryDelayInMilliseconds(previousRetryCount: number) {
lastRetryCount = previousRetryCount;
nextRetryDelayInMilliseconds(retryContext: RetryContext) {
lastRetryCount = retryContext.previousRetryCount;
nextRetryDelayCalledPromise.resolve();
return 0;
},

Просмотреть файл

@ -322,7 +322,13 @@ describe("HubConnectionBuilder", () => {
let retryCount = 0;
for (const delay of DEFAULT_RETRY_DELAYS_IN_MILLISECONDS) {
expect(builder.reconnectPolicy!.nextRetryDelayInMilliseconds(retryCount++, 0)).toBe(delay);
const retryContext = {
previousRetryCount: retryCount++,
elapsedMilliseconds: 0,
retryReason: new Error(),
};
expect(builder.reconnectPolicy!.nextRetryDelayInMilliseconds(retryContext)).toBe(delay);
}
});
@ -333,23 +339,47 @@ describe("HubConnectionBuilder", () => {
let retryCount = 0;
for (const delay of customRetryDelays) {
expect(builder.reconnectPolicy!.nextRetryDelayInMilliseconds(retryCount++, 0)).toBe(delay);
const retryContext = {
previousRetryCount: retryCount++,
elapsedMilliseconds: 0,
retryReason: new Error(),
};
expect(builder.reconnectPolicy!.nextRetryDelayInMilliseconds(retryContext)).toBe(delay);
}
expect(builder.reconnectPolicy!.nextRetryDelayInMilliseconds(retryCount, 0)).toBe(null);
const retryContextFinal = {
previousRetryCount: retryCount++,
elapsedMilliseconds: 0,
retryReason: new Error(),
};
expect(builder.reconnectPolicy!.nextRetryDelayInMilliseconds(retryContextFinal)).toBe(null);
});
it("withAutomaticReconnect uses a custom IReconnectPolicy when provided", () => {
it("withAutomaticReconnect uses a custom IRetryPolicy when provided", () => {
const customRetryDelays = [127, 0, 0, 1];
const builder = new HubConnectionBuilder()
.withAutomaticReconnect(new DefaultReconnectPolicy(customRetryDelays));
let retryCount = 0;
for (const delay of customRetryDelays) {
expect(builder.reconnectPolicy!.nextRetryDelayInMilliseconds(retryCount++, 0)).toBe(delay);
const retryContext = {
previousRetryCount: retryCount++,
elapsedMilliseconds: 0,
retryReason: new Error(),
};
expect(builder.reconnectPolicy!.nextRetryDelayInMilliseconds(retryContext)).toBe(delay);
}
expect(builder.reconnectPolicy!.nextRetryDelayInMilliseconds(retryCount, 0)).toBe(null);
const retryContextFinal = {
previousRetryCount: retryCount++,
elapsedMilliseconds: 0,
retryReason: new Error(),
};
expect(builder.reconnectPolicy!.nextRetryDelayInMilliseconds(retryContextFinal)).toBe(null);
});
});

Просмотреть файл

@ -762,7 +762,7 @@ namespace Microsoft.AspNetCore.SignalR.Protocol
options.IgnoreNullValues = false;
options.IgnoreReadOnlyProperties = false;
options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
options.PropertyNameCaseInsensitive = false;
options.PropertyNameCaseInsensitive = true;
options.MaxDepth = 64;
options.DictionaryKeyPolicy = null;
options.DefaultBufferSize = 16 * 1024;

Просмотреть файл

@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.SignalR
public partial class MessagePackHubProtocolOptions
{
public MessagePackHubProtocolOptions() { }
public System.Collections.Generic.IList<MessagePack.IFormatterResolver> FormatterResolvers { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public System.Collections.Generic.IList<MessagePack.IFormatterResolver> FormatterResolvers { get { throw null; } set { } }
}
}
namespace Microsoft.AspNetCore.SignalR.Protocol

Просмотреть файл

@ -9,6 +9,25 @@ namespace Microsoft.AspNetCore.SignalR
{
public class MessagePackHubProtocolOptions
{
public IList<IFormatterResolver> FormatterResolvers { get; set; } = MessagePackHubProtocol.CreateDefaultFormatterResolvers();
private IList<IFormatterResolver> _formatterResolvers;
public IList<IFormatterResolver> FormatterResolvers
{
get
{
if (_formatterResolvers == null)
{
// The default set of resolvers trigger a static constructor that throws on AOT environments.
// This gives users the chance to use an AOT friendly formatter.
_formatterResolvers = MessagePackHubProtocol.CreateDefaultFormatterResolvers();
}
return _formatterResolvers;
}
set
{
_formatterResolvers = value;
}
}
}
}

Просмотреть файл

@ -101,6 +101,26 @@ namespace Microsoft.AspNetCore.SignalR.Common.Tests.Internal.Protocol
Assert.Equal(expectedMessage, message);
}
[Fact]
public void ReadCaseInsensitivePropertiesByDefault()
{
var input = Frame("{\"type\":2,\"invocationId\":\"123\",\"item\":{\"StrIngProp\":\"test\",\"DoublePrOp\":3.14159,\"IntProp\":43,\"DateTimeProp\":\"2019-06-03T22:00:00\",\"NuLLProp\":null,\"ByteARRProp\":\"AgQG\"}}");
var binder = new TestBinder(null, typeof(TemporaryCustomObject));
var data = new ReadOnlySequence<byte>(Encoding.UTF8.GetBytes(input));
JsonHubProtocol.TryParseMessage(ref data, binder, out var message);
var streamItemMessage = Assert.IsType<StreamItemMessage>(message);
Assert.Equal(new TemporaryCustomObject()
{
ByteArrProp = new byte[] { 2, 4, 6 },
IntProp = 43,
DoubleProp = 3.14159,
StringProp = "test",
DateTimeProp = DateTime.Parse("6/3/2019 10:00:00 PM")
}, streamItemMessage.Item);
}
public static IDictionary<string, JsonProtocolTestData> CustomProtocolTestData => new[]
{
new JsonProtocolTestData("InvocationMessage_HasFloatArgument", new InvocationMessage(null, "Target", new object[] { 1, "Foo", 2.0f }), true, true, "{\"type\":1,\"target\":\"Target\",\"arguments\":[1,\"Foo\",2]}"),

Просмотреть файл

@ -2,7 +2,6 @@
// 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;
using Microsoft.AspNetCore.SignalR.Client;
@ -29,7 +28,9 @@ namespace ClientSample
public static async Task<int> ExecuteAsync(string baseUrl)
{
var uri = baseUrl == null ? new Uri("net.tcp://127.0.0.1:9001") : new Uri(baseUrl);
Console.WriteLine("Connecting to {0}", uri);
var connectionBuilder = new HubConnectionBuilder()
.ConfigureLogging(logging =>
{
@ -52,88 +53,91 @@ namespace ClientSample
connectionBuilder.WithAutomaticReconnect();
using var closedTokenSource = new CancellationTokenSource();
var connection = connectionBuilder.Build();
Console.CancelKeyPress += (sender, a) =>
try
{
a.Cancel = true;
connection.DisposeAsync().GetAwaiter().GetResult();
};
// Set up handler
connection.On<string>("Send", Console.WriteLine);
CancellationTokenSource closedTokenSource = null;
connection.Closed += e =>
{
// This should never be null by the time this fires
closedTokenSource.Cancel();
Console.WriteLine("Connection closed...");
return Task.CompletedTask;
};
do
{
// Dispose the previous token
closedTokenSource?.Dispose();
// Create a new token for this run
closedTokenSource = new CancellationTokenSource();
// Connect to the server
} while (!await ConnectAsync(connection));
Console.WriteLine("Connected to {0}", uri);
// Handle the connected connection
while (true)
{
try
Console.CancelKeyPress += (sender, a) =>
{
a.Cancel = true;
closedTokenSource.Cancel();
connection.StopAsync().GetAwaiter().GetResult();
};
// Set up handler
connection.On<string>("Send", Console.WriteLine);
connection.Closed += e =>
{
Console.WriteLine("Connection closed...");
closedTokenSource.Cancel();
return Task.CompletedTask;
};
if (!await ConnectAsync(connection, closedTokenSource.Token))
{
Console.WriteLine("Failed to establish a connection to '{0}' because the CancelKeyPress event fired first. Exiting...", uri);
return 0;
}
Console.WriteLine("Connected to {0}", uri);
// Handle the connected connection
while (true)
{
// If the underlying connection closes while waiting for user input, the user will not observe
// the connection close aside from "Connection closed..." being printed to the console. That's
// because cancelling Console.ReadLine() is a royal pain.
var line = Console.ReadLine();
if (line == null || closedTokenSource.Token.IsCancellationRequested)
{
Console.WriteLine("Exiting...");
break;
}
await connection.InvokeAsync<object>("Send", line);
}
catch (ObjectDisposedException)
{
// We're shutting down the client
break;
}
catch (Exception ex)
{
// Send could have failed because the connection closed
// Continue to loop because we should be reconnecting.
Console.WriteLine(ex);
try
{
await connection.InvokeAsync<object>("Send", line);
}
catch when (closedTokenSource.IsCancellationRequested)
{
// We're shutting down the client
Console.WriteLine("Failed to send '{0}' because the CancelKeyPress event fired first. Exiting...", line);
break;
}
catch (Exception ex)
{
// Send could have failed because the connection closed
// Continue to loop because we should be reconnecting.
Console.WriteLine(ex);
}
}
}
finally
{
await connection.StopAsync();
}
return 0;
}
private static async Task<bool> ConnectAsync(HubConnection connection)
private static async Task<bool> ConnectAsync(HubConnection connection, CancellationToken token)
{
// Keep trying to until we can start
while (true)
{
try
{
await connection.StartAsync();
await connection.StartAsync(token);
return true;
}
catch (ObjectDisposedException)
catch when (token.IsCancellationRequested)
{
// Client side killed the connection
return false;
}
catch (Exception)
catch
{
Console.WriteLine("Failed to connect, trying again in 5000(ms)");

Просмотреть файл

@ -331,6 +331,7 @@ namespace Microsoft.AspNetCore.SignalR.Internal
}
catch (Exception ex)
{
Log.FailedInvokingHubMethod(_logger, hubMethodInvocationMessage.Target, ex);
await SendInvocationError(hubMethodInvocationMessage.InvocationId, connection,
ErrorMessageHelper.BuildErrorMessage($"An unexpected error occurred invoking '{hubMethodInvocationMessage.Target}' on the server.", ex, _enableDetailedErrors));
return;

Просмотреть файл

@ -859,10 +859,17 @@ namespace Microsoft.AspNetCore.SignalR.Tests
[InlineData(nameof(MethodHub.MethodThatYieldsFailedTask), false)]
public async Task HubMethodCanThrowOrYieldFailedTask(string methodName, bool detailedErrors)
{
var hasErrorLog = false;
bool ExpectedErrors(WriteContext writeContext)
{
return writeContext.LoggerName == "Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher" &&
var expected = writeContext.LoggerName == "Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher" &&
writeContext.EventId.Name == "FailedInvokingHubMethod";
if (expected)
{
hasErrorLog = true;
return true;
}
return false;
}
using (StartVerifiableLog(ExpectedErrors))
@ -898,6 +905,8 @@ namespace Microsoft.AspNetCore.SignalR.Tests
await connectionHandlerTask.OrTimeout();
}
}
Assert.True(hasErrorLog);
}
[Fact]

Просмотреть файл

@ -7,17 +7,20 @@ using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using Microsoft.AspNetCore.Testing.xunit;
using Xunit;
using Xunit.Abstractions;
namespace Microsoft.AspNetCore.Certificates.Generation.Tests
{
public class CertificateManagerTests
public class CertificateManagerTests : IClassFixture<CertFixture>
{
public CertificateManagerTests(ITestOutputHelper output)
private CertFixture _fixture;
private CertificateManager _manager => _fixture.Manager;
public CertificateManagerTests(ITestOutputHelper output, CertFixture fixture)
{
_fixture = fixture;
Output = output;
}
@ -25,122 +28,31 @@ namespace Microsoft.AspNetCore.Certificates.Generation.Tests
public ITestOutputHelper Output { get; }
[Fact(Skip = "True")]
[ConditionalFact]
[SkipOnHelix("https://github.com/aspnet/AspNetCore/issues/6721")]
public void EnsureCreateHttpsCertificate_CreatesACertificate_WhenThereAreNoHttpsCertificates()
{
try
{
// Arrange
_fixture.CleanupCertificates();
const string CertificateName = nameof(EnsureCreateHttpsCertificate_CreatesACertificate_WhenThereAreNoHttpsCertificates) + ".cer";
var manager = new CertificateManager();
manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, TestCertificateSubject);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.Root, StoreLocation.CurrentUser, TestCertificateSubject);
}
// Act
// Act
DateTimeOffset now = DateTimeOffset.UtcNow;
now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset);
var result = manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), CertificateName, trust: false, subject: TestCertificateSubject);
// Assert
Assert.Equal(EnsureCertificateResult.Succeeded, result);
Assert.True(File.Exists(CertificateName));
var exportedCertificate = new X509Certificate2(File.ReadAllBytes(CertificateName));
Assert.NotNull(exportedCertificate);
Assert.False(exportedCertificate.HasPrivateKey);
var httpsCertificates = manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: false);
var httpsCertificate = Assert.Single(httpsCertificates, c => c.Subject == TestCertificateSubject);
Assert.True(httpsCertificate.HasPrivateKey);
Assert.Equal(TestCertificateSubject, httpsCertificate.Subject);
Assert.Equal(TestCertificateSubject, httpsCertificate.Issuer);
Assert.Equal("sha256RSA", httpsCertificate.SignatureAlgorithm.FriendlyName);
Assert.Equal("1.2.840.113549.1.1.11", httpsCertificate.SignatureAlgorithm.Value);
Assert.Equal(now.LocalDateTime, httpsCertificate.NotBefore);
Assert.Equal(now.AddYears(1).LocalDateTime, httpsCertificate.NotAfter);
Assert.Contains(
httpsCertificate.Extensions.OfType<X509Extension>(),
e => e is X509BasicConstraintsExtension basicConstraints &&
basicConstraints.Critical == true &&
basicConstraints.CertificateAuthority == false &&
basicConstraints.HasPathLengthConstraint == false &&
basicConstraints.PathLengthConstraint == 0);
Assert.Contains(
httpsCertificate.Extensions.OfType<X509Extension>(),
e => e is X509KeyUsageExtension keyUsage &&
keyUsage.Critical == true &&
keyUsage.KeyUsages == (X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DigitalSignature));
Assert.Contains(
httpsCertificate.Extensions.OfType<X509Extension>(),
e => e is X509EnhancedKeyUsageExtension enhancedKeyUsage &&
enhancedKeyUsage.Critical == true &&
enhancedKeyUsage.EnhancedKeyUsages.OfType<Oid>().Single() is Oid keyUsage &&
keyUsage.Value == "1.3.6.1.5.5.7.3.1");
// Subject alternative name
Assert.Contains(
httpsCertificate.Extensions.OfType<X509Extension>(),
e => e.Critical == true &&
e.Oid.Value == "2.5.29.17");
// ASP.NET HTTPS Development certificate extension
Assert.Contains(
httpsCertificate.Extensions.OfType<X509Extension>(),
e => e.Critical == false &&
e.Oid.Value == "1.3.6.1.4.1.311.84.1.1" &&
Encoding.ASCII.GetString(e.RawData) == "ASP.NET Core HTTPS development certificate");
Assert.Equal(httpsCertificate.GetCertHashString(), exportedCertificate.GetCertHashString());
}
catch (Exception e)
{
Output.WriteLine(e.Message);
ListCertificates(Output);
throw;
}
}
[ConditionalFact]
[SkipOnHelix("https://github.com/aspnet/AspNetCore/issues/6721")]
public void EnsureCreateHttpsCertificate2_CreatesACertificate_WhenThereAreNoHttpsCertificates()
{
try
{
// Arrange
const string CertificateName = nameof(EnsureCreateHttpsCertificate_CreatesACertificate_WhenThereAreNoHttpsCertificates) + ".cer";
var manager = new CertificateManager();
manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, TestCertificateSubject);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.Root, StoreLocation.CurrentUser, TestCertificateSubject);
}
// Act
DateTimeOffset now = DateTimeOffset.UtcNow;
now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset);
var result = manager.EnsureAspNetCoreHttpsDevelopmentCertificate2(now, now.AddYears(1), CertificateName, trust: false, subject: TestCertificateSubject);
var result = _manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), CertificateName, trust: false, subject: TestCertificateSubject);
// Assert
Assert.Equal(EnsureCertificateResult.Succeeded, result.ResultCode);
Assert.NotNull(result.Diagnostics);
Assert.NotEmpty(result.Diagnostics.Messages);
Assert.Empty(result.Diagnostics.Exceptions);
Assert.True(File.Exists(CertificateName));
var exportedCertificate = new X509Certificate2(File.ReadAllBytes(CertificateName));
Assert.NotNull(exportedCertificate);
Assert.False(exportedCertificate.HasPrivateKey);
var httpsCertificates = manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: false);
var httpsCertificates = _manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: false);
var httpsCertificate = Assert.Single(httpsCertificates, c => c.Subject == TestCertificateSubject);
Assert.True(httpsCertificate.HasPrivateKey);
Assert.Equal(TestCertificateSubject, httpsCertificate.Subject);
@ -182,7 +94,7 @@ namespace Microsoft.AspNetCore.Certificates.Generation.Tests
httpsCertificate.Extensions.OfType<X509Extension>(),
e => e.Critical == false &&
e.Oid.Value == "1.3.6.1.4.1.311.84.1.1" &&
Encoding.ASCII.GetString(e.RawData) == "ASP.NET Core HTTPS development certificate");
e.RawData[0] == _manager.AspNetHttpsCertificateVersion);
Assert.Equal(httpsCertificate.GetCertHashString(), exportedCertificate.GetCertHashString());
@ -211,32 +123,27 @@ namespace Microsoft.AspNetCore.Certificates.Generation.Tests
}
}
[Fact(Skip = "true")]
[ConditionalFact]
[SkipOnHelix("https://github.com/aspnet/AspNetCore/issues/6721")]
public void EnsureCreateHttpsCertificate_DoesNotCreateACertificate_WhenThereIsAnExistingHttpsCertificates()
{
// Arrange
const string CertificateName = nameof(EnsureCreateHttpsCertificate_DoesNotCreateACertificate_WhenThereIsAnExistingHttpsCertificates) + ".pfx";
var certificatePassword = Guid.NewGuid().ToString();
var manager = new CertificateManager();
manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, TestCertificateSubject);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.Root, StoreLocation.CurrentUser, TestCertificateSubject);
}
_fixture.CleanupCertificates();
DateTimeOffset now = DateTimeOffset.UtcNow;
now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset);
manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), path: null, trust: false, subject: TestCertificateSubject);
_manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), path: null, trust: false, subject: TestCertificateSubject);
var httpsCertificate = manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: false).Single(c => c.Subject == TestCertificateSubject);
var httpsCertificate = _manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: false).Single(c => c.Subject == TestCertificateSubject);
// Act
var result = manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), CertificateName, trust: false, includePrivateKey: true, password: certificatePassword, subject: TestCertificateSubject);
var result = _manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), CertificateName, trust: false, includePrivateKey: true, password: certificatePassword, subject: TestCertificateSubject);
// Assert
Assert.Equal(EnsureCertificateResult.ValidCertificatePresent, result);
Assert.Equal(EnsureCertificateResult.ValidCertificatePresent, result.ResultCode);
Assert.True(File.Exists(CertificateName));
var exportedCertificate = new X509Certificate2(File.ReadAllBytes(CertificateName), certificatePassword);
@ -247,39 +154,125 @@ namespace Microsoft.AspNetCore.Certificates.Generation.Tests
Assert.Equal(httpsCertificate.GetCertHashString(), exportedCertificate.GetCertHashString());
}
[Fact(Skip = "Requires user interaction")]
public void EnsureAspNetCoreHttpsDevelopmentCertificate_ReturnsCorrectResult_WhenUserCancelsTrustStepOnWindows()
[ConditionalFact]
[SkipOnHelix("https://github.com/aspnet/AspNetCore/issues/6721")]
public void EnsureCreateHttpsCertificate_ReturnsExpiredCertificateIfVersionIsIncorrect()
{
var manager = new CertificateManager();
manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, TestCertificateSubject);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.Root, StoreLocation.CurrentUser, TestCertificateSubject);
}
_fixture.CleanupCertificates();
DateTimeOffset now = DateTimeOffset.UtcNow;
now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset);
var trustFailed = manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), path: null, trust: true, subject: TestCertificateSubject);
_manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), path: null, trust: false, subject: TestCertificateSubject);
Assert.Equal(EnsureCertificateResult.UserCancelledTrustStep, trustFailed);
_manager.AspNetHttpsCertificateVersion = 2;
var httpsCertificateList = _manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: true);
Assert.Empty(httpsCertificateList);
}
[ConditionalFact]
[SkipOnHelix("https://github.com/aspnet/AspNetCore/issues/6721")]
public void EnsureCreateHttpsCertificate_ReturnsExpiredCertificateForEmptyVersionField()
{
_fixture.CleanupCertificates();
DateTimeOffset now = DateTimeOffset.UtcNow;
now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset);
_manager.AspNetHttpsCertificateVersion = 0;
_manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), path: null, trust: false, subject: TestCertificateSubject);
_manager.AspNetHttpsCertificateVersion = 1;
var httpsCertificateList = _manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: true);
Assert.Empty(httpsCertificateList);
}
[ConditionalFact]
[SkipOnHelix("https://github.com/aspnet/AspNetCore/issues/6721")]
public void EnsureCreateHttpsCertificate_ReturnsValidIfVersionIsZero()
{
_fixture.CleanupCertificates();
DateTimeOffset now = DateTimeOffset.UtcNow;
now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset);
_manager.AspNetHttpsCertificateVersion = 0;
_manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), path: null, trust: false, subject: TestCertificateSubject);
var httpsCertificateList = _manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: true);
Assert.NotEmpty(httpsCertificateList);
}
[ConditionalFact]
[SkipOnHelix("https://github.com/aspnet/AspNetCore/issues/6721")]
public void EnsureCreateHttpsCertificate_ReturnValidIfCertIsNewer()
{
_fixture.CleanupCertificates();
DateTimeOffset now = DateTimeOffset.UtcNow;
now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset);
_manager.AspNetHttpsCertificateVersion = 2;
_manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), path: null, trust: false, subject: TestCertificateSubject);
_manager.AspNetHttpsCertificateVersion = 1;
var httpsCertificateList = _manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: true);
Assert.NotEmpty(httpsCertificateList);
}
[Fact(Skip = "Requires user interaction")]
public void EnsureAspNetCoreHttpsDevelopmentCertificate_ReturnsCorrectResult_WhenUserCancelsTrustStepOnWindows()
{
_fixture.CleanupCertificates();
DateTimeOffset now = DateTimeOffset.UtcNow;
now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset);
var trustFailed = _manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), path: null, trust: true, subject: TestCertificateSubject);
Assert.Equal(EnsureCertificateResult.UserCancelledTrustStep, trustFailed.ResultCode);
}
[Fact(Skip = "Requires user interaction")]
public void EnsureAspNetCoreHttpsDevelopmentCertificate_CanRemoveCertificates()
{
var manager = new CertificateManager();
_fixture.CleanupCertificates();
DateTimeOffset now = DateTimeOffset.UtcNow;
now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset);
manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), path: null, trust: true, subject: TestCertificateSubject);
_manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), path: null, trust: true, subject: TestCertificateSubject);
manager.CleanupHttpsCertificates(TestCertificateSubject);
_manager.CleanupHttpsCertificates(TestCertificateSubject);
Assert.Empty(manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: false).Where(c => c.Subject == TestCertificateSubject));
Assert.Empty(_manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: false).Where(c => c.Subject == TestCertificateSubject));
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
Assert.Empty(manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.Root, StoreLocation.CurrentUser, isValid: false).Where(c => c.Subject == TestCertificateSubject));
Assert.Empty(_manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.Root, StoreLocation.CurrentUser, isValid: false).Where(c => c.Subject == TestCertificateSubject));
}
}
}
public class CertFixture : IDisposable
{
public const string TestCertificateSubject = "CN=aspnet.test";
public CertFixture()
{
Manager = new CertificateManager();
CleanupCertificates();
}
internal CertificateManager Manager { get; set; }
public void Dispose()
{
CleanupCertificates();
}
internal void CleanupCertificates()
{
Manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, TestCertificateSubject);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
Manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.Root, StoreLocation.CurrentUser, TestCertificateSubject);
}
}
}

Просмотреть файл

@ -7,6 +7,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-watch", "dotnet-watc
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-watch.Tests", "dotnet-watch\test\dotnet-watch.Tests.csproj", "{63F7E822-D1E2-4C41-8ABF-60B9E3A9C54C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-dev-certs", "dotnet-dev-certs\src\dotnet-dev-certs.csproj", "{0D6D5693-7E0C-4FE8-B4AA-21207B2650AA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.DeveloperCertificates.XPlat", "FirstRunCertGenerator\src\Microsoft.AspNetCore.DeveloperCertificates.XPlat.csproj", "{7BBDBDA2-299F-4C36-8338-23C525901DE0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.DeveloperCertificates.XPlat.Tests", "FirstRunCertGenerator\test\Microsoft.AspNetCore.DeveloperCertificates.XPlat.Tests.csproj", "{1EC6FA27-40A5-433F-8CA1-636E7ED8863E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -21,6 +27,18 @@ Global
{63F7E822-D1E2-4C41-8ABF-60B9E3A9C54C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{63F7E822-D1E2-4C41-8ABF-60B9E3A9C54C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{63F7E822-D1E2-4C41-8ABF-60B9E3A9C54C}.Release|Any CPU.Build.0 = Release|Any CPU
{0D6D5693-7E0C-4FE8-B4AA-21207B2650AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0D6D5693-7E0C-4FE8-B4AA-21207B2650AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0D6D5693-7E0C-4FE8-B4AA-21207B2650AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0D6D5693-7E0C-4FE8-B4AA-21207B2650AA}.Release|Any CPU.Build.0 = Release|Any CPU
{7BBDBDA2-299F-4C36-8338-23C525901DE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7BBDBDA2-299F-4C36-8338-23C525901DE0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7BBDBDA2-299F-4C36-8338-23C525901DE0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7BBDBDA2-299F-4C36-8338-23C525901DE0}.Release|Any CPU.Build.0 = Release|Any CPU
{1EC6FA27-40A5-433F-8CA1-636E7ED8863E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1EC6FA27-40A5-433F-8CA1-636E7ED8863E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1EC6FA27-40A5-433F-8CA1-636E7ED8863E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1EC6FA27-40A5-433F-8CA1-636E7ED8863E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

Просмотреть файл

@ -81,6 +81,7 @@ namespace Microsoft.AspNetCore.DeveloperCertificates.Tools
(check.HasValue() && (exportPath.HasValue() || password.HasValue() || clean.HasValue())))
{
reporter.Error(@"Incompatible set of flags. Sample usages
'dotnet dev-certs https'
'dotnet dev-certs https --clean'
'dotnet dev-certs https --check --trust'
'dotnet dev-certs https -ep ./certificate.pfx -p password --trust'");
@ -133,7 +134,7 @@ namespace Microsoft.AspNetCore.DeveloperCertificates.Tools
}
manager.CleanupHttpsCertificates();
reporter.Verbose("HTTPS development certificates successfully removed from the machine.");
reporter.Output("HTTPS development certificates successfully removed from the machine.");
return Success;
}
catch(Exception e)
@ -152,12 +153,12 @@ namespace Microsoft.AspNetCore.DeveloperCertificates.Tools
var certificates = certificateManager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: true);
if (certificates.Count == 0)
{
reporter.Verbose("No valid certificate found.");
reporter.Output("No valid certificate found.");
return ErrorNoValidCertificateFound;
}
else
{
reporter.Verbose("A valid certificate was found.");
reporter.Output("A valid certificate was found.");
}
if (trust != null && trust.HasValue())
@ -166,13 +167,13 @@ namespace Microsoft.AspNetCore.DeveloperCertificates.Tools
var trustedCertificates = certificateManager.ListCertificates(CertificatePurpose.HTTPS, store, StoreLocation.CurrentUser, isValid: true);
if (!certificates.Any(c => certificateManager.IsTrusted(c)))
{
reporter.Verbose($@"The following certificates were found, but none of them is trusted:
reporter.Output($@"The following certificates were found, but none of them is trusted:
{string.Join(Environment.NewLine, certificates.Select(c => $"{c.Subject} - {c.Thumbprint}"))}");
return ErrorCertificateNotTrusted;
}
else
{
reporter.Verbose("A trusted certificate was found.");
reporter.Output("A trusted certificate was found.");
}
}
@ -207,7 +208,9 @@ namespace Microsoft.AspNetCore.DeveloperCertificates.Tools
password.HasValue(),
password.Value());
switch (result)
reporter.Verbose(string.Join(Environment.NewLine, result.Diagnostics.Messages));
switch (result.ResultCode)
{
case EnsureCertificateResult.Succeeded:
reporter.Output("The HTTPS developer certificate was generated successfully.");