Merge pull request #13019 from dotnet-maestro-bot/merge/release/3.0-to-master
[automated] Merge branch 'release/3.0' => 'master'
This commit is contained in:
commit
057ec9cfae
|
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
<!-- These projects use 'legacy' csproj, which is not supported by dotnet-msbuild. -->
|
<!-- These projects use 'legacy' csproj, which is not supported by dotnet-msbuild. -->
|
||||||
<ProjectToExclude Include="
|
<ProjectToExclude Include="
|
||||||
$(RepoRoot)src\Components\Blazor\BlazorExtension\src\Microsoft.VisualStudio.BlazorExtension.csproj;
|
|
||||||
$(RepoRoot)src\Servers\HttpSys\samples\TestClient\TestClient.csproj;
|
$(RepoRoot)src\Servers\HttpSys\samples\TestClient\TestClient.csproj;
|
||||||
$(RepoRoot)src\Middleware\WebSockets\samples\TestServer\WebSockets.TestServer.csproj;
|
$(RepoRoot)src\Middleware\WebSockets\samples\TestServer\WebSockets.TestServer.csproj;
|
||||||
"
|
"
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
-->
|
-->
|
||||||
<Project>
|
<Project>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.ApiAuthorization.IdentityServer" ProjectPath="$(RepoRoot)src\Identity\ApiAuthorization.IdentityServer\src\Microsoft.AspNetCore.ApiAuthorization.IdentityServer.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Identity.Specification.Tests" ProjectPath="$(RepoRoot)src\Identity\Specification.Tests\src\Microsoft.AspNetCore.Identity.Specification.Tests.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Identity.Specification.Tests" ProjectPath="$(RepoRoot)src\Identity\Specification.Tests\src\Microsoft.AspNetCore.Identity.Specification.Tests.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.Web.Xdt.Extensions" ProjectPath="$(RepoRoot)src\SiteExtensions\Microsoft.Web.Xdt.Extensions\src\Microsoft.Web.Xdt.Extensions.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.Web.Xdt.Extensions" ProjectPath="$(RepoRoot)src\SiteExtensions\Microsoft.Web.Xdt.Extensions\src\Microsoft.Web.Xdt.Extensions.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.DeveloperCertificates.XPlat" ProjectPath="$(RepoRoot)src\Tools\FirstRunCertGenerator\src\Microsoft.AspNetCore.DeveloperCertificates.XPlat.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.DeveloperCertificates.XPlat" ProjectPath="$(RepoRoot)src\Tools\FirstRunCertGenerator\src\Microsoft.AspNetCore.DeveloperCertificates.XPlat.csproj" />
|
||||||
|
|
@ -44,7 +45,6 @@
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Routing" ProjectPath="$(RepoRoot)src\Http\Routing\src\Microsoft.AspNetCore.Routing.csproj" RefProjectPath="$(RepoRoot)src\Http\Routing\ref\Microsoft.AspNetCore.Routing.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Routing" ProjectPath="$(RepoRoot)src\Http\Routing\src\Microsoft.AspNetCore.Routing.csproj" RefProjectPath="$(RepoRoot)src\Http\Routing\ref\Microsoft.AspNetCore.Routing.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.WebUtilities" ProjectPath="$(RepoRoot)src\Http\WebUtilities\src\Microsoft.AspNetCore.WebUtilities.csproj" RefProjectPath="$(RepoRoot)src\Http\WebUtilities\ref\Microsoft.AspNetCore.WebUtilities.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.WebUtilities" ProjectPath="$(RepoRoot)src\Http\WebUtilities\src\Microsoft.AspNetCore.WebUtilities.csproj" RefProjectPath="$(RepoRoot)src\Http\WebUtilities\ref\Microsoft.AspNetCore.WebUtilities.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Html.Abstractions" ProjectPath="$(RepoRoot)src\Html\Abstractions\src\Microsoft.AspNetCore.Html.Abstractions.csproj" RefProjectPath="$(RepoRoot)src\Html\Abstractions\ref\Microsoft.AspNetCore.Html.Abstractions.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Html.Abstractions" ProjectPath="$(RepoRoot)src\Html\Abstractions\src\Microsoft.AspNetCore.Html.Abstractions.csproj" RefProjectPath="$(RepoRoot)src\Html\Abstractions\ref\Microsoft.AspNetCore.Html.Abstractions.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.ApiAuthorization.IdentityServer" ProjectPath="$(RepoRoot)src\Identity\ApiAuthorization.IdentityServer\src\Microsoft.AspNetCore.ApiAuthorization.IdentityServer.csproj" RefProjectPath="$(RepoRoot)src\Identity\ApiAuthorization.IdentityServer\ref\Microsoft.AspNetCore.ApiAuthorization.IdentityServer.csproj" />
|
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Identity" ProjectPath="$(RepoRoot)src\Identity\Core\src\Microsoft.AspNetCore.Identity.csproj" RefProjectPath="$(RepoRoot)src\Identity\Core\ref\Microsoft.AspNetCore.Identity.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Identity" ProjectPath="$(RepoRoot)src\Identity\Core\src\Microsoft.AspNetCore.Identity.csproj" RefProjectPath="$(RepoRoot)src\Identity\Core\ref\Microsoft.AspNetCore.Identity.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" ProjectPath="$(RepoRoot)src\Identity\EntityFrameworkCore\src\Microsoft.AspNetCore.Identity.EntityFrameworkCore.csproj" RefProjectPath="$(RepoRoot)src\Identity\EntityFrameworkCore\ref\Microsoft.AspNetCore.Identity.EntityFrameworkCore.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" ProjectPath="$(RepoRoot)src\Identity\EntityFrameworkCore\src\Microsoft.AspNetCore.Identity.EntityFrameworkCore.csproj" RefProjectPath="$(RepoRoot)src\Identity\EntityFrameworkCore\ref\Microsoft.AspNetCore.Identity.EntityFrameworkCore.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.Extensions.Identity.Core" ProjectPath="$(RepoRoot)src\Identity\Extensions.Core\src\Microsoft.Extensions.Identity.Core.csproj" RefProjectPath="$(RepoRoot)src\Identity\Extensions.Core\ref\Microsoft.Extensions.Identity.Core.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.Extensions.Identity.Core" ProjectPath="$(RepoRoot)src\Identity\Extensions.Core\src\Microsoft.Extensions.Identity.Core.csproj" RefProjectPath="$(RepoRoot)src\Identity\Extensions.Core\ref\Microsoft.Extensions.Identity.Core.csproj" />
|
||||||
|
|
@ -131,10 +131,12 @@
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR.Core" ProjectPath="$(RepoRoot)src\SignalR\server\Core\src\Microsoft.AspNetCore.SignalR.Core.csproj" RefProjectPath="$(RepoRoot)src\SignalR\server\Core\ref\Microsoft.AspNetCore.SignalR.Core.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR.Core" ProjectPath="$(RepoRoot)src\SignalR\server\Core\src\Microsoft.AspNetCore.SignalR.Core.csproj" RefProjectPath="$(RepoRoot)src\SignalR\server\Core\ref\Microsoft.AspNetCore.SignalR.Core.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR" ProjectPath="$(RepoRoot)src\SignalR\server\SignalR\src\Microsoft.AspNetCore.SignalR.csproj" RefProjectPath="$(RepoRoot)src\SignalR\server\SignalR\ref\Microsoft.AspNetCore.SignalR.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR" ProjectPath="$(RepoRoot)src\SignalR\server\SignalR\src\Microsoft.AspNetCore.SignalR.csproj" RefProjectPath="$(RepoRoot)src\SignalR\server\SignalR\ref\Microsoft.AspNetCore.SignalR.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" ProjectPath="$(RepoRoot)src\SignalR\server\StackExchangeRedis\src\Microsoft.AspNetCore.SignalR.StackExchangeRedis.csproj" RefProjectPath="$(RepoRoot)src\SignalR\server\StackExchangeRedis\ref\Microsoft.AspNetCore.SignalR.StackExchangeRedis.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" ProjectPath="$(RepoRoot)src\SignalR\server\StackExchangeRedis\src\Microsoft.AspNetCore.SignalR.StackExchangeRedis.csproj" RefProjectPath="$(RepoRoot)src\SignalR\server\StackExchangeRedis\ref\Microsoft.AspNetCore.SignalR.StackExchangeRedis.csproj" />
|
||||||
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Components.Authorization" ProjectPath="$(RepoRoot)src\Components\Authorization\src\Microsoft.AspNetCore.Components.Authorization.csproj" RefProjectPath="$(RepoRoot)src\Components\Authorization\ref\Microsoft.AspNetCore.Components.Authorization.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Blazor" ProjectPath="$(RepoRoot)src\Components\Blazor\Blazor\src\Microsoft.AspNetCore.Blazor.csproj" RefProjectPath="$(RepoRoot)src\Components\Blazor\Blazor\ref\Microsoft.AspNetCore.Blazor.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Blazor" ProjectPath="$(RepoRoot)src\Components\Blazor\Blazor\src\Microsoft.AspNetCore.Blazor.csproj" RefProjectPath="$(RepoRoot)src\Components\Blazor\Blazor\ref\Microsoft.AspNetCore.Blazor.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Blazor.HttpClient" ProjectPath="$(RepoRoot)src\Components\Blazor\Http\src\Microsoft.AspNetCore.Blazor.HttpClient.csproj" RefProjectPath="$(RepoRoot)src\Components\Blazor\Http\ref\Microsoft.AspNetCore.Blazor.HttpClient.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Blazor.HttpClient" ProjectPath="$(RepoRoot)src\Components\Blazor\Http\src\Microsoft.AspNetCore.Blazor.HttpClient.csproj" RefProjectPath="$(RepoRoot)src\Components\Blazor\Http\ref\Microsoft.AspNetCore.Blazor.HttpClient.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Blazor.Server" ProjectPath="$(RepoRoot)src\Components\Blazor\Server\src\Microsoft.AspNetCore.Blazor.Server.csproj" RefProjectPath="$(RepoRoot)src\Components\Blazor\Server\ref\Microsoft.AspNetCore.Blazor.Server.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Blazor.Server" ProjectPath="$(RepoRoot)src\Components\Blazor\Server\src\Microsoft.AspNetCore.Blazor.Server.csproj" RefProjectPath="$(RepoRoot)src\Components\Blazor\Server\ref\Microsoft.AspNetCore.Blazor.Server.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Components" ProjectPath="$(RepoRoot)src\Components\Components\src\Microsoft.AspNetCore.Components.csproj" RefProjectPath="$(RepoRoot)src\Components\Components\ref\Microsoft.AspNetCore.Components.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Components" ProjectPath="$(RepoRoot)src\Components\Components\src\Microsoft.AspNetCore.Components.csproj" RefProjectPath="$(RepoRoot)src\Components\Components\ref\Microsoft.AspNetCore.Components.csproj" />
|
||||||
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Components.Forms" ProjectPath="$(RepoRoot)src\Components\Forms\src\Microsoft.AspNetCore.Components.Forms.csproj" RefProjectPath="$(RepoRoot)src\Components\Forms\ref\Microsoft.AspNetCore.Components.Forms.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Components.Server" ProjectPath="$(RepoRoot)src\Components\Server\src\Microsoft.AspNetCore.Components.Server.csproj" RefProjectPath="$(RepoRoot)src\Components\Server\ref\Microsoft.AspNetCore.Components.Server.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Components.Server" ProjectPath="$(RepoRoot)src\Components\Server\src\Microsoft.AspNetCore.Components.Server.csproj" RefProjectPath="$(RepoRoot)src\Components\Server\ref\Microsoft.AspNetCore.Components.Server.csproj" />
|
||||||
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Components.Web" ProjectPath="$(RepoRoot)src\Components\Web\src\Microsoft.AspNetCore.Components.Web.csproj" RefProjectPath="$(RepoRoot)src\Components\Web\ref\Microsoft.AspNetCore.Components.Web.csproj" />
|
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Components.Web" ProjectPath="$(RepoRoot)src\Components\Web\src\Microsoft.AspNetCore.Components.Web.csproj" RefProjectPath="$(RepoRoot)src\Components\Web\ref\Microsoft.AspNetCore.Components.Web.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@
|
||||||
These compilation references are necessary to compile netstandard2.0 assemblies which are in the shared framework.
|
These compilation references are necessary to compile netstandard2.0 assemblies which are in the shared framework.
|
||||||
This references are part of Microsoft.NETCore.App, so are listed here as references to be used during compilation only.
|
This references are part of Microsoft.NETCore.App, so are listed here as references to be used during compilation only.
|
||||||
-->
|
-->
|
||||||
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1'">
|
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0' or $(TargetFrameworks.Contains('netstandard2.0')) or '$(TargetFramework)' == 'netstandard2.1'">
|
||||||
<_CompilationOnlyReference Include="Microsoft.Win32.Registry" />
|
<_CompilationOnlyReference Include="Microsoft.Win32.Registry" />
|
||||||
<_CompilationOnlyReference Include="System.Security.Cryptography.Cng" />
|
<_CompilationOnlyReference Include="System.Security.Cryptography.Cng" />
|
||||||
<_CompilationOnlyReference Include="System.Security.Principal.Windows" />
|
<_CompilationOnlyReference Include="System.Security.Principal.Windows" />
|
||||||
|
|
@ -107,7 +107,7 @@
|
||||||
These compilation references are necessary to workaround the mismatch of what is found in the ref pack for NETCore.App and what
|
These compilation references are necessary to workaround the mismatch of what is found in the ref pack for NETCore.App and what
|
||||||
is actually present at runtime. See https://github.com/dotnet/corefx/issues/34906
|
is actually present at runtime. See https://github.com/dotnet/corefx/issues/34906
|
||||||
-->
|
-->
|
||||||
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
|
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0' or $(TargetFrameworks.Contains('netcoreapp3.0'))">
|
||||||
<_CompilationOnlyReference Include="Microsoft.Win32.Registry" />
|
<_CompilationOnlyReference Include="Microsoft.Win32.Registry" />
|
||||||
<_CompilationOnlyReference Include="System.Security.Cryptography.Cng" />
|
<_CompilationOnlyReference Include="System.Security.Cryptography.Cng" />
|
||||||
<_CompilationOnlyReference Include="System.Security.Principal.Windows" />
|
<_CompilationOnlyReference Include="System.Security.Principal.Windows" />
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,9 @@
|
||||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Http.Connections.Common" />
|
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Http.Connections.Common" />
|
||||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.SignalR.Protocols.Json" />
|
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.SignalR.Protocols.Json" />
|
||||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.SignalR.Common" />
|
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.SignalR.Common" />
|
||||||
|
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Components.Authorization" />
|
||||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Components" />
|
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Components" />
|
||||||
|
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Components.Forms" />
|
||||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Components.Web" />
|
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Components.Web" />
|
||||||
|
|
||||||
<!-- These assemblies are only in the shared framework -->
|
<!-- These assemblies are only in the shared framework -->
|
||||||
|
|
|
||||||
|
|
@ -29,412 +29,412 @@
|
||||||
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
|
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
|
||||||
<Sha>448a88e86d20fd9315901f663318d64c9c6841bf</Sha>
|
<Sha>448a88e86d20fd9315901f663318d64c9c6841bf</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="dotnet-ef" Version="3.0.0-preview9.19405.13">
|
<Dependency Name="dotnet-ef" Version="3.0.0-preview9.19412.3">
|
||||||
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
||||||
<Sha>07ed34e80585ca9575ea0265921d42a203193b21</Sha>
|
<Sha>e33237ee4210a27d16747aba8dd655cabc808922</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="3.0.0-preview9.19405.13">
|
<Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="3.0.0-preview9.19412.3">
|
||||||
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
||||||
<Sha>07ed34e80585ca9575ea0265921d42a203193b21</Sha>
|
<Sha>e33237ee4210a27d16747aba8dd655cabc808922</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="3.0.0-preview9.19405.13">
|
<Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="3.0.0-preview9.19412.3">
|
||||||
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
||||||
<Sha>07ed34e80585ca9575ea0265921d42a203193b21</Sha>
|
<Sha>e33237ee4210a27d16747aba8dd655cabc808922</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0-preview9.19405.13">
|
<Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0-preview9.19412.3">
|
||||||
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
||||||
<Sha>07ed34e80585ca9575ea0265921d42a203193b21</Sha>
|
<Sha>e33237ee4210a27d16747aba8dd655cabc808922</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview9.19405.13">
|
<Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview9.19412.3">
|
||||||
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
||||||
<Sha>07ed34e80585ca9575ea0265921d42a203193b21</Sha>
|
<Sha>e33237ee4210a27d16747aba8dd655cabc808922</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0-preview9.19405.13">
|
<Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0-preview9.19412.3">
|
||||||
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
||||||
<Sha>07ed34e80585ca9575ea0265921d42a203193b21</Sha>
|
<Sha>e33237ee4210a27d16747aba8dd655cabc808922</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.EntityFrameworkCore" Version="3.0.0-preview9.19405.13">
|
<Dependency Name="Microsoft.EntityFrameworkCore" Version="3.0.0-preview9.19412.3">
|
||||||
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
||||||
<Sha>07ed34e80585ca9575ea0265921d42a203193b21</Sha>
|
<Sha>e33237ee4210a27d16747aba8dd655cabc808922</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.ActivatorUtilities.Sources" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.ActivatorUtilities.Sources" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Caching.Memory" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Caching.Memory" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.CommandLineUtils.Sources" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.CommandLineUtils.Sources" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Configuration.Json" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Configuration.Json" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Configuration.KeyPerFile" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Configuration.KeyPerFile" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Configuration" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Configuration" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.DependencyInjection" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.DependencyInjection" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.FileProviders.Embedded" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.FileProviders.Embedded" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.HashCodeCombiner.Sources" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.HashCodeCombiner.Sources" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Hosting" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Hosting" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Http" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Http" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Localization.Abstractions" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Localization.Abstractions" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Localization" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Localization" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Logging.Console" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Logging.Console" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Logging.Debug" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Logging.Debug" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Logging.Testing" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Logging.Testing" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Logging" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Logging" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.ObjectPool" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.ObjectPool" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Options" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Options" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.ParameterDefaultValue.Sources" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.ParameterDefaultValue.Sources" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.Primitives" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.Primitives" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.TypeNameHelper.Sources" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.TypeNameHelper.Sources" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.ValueStopwatch.Sources" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.ValueStopwatch.Sources" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.WebEncoders" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Extensions.WebEncoders" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Internal.Extensions.Refs" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.Internal.Extensions.Refs" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.JSInterop" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.JSInterop" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Mono.WebAssembly.Interop" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Mono.WebAssembly.Interop" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Bcl.AsyncInterfaces" Version="1.0.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="Microsoft.Bcl.AsyncInterfaces" Version="1.0.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.CSharp" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="Microsoft.CSharp" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Win32.Registry" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="Microsoft.Win32.Registry" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Win32.SystemEvents" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="Microsoft.Win32.SystemEvents" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.ComponentModel.Annotations" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.ComponentModel.Annotations" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Data.SqlClient" Version="4.7.0-preview6.19264.9" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64" Pinned="true">
|
<Dependency Name="System.Data.SqlClient" Version="4.7.0-preview6.19264.9" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64" Pinned="true">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>a28176b5ec68b6da1472934fe9493790d1665cae</Sha>
|
<Sha>a28176b5ec68b6da1472934fe9493790d1665cae</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Diagnostics.EventLog" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Diagnostics.EventLog" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Drawing.Common" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Drawing.Common" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.IO.Pipelines" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.IO.Pipelines" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Net.Http.WinHttpHandler" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Net.Http.WinHttpHandler" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Reflection.Metadata" Version="1.7.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Reflection.Metadata" Version="1.7.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Security.Cryptography.Cng" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Security.Cryptography.Cng" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Security.Cryptography.Pkcs" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Security.Cryptography.Pkcs" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Security.Cryptography.Xml" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Security.Cryptography.Xml" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Security.Permissions" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Security.Permissions" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Security.Principal.Windows" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Security.Principal.Windows" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.ServiceProcess.ServiceController" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.ServiceProcess.ServiceController" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Text.Encodings.Web" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Text.Encodings.Web" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Text.Json" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Text.Json" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Threading.Channels" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Threading.Channels" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="System.Windows.Extensions" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="System.Windows.Extensions" Version="4.6.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Extensions.DependencyModel" Version="3.0.0-preview8-28379-05" CoherentParentDependency="Microsoft.Extensions.Logging">
|
<Dependency Name="Microsoft.Extensions.DependencyModel" Version="3.0.0-preview9-19410-12" CoherentParentDependency="Microsoft.Extensions.Logging">
|
||||||
<Uri>https://github.com/dotnet/core-setup</Uri>
|
<Uri>https://github.com/dotnet/core-setup</Uri>
|
||||||
<Sha>d15a0adeb874801e7bfaa4fbbb306a2efa268497</Sha>
|
<Sha>9408f55c19a0a9118a23b05f83200a3534dd9f7f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.NETCore.App.Ref" Version="3.0.0-preview8-28379-05" CoherentParentDependency="Microsoft.Extensions.Logging">
|
<Dependency Name="Microsoft.NETCore.App.Ref" Version="3.0.0-preview9-19410-12" CoherentParentDependency="Microsoft.Extensions.Logging">
|
||||||
<Uri>https://github.com/dotnet/core-setup</Uri>
|
<Uri>https://github.com/dotnet/core-setup</Uri>
|
||||||
<Sha>d15a0adeb874801e7bfaa4fbbb306a2efa268497</Sha>
|
<Sha>9408f55c19a0a9118a23b05f83200a3534dd9f7f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<!--
|
<!--
|
||||||
Win-x64 is used here because we have picked an arbitrary runtime identifier to flow the version of the latest NETCore.App runtime.
|
Win-x64 is used here because we have picked an arbitrary runtime identifier to flow the version of the latest NETCore.App runtime.
|
||||||
All Runtime.$rid packages should have the same version.
|
All Runtime.$rid packages should have the same version.
|
||||||
-->
|
-->
|
||||||
<Dependency Name="Microsoft.NETCore.App.Runtime.win-x64" Version="3.0.0-preview8-28379-05" CoherentParentDependency="Microsoft.Extensions.Logging">
|
<Dependency Name="Microsoft.NETCore.App.Runtime.win-x64" Version="3.0.0-preview9-19410-12" CoherentParentDependency="Microsoft.Extensions.Logging">
|
||||||
<Uri>https://github.com/dotnet/core-setup</Uri>
|
<Uri>https://github.com/dotnet/core-setup</Uri>
|
||||||
<Sha>d15a0adeb874801e7bfaa4fbbb306a2efa268497</Sha>
|
<Sha>9408f55c19a0a9118a23b05f83200a3534dd9f7f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="NETStandard.Library.Ref" Version="2.1.0-preview8-28379-05" CoherentParentDependency="Microsoft.Extensions.Logging">
|
<Dependency Name="NETStandard.Library.Ref" Version="2.1.0-preview9-19410-12" CoherentParentDependency="Microsoft.Extensions.Logging">
|
||||||
<Uri>https://github.com/dotnet/core-setup</Uri>
|
<Uri>https://github.com/dotnet/core-setup</Uri>
|
||||||
<Sha>d15a0adeb874801e7bfaa4fbbb306a2efa268497</Sha>
|
<Sha>9408f55c19a0a9118a23b05f83200a3534dd9f7f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
</ProductDependencies>
|
</ProductDependencies>
|
||||||
<ToolsetDependencies>
|
<ToolsetDependencies>
|
||||||
<!-- Listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
|
<!-- Listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
|
||||||
<Dependency Name="Microsoft.NETCore.Platforms" Version="3.0.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
<Dependency Name="Microsoft.NETCore.Platforms" Version="3.0.0-preview9.19409.17" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
|
||||||
<Uri>https://github.com/dotnet/corefx</Uri>
|
<Uri>https://github.com/dotnet/corefx</Uri>
|
||||||
<Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
|
<Sha>b82d2bc44424c8a99a1f0fc13202bdfd43e6f9f5</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Internal.AspNetCore.Analyzers" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Internal.AspNetCore.Analyzers" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.DotNet.GenAPI" Version="1.0.0-beta.19404.1">
|
<Dependency Name="Microsoft.DotNet.GenAPI" Version="1.0.0-beta.19411.1">
|
||||||
<Uri>https://github.com/dotnet/arcade</Uri>
|
<Uri>https://github.com/dotnet/arcade</Uri>
|
||||||
<Sha>b1c2f33f0cef32d1df6e7f388017fd6761d3fcad</Sha>
|
<Sha>a11024c8c22cc762011addafc30c653c938048f4</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="1.0.0-beta.19404.1">
|
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="1.0.0-beta.19411.1">
|
||||||
<Uri>https://github.com/dotnet/arcade</Uri>
|
<Uri>https://github.com/dotnet/arcade</Uri>
|
||||||
<Sha>b1c2f33f0cef32d1df6e7f388017fd6761d3fcad</Sha>
|
<Sha>a11024c8c22cc762011addafc30c653c938048f4</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="2.0.0-beta.19404.1">
|
<Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="2.0.0-beta.19411.1">
|
||||||
<Uri>https://github.com/dotnet/arcade</Uri>
|
<Uri>https://github.com/dotnet/arcade</Uri>
|
||||||
<Sha>b1c2f33f0cef32d1df6e7f388017fd6761d3fcad</Sha>
|
<Sha>a11024c8c22cc762011addafc30c653c938048f4</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.AspNetCore.Testing" Version="3.0.0-preview9.19405.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
<Dependency Name="Microsoft.AspNetCore.Testing" Version="3.0.0-preview9.19411.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||||
<Sha>86469ee35cf718e0122f16f52b486303dcfbb1fe</Sha>
|
<Sha>14c51735aa12343b7b0e53ae775990ab9c98c42f</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
<Dependency Name="Microsoft.Net.Compilers.Toolset" Version="3.3.0-beta3-19401-01" CoherentParentDependency="Microsoft.Extensions.Logging">
|
<Dependency Name="Microsoft.Net.Compilers.Toolset" Version="3.3.0-beta3-19409-05" CoherentParentDependency="Microsoft.Extensions.Logging">
|
||||||
<Uri>https://github.com/dotnet/roslyn</Uri>
|
<Uri>https://github.com/dotnet/roslyn</Uri>
|
||||||
<Sha>e9b4c66fb2f26bca02d4a718c48c1c39e9963c9f</Sha>
|
<Sha>ed92d532473db83c1db47b313ee1c1bd7520aa08</Sha>
|
||||||
</Dependency>
|
</Dependency>
|
||||||
</ToolsetDependencies>
|
</ToolsetDependencies>
|
||||||
</Dependencies>
|
</Dependencies>
|
||||||
|
|
|
||||||
|
|
@ -55,112 +55,112 @@
|
||||||
-->
|
-->
|
||||||
<PropertyGroup Label="Automated">
|
<PropertyGroup Label="Automated">
|
||||||
<!-- Packages from dotnet/arcade -->
|
<!-- Packages from dotnet/arcade -->
|
||||||
<MicrosoftDotNetGenAPIPackageVersion>1.0.0-beta.19404.1</MicrosoftDotNetGenAPIPackageVersion>
|
<MicrosoftDotNetGenAPIPackageVersion>1.0.0-beta.19411.1</MicrosoftDotNetGenAPIPackageVersion>
|
||||||
<!-- Packages from dotnet/roslyn -->
|
<!-- Packages from dotnet/roslyn -->
|
||||||
<MicrosoftNetCompilersToolsetPackageVersion>3.3.0-beta3-19401-01</MicrosoftNetCompilersToolsetPackageVersion>
|
<MicrosoftNetCompilersToolsetPackageVersion>3.3.0-beta3-19409-05</MicrosoftNetCompilersToolsetPackageVersion>
|
||||||
<!-- Packages from dotnet/core-setup -->
|
<!-- Packages from dotnet/core-setup -->
|
||||||
<MicrosoftExtensionsDependencyModelPackageVersion>3.0.0-preview8-28379-05</MicrosoftExtensionsDependencyModelPackageVersion>
|
<MicrosoftExtensionsDependencyModelPackageVersion>3.0.0-preview9-19410-12</MicrosoftExtensionsDependencyModelPackageVersion>
|
||||||
<MicrosoftNETCoreAppRefPackageVersion>3.0.0-preview8-28379-05</MicrosoftNETCoreAppRefPackageVersion>
|
<MicrosoftNETCoreAppRefPackageVersion>3.0.0-preview9-19410-12</MicrosoftNETCoreAppRefPackageVersion>
|
||||||
<MicrosoftNETCoreAppRuntimewinx64PackageVersion>3.0.0-preview8-28379-05</MicrosoftNETCoreAppRuntimewinx64PackageVersion>
|
<MicrosoftNETCoreAppRuntimewinx64PackageVersion>3.0.0-preview9-19410-12</MicrosoftNETCoreAppRuntimewinx64PackageVersion>
|
||||||
<NETStandardLibraryRefPackageVersion>2.1.0-preview8-28379-05</NETStandardLibraryRefPackageVersion>
|
<NETStandardLibraryRefPackageVersion>2.1.0-preview9-19410-12</NETStandardLibraryRefPackageVersion>
|
||||||
<!-- Packages from dotnet/corefx -->
|
<!-- Packages from dotnet/corefx -->
|
||||||
<MicrosoftBclAsyncInterfacesPackageVersion>1.0.0-preview8.19378.8</MicrosoftBclAsyncInterfacesPackageVersion>
|
<MicrosoftBclAsyncInterfacesPackageVersion>1.0.0-preview9.19409.17</MicrosoftBclAsyncInterfacesPackageVersion>
|
||||||
<MicrosoftCSharpPackageVersion>4.6.0-preview8.19378.8</MicrosoftCSharpPackageVersion>
|
<MicrosoftCSharpPackageVersion>4.6.0-preview9.19409.17</MicrosoftCSharpPackageVersion>
|
||||||
<MicrosoftWin32RegistryPackageVersion>4.6.0-preview8.19378.8</MicrosoftWin32RegistryPackageVersion>
|
<MicrosoftWin32RegistryPackageVersion>4.6.0-preview9.19409.17</MicrosoftWin32RegistryPackageVersion>
|
||||||
<MicrosoftWin32SystemEventsPackageVersion>4.6.0-preview8.19378.8</MicrosoftWin32SystemEventsPackageVersion>
|
<MicrosoftWin32SystemEventsPackageVersion>4.6.0-preview9.19409.17</MicrosoftWin32SystemEventsPackageVersion>
|
||||||
<SystemComponentModelAnnotationsPackageVersion>4.6.0-preview8.19378.8</SystemComponentModelAnnotationsPackageVersion>
|
<SystemComponentModelAnnotationsPackageVersion>4.6.0-preview9.19409.17</SystemComponentModelAnnotationsPackageVersion>
|
||||||
<SystemDataSqlClientPackageVersion>4.7.0-preview6.19264.9</SystemDataSqlClientPackageVersion>
|
<SystemDataSqlClientPackageVersion>4.7.0-preview6.19264.9</SystemDataSqlClientPackageVersion>
|
||||||
<SystemDiagnosticsEventLogPackageVersion>4.6.0-preview8.19378.8</SystemDiagnosticsEventLogPackageVersion>
|
<SystemDiagnosticsEventLogPackageVersion>4.6.0-preview9.19409.17</SystemDiagnosticsEventLogPackageVersion>
|
||||||
<SystemDrawingCommonPackageVersion>4.6.0-preview8.19378.8</SystemDrawingCommonPackageVersion>
|
<SystemDrawingCommonPackageVersion>4.6.0-preview9.19409.17</SystemDrawingCommonPackageVersion>
|
||||||
<SystemIOPipelinesPackageVersion>4.6.0-preview8.19378.8</SystemIOPipelinesPackageVersion>
|
<SystemIOPipelinesPackageVersion>4.6.0-preview9.19409.17</SystemIOPipelinesPackageVersion>
|
||||||
<SystemNetHttpWinHttpHandlerPackageVersion>4.6.0-preview8.19378.8</SystemNetHttpWinHttpHandlerPackageVersion>
|
<SystemNetHttpWinHttpHandlerPackageVersion>4.6.0-preview9.19409.17</SystemNetHttpWinHttpHandlerPackageVersion>
|
||||||
<SystemNetWebSocketsWebSocketProtocolPackageVersion>4.6.0-preview8.19378.8</SystemNetWebSocketsWebSocketProtocolPackageVersion>
|
<SystemNetWebSocketsWebSocketProtocolPackageVersion>4.6.0-preview9.19409.17</SystemNetWebSocketsWebSocketProtocolPackageVersion>
|
||||||
<SystemReflectionMetadataPackageVersion>1.7.0-preview8.19378.8</SystemReflectionMetadataPackageVersion>
|
<SystemReflectionMetadataPackageVersion>1.7.0-preview9.19409.17</SystemReflectionMetadataPackageVersion>
|
||||||
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.6.0-preview8.19378.8</SystemRuntimeCompilerServicesUnsafePackageVersion>
|
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.6.0-preview9.19409.17</SystemRuntimeCompilerServicesUnsafePackageVersion>
|
||||||
<SystemSecurityCryptographyCngPackageVersion>4.6.0-preview8.19378.8</SystemSecurityCryptographyCngPackageVersion>
|
<SystemSecurityCryptographyCngPackageVersion>4.6.0-preview9.19409.17</SystemSecurityCryptographyCngPackageVersion>
|
||||||
<SystemSecurityCryptographyPkcsPackageVersion>4.6.0-preview8.19378.8</SystemSecurityCryptographyPkcsPackageVersion>
|
<SystemSecurityCryptographyPkcsPackageVersion>4.6.0-preview9.19409.17</SystemSecurityCryptographyPkcsPackageVersion>
|
||||||
<SystemSecurityCryptographyXmlPackageVersion>4.6.0-preview8.19378.8</SystemSecurityCryptographyXmlPackageVersion>
|
<SystemSecurityCryptographyXmlPackageVersion>4.6.0-preview9.19409.17</SystemSecurityCryptographyXmlPackageVersion>
|
||||||
<SystemSecurityPermissionsPackageVersion>4.6.0-preview8.19378.8</SystemSecurityPermissionsPackageVersion>
|
<SystemSecurityPermissionsPackageVersion>4.6.0-preview9.19409.17</SystemSecurityPermissionsPackageVersion>
|
||||||
<SystemSecurityPrincipalWindowsPackageVersion>4.6.0-preview8.19378.8</SystemSecurityPrincipalWindowsPackageVersion>
|
<SystemSecurityPrincipalWindowsPackageVersion>4.6.0-preview9.19409.17</SystemSecurityPrincipalWindowsPackageVersion>
|
||||||
<SystemServiceProcessServiceControllerPackageVersion>4.6.0-preview8.19378.8</SystemServiceProcessServiceControllerPackageVersion>
|
<SystemServiceProcessServiceControllerPackageVersion>4.6.0-preview9.19409.17</SystemServiceProcessServiceControllerPackageVersion>
|
||||||
<SystemTextEncodingsWebPackageVersion>4.6.0-preview8.19378.8</SystemTextEncodingsWebPackageVersion>
|
<SystemTextEncodingsWebPackageVersion>4.6.0-preview9.19409.17</SystemTextEncodingsWebPackageVersion>
|
||||||
<SystemTextJsonPackageVersion>4.6.0-preview8.19378.8</SystemTextJsonPackageVersion>
|
<SystemTextJsonPackageVersion>4.6.0-preview9.19409.17</SystemTextJsonPackageVersion>
|
||||||
<SystemThreadingChannelsPackageVersion>4.6.0-preview8.19378.8</SystemThreadingChannelsPackageVersion>
|
<SystemThreadingChannelsPackageVersion>4.6.0-preview9.19409.17</SystemThreadingChannelsPackageVersion>
|
||||||
<SystemWindowsExtensionsPackageVersion>4.6.0-preview8.19378.8</SystemWindowsExtensionsPackageVersion>
|
<SystemWindowsExtensionsPackageVersion>4.6.0-preview9.19409.17</SystemWindowsExtensionsPackageVersion>
|
||||||
<!-- Only listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
|
<!-- Only listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
|
||||||
<MicrosoftNETCorePlatformsPackageVersion>3.0.0-preview8.19378.8</MicrosoftNETCorePlatformsPackageVersion>
|
<MicrosoftNETCorePlatformsPackageVersion>3.0.0-preview9.19409.17</MicrosoftNETCorePlatformsPackageVersion>
|
||||||
<!-- Packages from aspnet/Blazor -->
|
<!-- Packages from aspnet/Blazor -->
|
||||||
<MicrosoftAspNetCoreBlazorMonoPackageVersion>5.0.0-alpha1.19405.2</MicrosoftAspNetCoreBlazorMonoPackageVersion>
|
<MicrosoftAspNetCoreBlazorMonoPackageVersion>5.0.0-alpha1.19405.2</MicrosoftAspNetCoreBlazorMonoPackageVersion>
|
||||||
<!-- Packages from aspnet/Extensions -->
|
<!-- Packages from aspnet/Extensions -->
|
||||||
<InternalAspNetCoreAnalyzersPackageVersion>3.0.0-preview9.19405.2</InternalAspNetCoreAnalyzersPackageVersion>
|
<InternalAspNetCoreAnalyzersPackageVersion>3.0.0-preview9.19411.2</InternalAspNetCoreAnalyzersPackageVersion>
|
||||||
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.0.0-preview9.19405.2</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
|
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.0.0-preview9.19411.2</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
|
||||||
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>3.0.0-preview9.19405.2</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
|
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>3.0.0-preview9.19411.2</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
|
||||||
<MicrosoftAspNetCoreTestingPackageVersion>3.0.0-preview9.19405.2</MicrosoftAspNetCoreTestingPackageVersion>
|
<MicrosoftAspNetCoreTestingPackageVersion>3.0.0-preview9.19411.2</MicrosoftAspNetCoreTestingPackageVersion>
|
||||||
<MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>
|
<MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsCachingAbstractionsPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsCachingAbstractionsPackageVersion>
|
<MicrosoftExtensionsCachingAbstractionsPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsCachingAbstractionsPackageVersion>
|
||||||
<MicrosoftExtensionsCachingMemoryPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsCachingMemoryPackageVersion>
|
<MicrosoftExtensionsCachingMemoryPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsCachingMemoryPackageVersion>
|
||||||
<MicrosoftExtensionsCachingSqlServerPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsCachingSqlServerPackageVersion>
|
<MicrosoftExtensionsCachingSqlServerPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsCachingSqlServerPackageVersion>
|
||||||
<MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>
|
<MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>
|
||||||
<MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>
|
<MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationAbstractionsPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
|
<MicrosoftExtensionsConfigurationAbstractionsPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>
|
<MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationBinderPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsConfigurationBinderPackageVersion>
|
<MicrosoftExtensionsConfigurationBinderPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsConfigurationBinderPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
|
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
|
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>
|
<MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationIniPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsConfigurationIniPackageVersion>
|
<MicrosoftExtensionsConfigurationIniPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsConfigurationIniPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationJsonPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsConfigurationJsonPackageVersion>
|
<MicrosoftExtensionsConfigurationJsonPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsConfigurationJsonPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>
|
<MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsConfigurationPackageVersion>
|
<MicrosoftExtensionsConfigurationPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsConfigurationPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationUserSecretsPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsConfigurationUserSecretsPackageVersion>
|
<MicrosoftExtensionsConfigurationUserSecretsPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsConfigurationUserSecretsPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationXmlPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsConfigurationXmlPackageVersion>
|
<MicrosoftExtensionsConfigurationXmlPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsConfigurationXmlPackageVersion>
|
||||||
<MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>
|
<MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>
|
||||||
<MicrosoftExtensionsDependencyInjectionPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsDependencyInjectionPackageVersion>
|
<MicrosoftExtensionsDependencyInjectionPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsDependencyInjectionPackageVersion>
|
||||||
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
|
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
|
||||||
<MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>
|
<MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>
|
||||||
<MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>
|
<MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>
|
||||||
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
|
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
|
||||||
<MicrosoftExtensionsFileProvidersCompositePackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsFileProvidersCompositePackageVersion>
|
<MicrosoftExtensionsFileProvidersCompositePackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsFileProvidersCompositePackageVersion>
|
||||||
<MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>
|
<MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>
|
||||||
<MicrosoftExtensionsFileProvidersPhysicalPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsFileProvidersPhysicalPackageVersion>
|
<MicrosoftExtensionsFileProvidersPhysicalPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsFileProvidersPhysicalPackageVersion>
|
||||||
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
|
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
|
||||||
<MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>
|
<MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsHostingAbstractionsPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsHostingAbstractionsPackageVersion>
|
<MicrosoftExtensionsHostingAbstractionsPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsHostingAbstractionsPackageVersion>
|
||||||
<MicrosoftExtensionsHostingPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsHostingPackageVersion>
|
<MicrosoftExtensionsHostingPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsHostingPackageVersion>
|
||||||
<MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>
|
<MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsHttpPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsHttpPackageVersion>
|
<MicrosoftExtensionsHttpPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsHttpPackageVersion>
|
||||||
<MicrosoftExtensionsLocalizationAbstractionsPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsLocalizationAbstractionsPackageVersion>
|
<MicrosoftExtensionsLocalizationAbstractionsPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsLocalizationAbstractionsPackageVersion>
|
||||||
<MicrosoftExtensionsLocalizationPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsLocalizationPackageVersion>
|
<MicrosoftExtensionsLocalizationPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsLocalizationPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
|
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>
|
<MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingConfigurationPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsLoggingConfigurationPackageVersion>
|
<MicrosoftExtensionsLoggingConfigurationPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsLoggingConfigurationPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingConsolePackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsLoggingConsolePackageVersion>
|
<MicrosoftExtensionsLoggingConsolePackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsLoggingConsolePackageVersion>
|
||||||
<MicrosoftExtensionsLoggingDebugPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsLoggingDebugPackageVersion>
|
<MicrosoftExtensionsLoggingDebugPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsLoggingDebugPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingEventSourcePackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsLoggingEventSourcePackageVersion>
|
<MicrosoftExtensionsLoggingEventSourcePackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsLoggingEventSourcePackageVersion>
|
||||||
<MicrosoftExtensionsLoggingEventLogPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsLoggingEventLogPackageVersion>
|
<MicrosoftExtensionsLoggingEventLogPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsLoggingEventLogPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsLoggingPackageVersion>
|
<MicrosoftExtensionsLoggingPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsLoggingPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingTestingPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsLoggingTestingPackageVersion>
|
<MicrosoftExtensionsLoggingTestingPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsLoggingTestingPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingTraceSourcePackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsLoggingTraceSourcePackageVersion>
|
<MicrosoftExtensionsLoggingTraceSourcePackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsLoggingTraceSourcePackageVersion>
|
||||||
<MicrosoftExtensionsObjectPoolPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsObjectPoolPackageVersion>
|
<MicrosoftExtensionsObjectPoolPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsObjectPoolPackageVersion>
|
||||||
<MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>
|
<MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>
|
||||||
<MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>
|
<MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>
|
||||||
<MicrosoftExtensionsOptionsPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsOptionsPackageVersion>
|
<MicrosoftExtensionsOptionsPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsOptionsPackageVersion>
|
||||||
<MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>
|
<MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsPrimitivesPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsPrimitivesPackageVersion>
|
<MicrosoftExtensionsPrimitivesPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsPrimitivesPackageVersion>
|
||||||
<MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>
|
<MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsValueStopwatchSourcesPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsValueStopwatchSourcesPackageVersion>
|
<MicrosoftExtensionsValueStopwatchSourcesPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsValueStopwatchSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsWebEncodersPackageVersion>3.0.0-preview9.19405.2</MicrosoftExtensionsWebEncodersPackageVersion>
|
<MicrosoftExtensionsWebEncodersPackageVersion>3.0.0-preview9.19411.2</MicrosoftExtensionsWebEncodersPackageVersion>
|
||||||
<MicrosoftInternalExtensionsRefsPackageVersion>3.0.0-preview9.19405.2</MicrosoftInternalExtensionsRefsPackageVersion>
|
<MicrosoftInternalExtensionsRefsPackageVersion>3.0.0-preview9.19411.2</MicrosoftInternalExtensionsRefsPackageVersion>
|
||||||
<MicrosoftJSInteropPackageVersion>3.0.0-preview9.19405.2</MicrosoftJSInteropPackageVersion>
|
<MicrosoftJSInteropPackageVersion>3.0.0-preview9.19411.2</MicrosoftJSInteropPackageVersion>
|
||||||
<MonoWebAssemblyInteropPackageVersion>3.0.0-preview9.19405.2</MonoWebAssemblyInteropPackageVersion>
|
<MonoWebAssemblyInteropPackageVersion>3.0.0-preview9.19411.2</MonoWebAssemblyInteropPackageVersion>
|
||||||
<!-- Packages from aspnet/EntityFrameworkCore -->
|
<!-- Packages from aspnet/EntityFrameworkCore -->
|
||||||
<dotnetefPackageVersion>3.0.0-preview9.19405.13</dotnetefPackageVersion>
|
<dotnetefPackageVersion>3.0.0-preview9.19412.3</dotnetefPackageVersion>
|
||||||
<MicrosoftEntityFrameworkCoreInMemoryPackageVersion>3.0.0-preview9.19405.13</MicrosoftEntityFrameworkCoreInMemoryPackageVersion>
|
<MicrosoftEntityFrameworkCoreInMemoryPackageVersion>3.0.0-preview9.19412.3</MicrosoftEntityFrameworkCoreInMemoryPackageVersion>
|
||||||
<MicrosoftEntityFrameworkCoreRelationalPackageVersion>3.0.0-preview9.19405.13</MicrosoftEntityFrameworkCoreRelationalPackageVersion>
|
<MicrosoftEntityFrameworkCoreRelationalPackageVersion>3.0.0-preview9.19412.3</MicrosoftEntityFrameworkCoreRelationalPackageVersion>
|
||||||
<MicrosoftEntityFrameworkCoreSqlitePackageVersion>3.0.0-preview9.19405.13</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
|
<MicrosoftEntityFrameworkCoreSqlitePackageVersion>3.0.0-preview9.19412.3</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
|
||||||
<MicrosoftEntityFrameworkCoreSqlServerPackageVersion>3.0.0-preview9.19405.13</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
|
<MicrosoftEntityFrameworkCoreSqlServerPackageVersion>3.0.0-preview9.19412.3</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
|
||||||
<MicrosoftEntityFrameworkCoreToolsPackageVersion>3.0.0-preview9.19405.13</MicrosoftEntityFrameworkCoreToolsPackageVersion>
|
<MicrosoftEntityFrameworkCoreToolsPackageVersion>3.0.0-preview9.19412.3</MicrosoftEntityFrameworkCoreToolsPackageVersion>
|
||||||
<MicrosoftEntityFrameworkCorePackageVersion>3.0.0-preview9.19405.13</MicrosoftEntityFrameworkCorePackageVersion>
|
<MicrosoftEntityFrameworkCorePackageVersion>3.0.0-preview9.19412.3</MicrosoftEntityFrameworkCorePackageVersion>
|
||||||
<!-- Packages from aspnet/AspNetCore-Tooling -->
|
<!-- Packages from aspnet/AspNetCore-Tooling -->
|
||||||
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>5.0.0-alpha1.19407.1</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
|
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>5.0.0-alpha1.19407.1</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
|
||||||
<MicrosoftAspNetCoreRazorLanguagePackageVersion>5.0.0-alpha1.19407.1</MicrosoftAspNetCoreRazorLanguagePackageVersion>
|
<MicrosoftAspNetCoreRazorLanguagePackageVersion>5.0.0-alpha1.19407.1</MicrosoftAspNetCoreRazorLanguagePackageVersion>
|
||||||
|
|
@ -227,11 +227,11 @@
|
||||||
<FSharpCorePackageVersion>4.2.1</FSharpCorePackageVersion>
|
<FSharpCorePackageVersion>4.2.1</FSharpCorePackageVersion>
|
||||||
<GoogleProtobufPackageVersion>3.8.0</GoogleProtobufPackageVersion>
|
<GoogleProtobufPackageVersion>3.8.0</GoogleProtobufPackageVersion>
|
||||||
<GrpcAspNetCorePackageVersion>0.1.22-pre3</GrpcAspNetCorePackageVersion>
|
<GrpcAspNetCorePackageVersion>0.1.22-pre3</GrpcAspNetCorePackageVersion>
|
||||||
<IdentityServer4AspNetIdentityPackageVersion>3.0.0-preview3.4</IdentityServer4AspNetIdentityPackageVersion>
|
<IdentityServer4AspNetIdentityPackageVersion>3.0.0-preview7.33</IdentityServer4AspNetIdentityPackageVersion>
|
||||||
<IdentityServer4EntityFrameworkPackageVersion>3.0.0-preview3.4</IdentityServer4EntityFrameworkPackageVersion>
|
<IdentityServer4EntityFrameworkPackageVersion>3.0.0-preview7.33</IdentityServer4EntityFrameworkPackageVersion>
|
||||||
<IdentityServer4PackageVersion>3.0.0-preview3.4</IdentityServer4PackageVersion>
|
<IdentityServer4PackageVersion>3.0.0-preview7.33</IdentityServer4PackageVersion>
|
||||||
<IdentityServer4StoragePackageVersion>3.0.0-preview3.4</IdentityServer4StoragePackageVersion>
|
<IdentityServer4StoragePackageVersion>3.0.0-preview7.33</IdentityServer4StoragePackageVersion>
|
||||||
<IdentityServer4EntityFrameworkStoragePackageVersion>3.0.0-preview3.4</IdentityServer4EntityFrameworkStoragePackageVersion>
|
<IdentityServer4EntityFrameworkStoragePackageVersion>3.0.0-preview7.33</IdentityServer4EntityFrameworkStoragePackageVersion>
|
||||||
<MessagePackPackageVersion>1.7.3.7</MessagePackPackageVersion>
|
<MessagePackPackageVersion>1.7.3.7</MessagePackPackageVersion>
|
||||||
<MoqPackageVersion>4.10.0</MoqPackageVersion>
|
<MoqPackageVersion>4.10.0</MoqPackageVersion>
|
||||||
<MonoCecilPackageVersion>0.10.1</MonoCecilPackageVersion>
|
<MonoCecilPackageVersion>0.10.1</MonoCecilPackageVersion>
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,8 @@ jobs:
|
||||||
displayName: Run SDL tool
|
displayName: Run SDL tool
|
||||||
variables:
|
variables:
|
||||||
- group: DotNet-VSTS-Bot
|
- group: DotNet-VSTS-Bot
|
||||||
|
pool:
|
||||||
|
name: Hosted VS2017
|
||||||
steps:
|
steps:
|
||||||
- checkout: self
|
- checkout: self
|
||||||
clean: true
|
clean: true
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ stages:
|
||||||
filePath: eng\common\sdk-task.ps1
|
filePath: eng\common\sdk-task.ps1
|
||||||
arguments: -task SigningValidation -restore -msbuildEngine dotnet
|
arguments: -task SigningValidation -restore -msbuildEngine dotnet
|
||||||
/p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts'
|
/p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts'
|
||||||
|
/p:SignCheckExclusionsFile='$(Build.SourcesDirectory)/eng/SignCheckExclusionsFile.txt'
|
||||||
/p:Configuration=Release
|
/p:Configuration=Release
|
||||||
|
|
||||||
- ${{ if eq(parameters.enableSourceLinkValidation, 'true') }}:
|
- ${{ if eq(parameters.enableSourceLinkValidation, 'true') }}:
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
<HelixTimeout>00:30:00</HelixTimeout>
|
<HelixTimeout>00:30:00</HelixTimeout>
|
||||||
<IsWindowsHelixQueue>false</IsWindowsHelixQueue>
|
<IsWindowsHelixQueue>false</IsWindowsHelixQueue>
|
||||||
<IsWindowsHelixQueue Condition="$(HelixTargetQueue.Contains('Windows')) or $(HelixTargetQueue.Contains('windows'))">true</IsWindowsHelixQueue>
|
<IsWindowsHelixQueue Condition="$(HelixTargetQueue.Contains('Windows')) or $(HelixTargetQueue.Contains('windows'))">true</IsWindowsHelixQueue>
|
||||||
<HelixTestName>$(MSBuildProjectName)/$(TargetFramework)</HelixTestName>
|
<HelixTestName>$(MSBuildProjectName)-$(TargetFramework)</HelixTestName>
|
||||||
<HelixUseArchive>false</HelixUseArchive>
|
<HelixUseArchive>false</HelixUseArchive>
|
||||||
<LoggingTestingDisableFileLogging Condition="'$(IsHelixJob)' == 'true'">true</LoggingTestingDisableFileLogging>
|
<LoggingTestingDisableFileLogging Condition="'$(IsHelixJob)' == 'true'">true</LoggingTestingDisableFileLogging>
|
||||||
<NodeVersion>10.15.3</NodeVersion>
|
<NodeVersion>10.15.3</NodeVersion>
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
<ItemGroup Condition="'$(TestDependsOnNode)' == 'true' AND '$(IsWindowsHelixQueue)' == 'false'">
|
<ItemGroup Condition="'$(TestDependsOnNode)' == 'true' AND '$(IsWindowsHelixQueue)' == 'false'">
|
||||||
<HelixPreCommand Include="./installnode.sh $(NodeVersion) $(TargetArchitecture)" />
|
<HelixPreCommand Include="./installnode.sh $(NodeVersion) $(TargetArchitecture)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup Condition="'$(TestDependsOnNode)' == 'true' AND '$(IsWindowsHelixQueue)' == 'true'">
|
<ItemGroup Condition="'$(TestDependsOnNode)' == 'true' AND '$(IsWindowsHelixQueue)' == 'true'">
|
||||||
<HelixPreCommand Include="call RunPowershell.cmd InstallNode.ps1 $(NodeVersion) %25HELIX_CORRELATION_PAYLOAD%25\node\bin || exit /b 1" />
|
<HelixPreCommand Include="call RunPowershell.cmd InstallNode.ps1 $(NodeVersion) %25HELIX_CORRELATION_PAYLOAD%25\node\bin || exit /b 1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
},
|
},
|
||||||
"msbuild-sdks": {
|
"msbuild-sdks": {
|
||||||
"Yarn.MSBuild": "1.15.2",
|
"Yarn.MSBuild": "1.15.2",
|
||||||
"Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19404.1",
|
"Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19411.1",
|
||||||
"Microsoft.DotNet.Helix.Sdk": "2.0.0-beta.19404.1"
|
"Microsoft.DotNet.Helix.Sdk": "2.0.0-beta.19411.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
<!-- This file is automatically generated. -->
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>netstandard2.0;netcoreapp3.0</TargetFrameworks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
|
||||||
|
<Compile Include="Microsoft.AspNetCore.Components.Authorization.netstandard2.0.cs" />
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Authorization" />
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Components" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
|
||||||
|
<Compile Include="Microsoft.AspNetCore.Components.Authorization.netcoreapp3.0.cs" />
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Authorization" />
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Components" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
|
{
|
||||||
|
public partial class AuthenticationState
|
||||||
|
{
|
||||||
|
public AuthenticationState(System.Security.Claims.ClaimsPrincipal user) { }
|
||||||
|
public System.Security.Claims.ClaimsPrincipal User { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
}
|
||||||
|
public delegate void AuthenticationStateChangedHandler(System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> task);
|
||||||
|
public abstract partial class AuthenticationStateProvider
|
||||||
|
{
|
||||||
|
protected AuthenticationStateProvider() { }
|
||||||
|
public event Microsoft.AspNetCore.Components.Authorization.AuthenticationStateChangedHandler AuthenticationStateChanged { add { } remove { } }
|
||||||
|
public abstract System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> GetAuthenticationStateAsync();
|
||||||
|
protected void NotifyAuthenticationStateChanged(System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> task) { }
|
||||||
|
}
|
||||||
|
public sealed partial class AuthorizeRouteView : Microsoft.AspNetCore.Components.RouteView
|
||||||
|
{
|
||||||
|
public AuthorizeRouteView() { }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment Authorizing { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> NotAuthorized { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
protected override void Render(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { }
|
||||||
|
}
|
||||||
|
public partial class AuthorizeView : Microsoft.AspNetCore.Components.Authorization.AuthorizeViewCore
|
||||||
|
{
|
||||||
|
public AuthorizeView() { }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public string Policy { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public string Roles { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
protected override Microsoft.AspNetCore.Authorization.IAuthorizeData[] GetAuthorizeData() { throw null; }
|
||||||
|
}
|
||||||
|
public abstract partial class AuthorizeViewCore : Microsoft.AspNetCore.Components.ComponentBase
|
||||||
|
{
|
||||||
|
protected AuthorizeViewCore() { }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> Authorized { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment Authorizing { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> ChildContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> NotAuthorized { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public object Resource { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { }
|
||||||
|
protected abstract Microsoft.AspNetCore.Authorization.IAuthorizeData[] GetAuthorizeData();
|
||||||
|
[System.Diagnostics.DebuggerStepThroughAttribute]
|
||||||
|
protected override System.Threading.Tasks.Task OnParametersSetAsync() { throw null; }
|
||||||
|
}
|
||||||
|
public partial class CascadingAuthenticationState : Microsoft.AspNetCore.Components.ComponentBase, System.IDisposable
|
||||||
|
{
|
||||||
|
public CascadingAuthenticationState() { }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment ChildContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { }
|
||||||
|
protected override void OnInitialized() { }
|
||||||
|
void System.IDisposable.Dispose() { }
|
||||||
|
}
|
||||||
|
public partial interface IHostEnvironmentAuthenticationStateProvider
|
||||||
|
{
|
||||||
|
void SetAuthenticationState(System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> authenticationStateTask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
|
{
|
||||||
|
public partial class AuthenticationState
|
||||||
|
{
|
||||||
|
public AuthenticationState(System.Security.Claims.ClaimsPrincipal user) { }
|
||||||
|
public System.Security.Claims.ClaimsPrincipal User { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
}
|
||||||
|
public delegate void AuthenticationStateChangedHandler(System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> task);
|
||||||
|
public abstract partial class AuthenticationStateProvider
|
||||||
|
{
|
||||||
|
protected AuthenticationStateProvider() { }
|
||||||
|
public event Microsoft.AspNetCore.Components.Authorization.AuthenticationStateChangedHandler AuthenticationStateChanged { add { } remove { } }
|
||||||
|
public abstract System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> GetAuthenticationStateAsync();
|
||||||
|
protected void NotifyAuthenticationStateChanged(System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> task) { }
|
||||||
|
}
|
||||||
|
public sealed partial class AuthorizeRouteView : Microsoft.AspNetCore.Components.RouteView
|
||||||
|
{
|
||||||
|
public AuthorizeRouteView() { }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment Authorizing { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> NotAuthorized { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
protected override void Render(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { }
|
||||||
|
}
|
||||||
|
public partial class AuthorizeView : Microsoft.AspNetCore.Components.Authorization.AuthorizeViewCore
|
||||||
|
{
|
||||||
|
public AuthorizeView() { }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public string Policy { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public string Roles { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
protected override Microsoft.AspNetCore.Authorization.IAuthorizeData[] GetAuthorizeData() { throw null; }
|
||||||
|
}
|
||||||
|
public abstract partial class AuthorizeViewCore : Microsoft.AspNetCore.Components.ComponentBase
|
||||||
|
{
|
||||||
|
protected AuthorizeViewCore() { }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> Authorized { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment Authorizing { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> ChildContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> NotAuthorized { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public object Resource { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { }
|
||||||
|
protected abstract Microsoft.AspNetCore.Authorization.IAuthorizeData[] GetAuthorizeData();
|
||||||
|
[System.Diagnostics.DebuggerStepThroughAttribute]
|
||||||
|
protected override System.Threading.Tasks.Task OnParametersSetAsync() { throw null; }
|
||||||
|
}
|
||||||
|
public partial class CascadingAuthenticationState : Microsoft.AspNetCore.Components.ComponentBase, System.IDisposable
|
||||||
|
{
|
||||||
|
public CascadingAuthenticationState() { }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment ChildContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { }
|
||||||
|
protected override void OnInitialized() { }
|
||||||
|
void System.IDisposable.Dispose() { }
|
||||||
|
}
|
||||||
|
public partial interface IHostEnvironmentAuthenticationStateProvider
|
||||||
|
{
|
||||||
|
void SetAuthenticationState(System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> authenticationStateTask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,10 +4,9 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components.Auth
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
internal static class AttributeAuthorizeDataCache
|
internal static class AttributeAuthorizeDataCache
|
||||||
{
|
{
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Provides information about the currently authenticated user, if any.
|
/// Provides information about the currently authenticated user, if any.
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Provides information about the authentication state of the current user.
|
/// Provides information about the authentication state of the current user.
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
using System;
|
using System;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
// This is so the AuthorizeView can avoid implementing IAuthorizeData (even privately)
|
// This is so the AuthorizeView can avoid implementing IAuthorizeData (even privately)
|
||||||
internal class AuthorizeDataAdapter : IAuthorizeData
|
internal class AuthorizeDataAdapter : IAuthorizeData
|
||||||
|
|
@ -3,10 +3,9 @@
|
||||||
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Components.Auth;
|
|
||||||
using Microsoft.AspNetCore.Components.Rendering;
|
using Microsoft.AspNetCore.Components.Rendering;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Combines the behaviors of <see cref="AuthorizeView"/> and <see cref="RouteView"/>,
|
/// Combines the behaviors of <see cref="AuthorizeView"/> and <see cref="RouteView"/>,
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Displays differing content depending on the user's authorization status.
|
/// Displays differing content depending on the user's authorization status.
|
||||||
|
|
@ -7,7 +7,7 @@ using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Components.Rendering;
|
using Microsoft.AspNetCore.Components.Rendering;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A base class for components that display differing content depending on the user's authorization status.
|
/// A base class for components that display differing content depending on the user's authorization status.
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
@namespace Microsoft.AspNetCore.Components
|
|
||||||
@implements IDisposable
|
@implements IDisposable
|
||||||
@inject AuthenticationStateProvider AuthenticationStateProvider
|
@inject AuthenticationStateProvider AuthenticationStateProvider
|
||||||
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// An interface implemented by <see cref="AuthenticationStateProvider"/> classes that can receive authentication
|
/// An interface implemented by <see cref="AuthenticationStateProvider"/> classes that can receive authentication
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk.Razor">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>netstandard2.0;netcoreapp3.0</TargetFrameworks>
|
||||||
|
<TargetFrameworks Condition="'$(DotNetBuildFromSource)' == 'true'">netcoreapp3.0</TargetFrameworks>
|
||||||
|
<IsAspNetCoreApp>true</IsAspNetCoreApp>
|
||||||
|
<Description>Authentication and authorization support for Blazor applications.</Description>
|
||||||
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
|
<IsShippingPackage>true</IsShippingPackage>
|
||||||
|
<RazorLangVersion>3.0</RazorLangVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Authorization" />
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Components" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -12,7 +12,7 @@ using Microsoft.AspNetCore.Components.Test.Helpers;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
public class AuthorizeRouteViewTest
|
public class AuthorizeRouteViewTest
|
||||||
{
|
{
|
||||||
|
|
@ -16,7 +16,7 @@ using Microsoft.AspNetCore.Components.Test.Helpers;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
public class AuthorizeViewTest
|
public class AuthorizeViewTest
|
||||||
{
|
{
|
||||||
|
|
@ -12,7 +12,7 @@ using Microsoft.AspNetCore.Components.Test.Helpers;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
public class CascadingAuthenticationStateTest
|
public class CascadingAuthenticationStateTest
|
||||||
{
|
{
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||||
|
<RootNamespace>Microsoft.AspNetCore.Components.Authorization</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Components.Authorization" />
|
||||||
|
<Reference Include="Microsoft.Extensions.DependencyInjection" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="$(ComponentsSharedSourceRoot)test\**\*.cs" LinkBase="Helpers" />
|
||||||
|
<Compile Include="$(SharedSourceRoot)test\SkipOnHelixAttribute.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
public class TestAuthenticationStateProvider : AuthenticationStateProvider
|
public class TestAuthenticationStateProvider : AuthenticationStateProvider
|
||||||
{
|
{
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
public class TestAuthorizationPolicyProvider : IAuthorizationPolicyProvider
|
public class TestAuthorizationPolicyProvider : IAuthorizationPolicyProvider
|
||||||
{
|
{
|
||||||
|
|
@ -7,7 +7,7 @@ using System.Security.Claims;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
public class TestAuthorizationService : IAuthorizationService
|
public class TestAuthorizationService : IAuthorizationService
|
||||||
{
|
{
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
using System.Security.Principal;
|
using System.Security.Principal;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components.Authorization
|
||||||
{
|
{
|
||||||
public class TestIdentity : IIdentity
|
public class TestIdentity : IIdentity
|
||||||
{
|
{
|
||||||
|
|
@ -7,5 +7,6 @@
|
||||||
<Compile Include="Microsoft.AspNetCore.Blazor.netstandard2.0.cs" />
|
<Compile Include="Microsoft.AspNetCore.Blazor.netstandard2.0.cs" />
|
||||||
<Reference Include="Mono.WebAssembly.Interop" />
|
<Reference Include="Mono.WebAssembly.Interop" />
|
||||||
<Reference Include="Microsoft.AspNetCore.Components.Web" />
|
<Reference Include="Microsoft.AspNetCore.Components.Web" />
|
||||||
|
<Reference Include="Microsoft.Extensions.Options" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -106,6 +106,8 @@ namespace Microsoft.AspNetCore.Blazor.Hosting
|
||||||
});
|
});
|
||||||
|
|
||||||
// Needed for authorization
|
// Needed for authorization
|
||||||
|
// However, since authorization isn't on by default, we could consider removing these and
|
||||||
|
// having a separate services.AddBlazorAuthorization() call that brings in the required services.
|
||||||
services.AddOptions();
|
services.AddOptions();
|
||||||
services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(WebAssemblyConsoleLogger<>)));
|
services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(WebAssemblyConsoleLogger<>)));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="Mono.WebAssembly.Interop" />
|
<Reference Include="Mono.WebAssembly.Interop" />
|
||||||
<Reference Include="Microsoft.AspNetCore.Components.Web" />
|
<Reference Include="Microsoft.AspNetCore.Components.Web" />
|
||||||
|
<Reference Include="Microsoft.Extensions.Options" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Reflection;
|
|
||||||
using Microsoft.VisualStudio.Shell;
|
|
||||||
|
|
||||||
namespace Microsoft.VisualStudio.BlazorExtension
|
|
||||||
{
|
|
||||||
public class AboutDialogInfoAttribute : RegistrationAttribute
|
|
||||||
{
|
|
||||||
private readonly string _detailsId;
|
|
||||||
private readonly string _name;
|
|
||||||
private readonly string _nameId;
|
|
||||||
private readonly string _packageGuid;
|
|
||||||
|
|
||||||
// nameId and detailsId are resource IDs, they should start with #
|
|
||||||
public AboutDialogInfoAttribute(string packageGuid, string name, string nameId, string detailsId)
|
|
||||||
{
|
|
||||||
_packageGuid = packageGuid;
|
|
||||||
_name = name;
|
|
||||||
_nameId = nameId;
|
|
||||||
_detailsId = detailsId;
|
|
||||||
}
|
|
||||||
|
|
||||||
private string GetKeyName()
|
|
||||||
{
|
|
||||||
return "InstalledProducts\\" + _name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Register(RegistrationContext context)
|
|
||||||
{
|
|
||||||
var version = typeof(AboutDialogInfoAttribute).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;
|
|
||||||
|
|
||||||
using (var key = context.CreateKey(GetKeyName()))
|
|
||||||
{
|
|
||||||
key.SetValue(null, _nameId);
|
|
||||||
key.SetValue("Package", Guid.Parse(_packageGuid).ToString("B"));
|
|
||||||
key.SetValue("ProductDetails", _detailsId);
|
|
||||||
key.SetValue("UseInterface", false);
|
|
||||||
key.SetValue("UseVSProductID", false);
|
|
||||||
|
|
||||||
if (version != null)
|
|
||||||
{
|
|
||||||
key.SetValue("PID", version);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Unregister(RegistrationContext context)
|
|
||||||
{
|
|
||||||
context.RemoveKey(GetKeyName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,147 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using Microsoft.VisualStudio.Shell.Interop;
|
|
||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
|
||||||
using System.IO.Pipes;
|
|
||||||
using System.Security.AccessControl;
|
|
||||||
using System.Security.Principal;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Package = Microsoft.VisualStudio.Shell.Package;
|
|
||||||
using ThreadHelper = Microsoft.VisualStudio.Shell.ThreadHelper;
|
|
||||||
|
|
||||||
namespace Microsoft.VisualStudio.BlazorExtension
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The counterpart to VSForWindowsRebuildService.cs in the Blazor.Server project.
|
|
||||||
/// Listens for named pipe connections and rebuilds projects on request.
|
|
||||||
/// </summary>
|
|
||||||
internal class AutoRebuildService
|
|
||||||
{
|
|
||||||
private const int _protocolVersion = 1;
|
|
||||||
private readonly BuildEventsWatcher _buildEventsWatcher;
|
|
||||||
private readonly string _pipeName;
|
|
||||||
|
|
||||||
public AutoRebuildService(BuildEventsWatcher buildEventsWatcher)
|
|
||||||
{
|
|
||||||
_buildEventsWatcher = buildEventsWatcher ?? throw new ArgumentNullException(nameof(buildEventsWatcher));
|
|
||||||
_pipeName = $"BlazorAutoRebuild\\{Process.GetCurrentProcess().Id}";
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Listen()
|
|
||||||
{
|
|
||||||
_ = AddBuildServiceNamedPipeServerAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Task AddBuildServiceNamedPipeServerAsync()
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew(async () =>
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var identity = WindowsIdentity.GetCurrent();
|
|
||||||
var identifier = identity.Owner;
|
|
||||||
var security = new PipeSecurity();
|
|
||||||
|
|
||||||
// Restrict access to just this account.
|
|
||||||
var rule = new PipeAccessRule(identifier, PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance, AccessControlType.Allow);
|
|
||||||
security.AddAccessRule(rule);
|
|
||||||
security.SetOwner(identifier);
|
|
||||||
|
|
||||||
// And our current elevation level
|
|
||||||
var principal = new WindowsPrincipal(identity);
|
|
||||||
var isServerElevated = principal.IsInRole(WindowsBuiltInRole.Administrator);
|
|
||||||
|
|
||||||
using (var serverPipe = new NamedPipeServerStream(
|
|
||||||
_pipeName,
|
|
||||||
PipeDirection.InOut,
|
|
||||||
NamedPipeServerStream.MaxAllowedServerInstances,
|
|
||||||
PipeTransmissionMode.Byte,
|
|
||||||
PipeOptions.Asynchronous | PipeOptions.WriteThrough,
|
|
||||||
0x10000, // 64k input buffer
|
|
||||||
0x10000, // 64k output buffer
|
|
||||||
security,
|
|
||||||
HandleInheritability.None))
|
|
||||||
{
|
|
||||||
// As soon as we receive a connection, spin up another background
|
|
||||||
// listener to wait for the next connection
|
|
||||||
await serverPipe.WaitForConnectionAsync();
|
|
||||||
_ = AddBuildServiceNamedPipeServerAsync();
|
|
||||||
|
|
||||||
await HandleRequestAsync(serverPipe, isServerElevated);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
await AttemptLogErrorAsync(
|
|
||||||
$"Error in Blazor AutoRebuildService:\n{ex.Message}\n{ex.StackTrace}");
|
|
||||||
}
|
|
||||||
}, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task HandleRequestAsync(NamedPipeServerStream stream, bool isServerElevated)
|
|
||||||
{
|
|
||||||
// Protocol:
|
|
||||||
// 1. Send a "protocol version" number to the client
|
|
||||||
// 2. Receive the project path from the client
|
|
||||||
// If it is the special string "abort", gracefully disconnect and end
|
|
||||||
// This is to allow for mismatches between server and client protocol version
|
|
||||||
// 3. Receive the "if not built since" timestamp from the client
|
|
||||||
// 4. Perform the build, then send back the success/failure result flag
|
|
||||||
// Keep in sync with VSForWindowsRebuildService.cs in the Blazor.Server project
|
|
||||||
// In the future we may extend this to getting back build error details
|
|
||||||
await stream.WriteIntAsync(_protocolVersion);
|
|
||||||
var projectPath = await stream.ReadStringAsync();
|
|
||||||
|
|
||||||
// We can't do the security check for elevation until we read from the stream.
|
|
||||||
if (isServerElevated != IsClientElevated(stream))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (projectPath.Equals("abort", StringComparison.Ordinal))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var allowExistingBuildsSince = await stream.ReadDateTimeAsync();
|
|
||||||
var buildResult = await _buildEventsWatcher.PerformBuildAsync(projectPath, allowExistingBuildsSince);
|
|
||||||
await stream.WriteBoolAsync(buildResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task AttemptLogErrorAsync(string message)
|
|
||||||
{
|
|
||||||
if (!ThreadHelper.CheckAccess())
|
|
||||||
{
|
|
||||||
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
var outputWindow = (IVsOutputWindow)Package.GetGlobalService(typeof(SVsOutputWindow));
|
|
||||||
if (outputWindow != null)
|
|
||||||
{
|
|
||||||
outputWindow.GetPane(VSConstants.OutputWindowPaneGuid.BuildOutputPane_guid, out var pane);
|
|
||||||
if (pane != null)
|
|
||||||
{
|
|
||||||
pane.OutputString(message);
|
|
||||||
pane.Activate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool? IsClientElevated(NamedPipeServerStream stream)
|
|
||||||
{
|
|
||||||
bool? isClientElevated = null;
|
|
||||||
stream.RunAsClient(() =>
|
|
||||||
{
|
|
||||||
var identity = WindowsIdentity.GetCurrent(ifImpersonating: true);
|
|
||||||
var principal = new WindowsPrincipal(identity);
|
|
||||||
isClientElevated = principal.IsInRole(WindowsBuiltInRole.Administrator);
|
|
||||||
});
|
|
||||||
|
|
||||||
return isClientElevated;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,184 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.VisualStudio.Shell;
|
|
||||||
using Microsoft.VisualStudio.Shell.Interop;
|
|
||||||
|
|
||||||
namespace Microsoft.VisualStudio.BlazorExtension
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Watches for Blazor project build events, starts new builds, and tracks builds in progress.
|
|
||||||
/// </summary>
|
|
||||||
internal class BuildEventsWatcher : IVsUpdateSolutionEvents2
|
|
||||||
{
|
|
||||||
private const string BlazorProjectCapability = "Blazor";
|
|
||||||
private readonly IVsSolution _vsSolution;
|
|
||||||
private readonly IVsSolutionBuildManager _vsBuildManager;
|
|
||||||
private readonly object mostRecentBuildInfosLock = new object();
|
|
||||||
private readonly Dictionary<string, BuildInfo> mostRecentBuildInfos
|
|
||||||
= new Dictionary<string, BuildInfo>(StringComparer.OrdinalIgnoreCase);
|
|
||||||
|
|
||||||
public BuildEventsWatcher(IVsSolution vsSolution, IVsSolutionBuildManager vsBuildManager)
|
|
||||||
{
|
|
||||||
_vsSolution = vsSolution ?? throw new ArgumentNullException(nameof(vsSolution));
|
|
||||||
_vsBuildManager = vsBuildManager ?? throw new ArgumentNullException(nameof(vsBuildManager));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<bool> PerformBuildAsync(string projectPath, DateTime allowExistingBuildsSince)
|
|
||||||
{
|
|
||||||
BuildInfo newBuildInfo;
|
|
||||||
|
|
||||||
lock (mostRecentBuildInfosLock)
|
|
||||||
{
|
|
||||||
if (mostRecentBuildInfos.TryGetValue(projectPath, out var existingInfo))
|
|
||||||
{
|
|
||||||
// If there's a build in progress, we'll join that even if it was started
|
|
||||||
// before allowExistingBuildsSince, because it's too messy to cancel
|
|
||||||
// in-progress builds. On rare occasions if the user is editing files while
|
|
||||||
// a build is in progress they *might* see a not-latest build when they
|
|
||||||
// reload, but then they just have to reload again.
|
|
||||||
var acceptBuild = !existingInfo.TaskCompletionSource.Task.IsCompleted
|
|
||||||
|| existingInfo.StartTime > allowExistingBuildsSince;
|
|
||||||
if (acceptBuild)
|
|
||||||
{
|
|
||||||
return existingInfo.TaskCompletionSource.Task;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// We're going to start a new build now. Track the BuildInfo for it even
|
|
||||||
// before it starts so other incoming build requests can join it.
|
|
||||||
mostRecentBuildInfos[projectPath] = newBuildInfo = new BuildInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
return PerformNewBuildAsync(projectPath, newBuildInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int UpdateSolution_Begin(ref int pfCancelUpdate)
|
|
||||||
=> VSConstants.S_OK;
|
|
||||||
|
|
||||||
public int UpdateSolution_Done(int fSucceeded, int fModified, int fCancelCommand)
|
|
||||||
=> VSConstants.S_OK;
|
|
||||||
|
|
||||||
public int UpdateSolution_StartUpdate(ref int pfCancelUpdate)
|
|
||||||
=> VSConstants.S_OK;
|
|
||||||
|
|
||||||
public int UpdateSolution_Cancel()
|
|
||||||
=> VSConstants.S_OK;
|
|
||||||
|
|
||||||
public int OnActiveProjectCfgChange(IVsHierarchy pIVsHierarchy)
|
|
||||||
=> VSConstants.S_OK;
|
|
||||||
|
|
||||||
public int UpdateProjectCfg_Begin(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, ref int pfCancel)
|
|
||||||
{
|
|
||||||
ThreadHelper.ThrowIfNotOnUIThread();
|
|
||||||
|
|
||||||
if (IsBlazorProject(pHierProj))
|
|
||||||
{
|
|
||||||
// This method runs both for manually-invoked builds and for builds triggered automatically
|
|
||||||
// by PerformNewBuildAsync(). In the case where it's a manually-invoked build, make sure
|
|
||||||
// there's an in-progress BuildInfo so that if there are further builds requests while the
|
|
||||||
// build is still in progress we can join them onto this existing build.
|
|
||||||
|
|
||||||
var projectPath = GetProjectPath(pHierProj);
|
|
||||||
lock (mostRecentBuildInfosLock)
|
|
||||||
{
|
|
||||||
var hasBuildInProgress =
|
|
||||||
mostRecentBuildInfos.TryGetValue(projectPath, out var existingInfo)
|
|
||||||
&& !existingInfo.TaskCompletionSource.Task.IsCompleted;
|
|
||||||
if (!hasBuildInProgress)
|
|
||||||
{
|
|
||||||
mostRecentBuildInfos[projectPath] = new BuildInfo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return VSConstants.S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int UpdateProjectCfg_Done(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, int fSuccess, int fCancel)
|
|
||||||
{
|
|
||||||
ThreadHelper.ThrowIfNotOnUIThread();
|
|
||||||
|
|
||||||
if (IsBlazorProject(pHierProj))
|
|
||||||
{
|
|
||||||
var buildResult = fSuccess == 1;
|
|
||||||
var projectPath = GetProjectPath(pHierProj);
|
|
||||||
|
|
||||||
// Mark pending build info as completed
|
|
||||||
BuildInfo foundInfo = null;
|
|
||||||
lock (mostRecentBuildInfosLock)
|
|
||||||
{
|
|
||||||
mostRecentBuildInfos.TryGetValue(projectPath, out foundInfo);
|
|
||||||
}
|
|
||||||
if (foundInfo != null)
|
|
||||||
{
|
|
||||||
foundInfo.TaskCompletionSource.TrySetResult(buildResult);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return VSConstants.S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<bool> PerformNewBuildAsync(string projectPath, BuildInfo buildInfo)
|
|
||||||
{
|
|
||||||
// Switch to the UI thread and request the build
|
|
||||||
var didStartBuild = await ThreadHelper.JoinableTaskFactory.RunAsync(async delegate
|
|
||||||
{
|
|
||||||
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
|
|
||||||
|
|
||||||
var hr = _vsSolution.GetProjectOfUniqueName(projectPath, out var hierarchy);
|
|
||||||
if (hr != VSConstants.S_OK)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr = _vsBuildManager.StartSimpleUpdateProjectConfiguration(
|
|
||||||
hierarchy,
|
|
||||||
/* not used */ null,
|
|
||||||
/* not used */ null,
|
|
||||||
(uint)VSSOLNBUILDUPDATEFLAGS.SBF_OPERATION_BUILD,
|
|
||||||
/* other flags */ 0,
|
|
||||||
/* suppress dialogs */ 1);
|
|
||||||
if (hr != VSConstants.S_OK)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!didStartBuild)
|
|
||||||
{
|
|
||||||
// Since the build didn't start, make sure nobody's waiting for it
|
|
||||||
buildInfo.TaskCompletionSource.TrySetResult(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return await buildInfo.TaskCompletionSource.Task;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsBlazorProject(IVsHierarchy pHierProj)
|
|
||||||
=> pHierProj.IsCapabilityMatch(BlazorProjectCapability);
|
|
||||||
|
|
||||||
private static string GetProjectPath(IVsHierarchy pHierProj)
|
|
||||||
{
|
|
||||||
ThreadHelper.ThrowIfNotOnUIThread();
|
|
||||||
ErrorHandler.ThrowOnFailure(((IVsProject)pHierProj).GetMkDocument((uint)VSConstants.VSITEMID.Root, out var projectPath), VSConstants.E_NOTIMPL);
|
|
||||||
return projectPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
class BuildInfo
|
|
||||||
{
|
|
||||||
public DateTime StartTime { get; }
|
|
||||||
public TaskCompletionSource<bool> TaskCompletionSource { get; }
|
|
||||||
|
|
||||||
public BuildInfo()
|
|
||||||
{
|
|
||||||
StartTime = DateTime.Now;
|
|
||||||
TaskCompletionSource = new TaskCompletionSource<bool>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Microsoft.VisualStudio.BlazorExtension
|
|
||||||
{
|
|
||||||
internal static class StreamProtocolExtensions
|
|
||||||
{
|
|
||||||
public static async Task<string> ReadStringAsync(this Stream stream)
|
|
||||||
{
|
|
||||||
var length = BitConverter.ToInt32(await ReadBytesAsync(stream, 4), 0);
|
|
||||||
var utf8Bytes = await ReadBytesAsync(stream, length);
|
|
||||||
return Encoding.UTF8.GetString(utf8Bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task<DateTime> ReadDateTimeAsync(this Stream stream)
|
|
||||||
{
|
|
||||||
var ticksBytes = await ReadBytesAsync(stream, 8);
|
|
||||||
var ticks = BitConverter.ToInt64(ticksBytes, 0);
|
|
||||||
return new DateTime(ticks);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task WriteBoolAsync(this Stream stream, bool value)
|
|
||||||
{
|
|
||||||
var byteVal = value ? (byte)1 : (byte)0;
|
|
||||||
await stream.WriteAsync(new[] { byteVal }, 0, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task WriteIntAsync(this Stream stream, int value)
|
|
||||||
{
|
|
||||||
await stream.WriteAsync(BitConverter.GetBytes(value), 0, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static async Task<byte[]> ReadBytesAsync(Stream stream, int exactLength)
|
|
||||||
{
|
|
||||||
var buf = new byte[exactLength];
|
|
||||||
var bytesRead = 0;
|
|
||||||
while (bytesRead < exactLength)
|
|
||||||
{
|
|
||||||
bytesRead += await stream.ReadAsync(buf, bytesRead, exactLength - bytesRead);
|
|
||||||
}
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.VisualStudio.Shell;
|
|
||||||
using Microsoft.VisualStudio.Shell.Interop;
|
|
||||||
using Task = System.Threading.Tasks.Task;
|
|
||||||
|
|
||||||
namespace Microsoft.VisualStudio.BlazorExtension
|
|
||||||
{
|
|
||||||
// We mainly have a package so we can have an "About" dialog entry.
|
|
||||||
[PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
|
|
||||||
[AboutDialogInfo(PackageGuidString, "ASP.NET Core Blazor Language Services", "#110", "112")]
|
|
||||||
[Guid(BlazorPackage.PackageGuidString)]
|
|
||||||
[ProvideAutoLoad(UIContextGuids80.SolutionExists, PackageAutoLoadFlags.BackgroundLoad)]
|
|
||||||
public sealed class BlazorPackage : AsyncPackage
|
|
||||||
{
|
|
||||||
public const string PackageGuidString = "d9fe04bc-57a7-4107-915e-3a5c2f9e19fb";
|
|
||||||
|
|
||||||
protected async override Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
|
|
||||||
{
|
|
||||||
await base.InitializeAsync(cancellationToken, progress);
|
|
||||||
|
|
||||||
await JoinableTaskFactory.SwitchToMainThreadAsync();
|
|
||||||
|
|
||||||
// Create build watcher. No need to unadvise, as this only happens once anyway.
|
|
||||||
var solution = (IVsSolution)await GetServiceAsync(typeof(IVsSolution));
|
|
||||||
var buildManager = (IVsSolutionBuildManager)await GetServiceAsync(typeof(SVsSolutionBuildManager));
|
|
||||||
|
|
||||||
// According to the docs, this can happen if VS shuts down while our package is loading.
|
|
||||||
if (solution == null || buildManager == null)
|
|
||||||
{
|
|
||||||
var buildWatcher = new BuildEventsWatcher(solution, buildManager);
|
|
||||||
var hr = buildManager.AdviseUpdateSolutionEvents(buildWatcher, out var cookie);
|
|
||||||
Marshal.ThrowExceptionForHR(hr);
|
|
||||||
|
|
||||||
new AutoRebuildService(buildWatcher).Listen();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
[$RootKey$\Languages\CodeExpansions\CSharp\Paths]
|
|
||||||
"Blazor"="$PackageFolder$\CodeSnippets\Blazor"
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
|
|
||||||
<CodeSnippet Format="1.0.0">
|
|
||||||
<Header>
|
|
||||||
<Title>para</Title>
|
|
||||||
<Shortcut>para</Shortcut>
|
|
||||||
<Description>Code snippet for an automatically implemented parameter for Blazor</Description>
|
|
||||||
<Author>Microsoft</Author>
|
|
||||||
<SnippetTypes>
|
|
||||||
<SnippetType>Expansion</SnippetType>
|
|
||||||
</SnippetTypes>
|
|
||||||
</Header>
|
|
||||||
<Snippet>
|
|
||||||
<Declarations>
|
|
||||||
<Literal>
|
|
||||||
<ID>type</ID>
|
|
||||||
<ToolTip>Parameter type</ToolTip>
|
|
||||||
<Default>int</Default>
|
|
||||||
</Literal>
|
|
||||||
<Literal>
|
|
||||||
<ID>property</ID>
|
|
||||||
<ToolTip>Parameter name</ToolTip>
|
|
||||||
<Default>MyParameter</Default>
|
|
||||||
</Literal>
|
|
||||||
</Declarations>
|
|
||||||
<Code Language="csharp">
|
|
||||||
<![CDATA[[Parameter] protected $type$ $property$ { get; set; }$end$]]>
|
|
||||||
</Code>
|
|
||||||
</Snippet>
|
|
||||||
</CodeSnippet>
|
|
||||||
</CodeSnippets>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.9 KiB |
|
|
@ -1,148 +0,0 @@
|
||||||
<Project>
|
|
||||||
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net472</TargetFramework>
|
|
||||||
|
|
||||||
<!-- Use the same experimental hive as Roslyn and Razor. This makes it easy to mix private builds. -->
|
|
||||||
<VSSDKTargetPlatformRegRootSuffix>RoslynDev</VSSDKTargetPlatformRegRootSuffix>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Mark the VSIX as a per-computer install (not-per-user). Putting a component "in the box"
|
|
||||||
requires this, and trying to change it after doing a release has lot of problems.
|
|
||||||
-->
|
|
||||||
<ExtensionInstallationRoot>CommonExtensions</ExtensionInstallationRoot>
|
|
||||||
<ExtensionInstallationFolder>Microsoft\Blazor</ExtensionInstallationFolder>
|
|
||||||
|
|
||||||
<!-- This should be set as true if we're ever building the VSIX for inclusion by the VS installer. -->
|
|
||||||
<IsProductComponent>false</IsProductComponent>
|
|
||||||
|
|
||||||
<!-- Update the VSToolsPath to ensure VSIX builds -->
|
|
||||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
|
||||||
<!-- Other projects should not reference this assembly. It is only meaning to be used in Visual Studio. -->
|
|
||||||
<IsProjectReferenceProvider>false</IsProjectReferenceProvider>
|
|
||||||
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
<UseCodebase>true</UseCodebase>
|
|
||||||
<GeneratePkgDefFile>true</GeneratePkgDefFile>
|
|
||||||
<DeployProjectOutput Condition="'$(ContinuousIntegrationBuild)' == 'true'">false</DeployProjectOutput>
|
|
||||||
<DisablePackageReferenceRestrictions>true</DisablePackageReferenceRestrictions>
|
|
||||||
|
|
||||||
<!-- The Resources.resx is a embedded resource -->
|
|
||||||
<GenerateResxSource>false</GenerateResxSource>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Since the VSSDK doeesn't support SDK-based projects, we have to use the long/verbose version.
|
|
||||||
|
|
||||||
This section has all of the things we need to customize to the VSIX correctly. Everything outside
|
|
||||||
this section is just standard "old-csproj" boilerplate.
|
|
||||||
|
|
||||||
BEGIN INTERESTING STUFF
|
|
||||||
-->
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<!--
|
|
||||||
Include this assembly in the VSIX but not its symbols, except when installing it to the experimental
|
|
||||||
instance.
|
|
||||||
-->
|
|
||||||
<IncludeAssemblyInVSIXContainer>true</IncludeAssemblyInVSIXContainer>
|
|
||||||
<IncludeDebugSymbolsInVSIXContainer>false</IncludeDebugSymbolsInVSIXContainer>
|
|
||||||
<IncludeDebugSymbolsInLocalVSIXDeployment>true</IncludeDebugSymbolsInLocalVSIXDeployment>
|
|
||||||
<!--
|
|
||||||
Always include assemblies and symbols in the output directory.
|
|
||||||
-->
|
|
||||||
<CopyBuildOutputToOutputDirectory>true</CopyBuildOutputToOutputDirectory>
|
|
||||||
<CopyOutputSymbolsToOutputDirectory>true</CopyOutputSymbolsToOutputDirectory>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<Target Name="PreCreateVsixContainer" BeforeTargets="GetVsixSourceItems" Condition="'$(TargetOsName)' == 'win' AND '$(TargetArchitecture)' != 'arm'">
|
|
||||||
<ItemGroup>
|
|
||||||
<_TemplatePackage Include="$(ArtifactsShippingPackagesDir)Microsoft.AspNetCore.Blazor.Templates.*.nupkg" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Error Text="No template files found." Condition="@(_TemplatePackage->Count()) == 0" />
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<VSIXSourceItem Include="@(_TemplatePackage)">
|
|
||||||
<VSIXSubPath>ProjectTemplates\</VSIXSubPath>
|
|
||||||
</VSIXSourceItem>
|
|
||||||
</ItemGroup>
|
|
||||||
</Target>
|
|
||||||
<!--
|
|
||||||
This is needed to support our infrastructure's automatic upload of symbols to the symbol server
|
|
||||||
for debugging.
|
|
||||||
|
|
||||||
The official build will set $(SymbolsPublishDir) and provide an additional place where the symbols
|
|
||||||
ought to be copied for publishing. This will noop otherwise.
|
|
||||||
-->
|
|
||||||
<Target Name="CopySymbolsToOutput" AfterTargets="Build" Condition="'$(SymbolsPublishDir)' != ''">
|
|
||||||
<Copy SourceFiles="$(OutDir)$(AssemblyName).pdb" DestinationFolder="$(SymbolsPublishDir)" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="CodeSnippets.pkgdef" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true" />
|
|
||||||
<Content Include="Templates.pkgdef" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true" />
|
|
||||||
<Content Include="CodeSnippets\Blazor\para.snippet" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true" />
|
|
||||||
<Content Include="Content\WebConfiguration.png" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true" />
|
|
||||||
<Content Include="Resources\BlazorPackage.ico" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true" />
|
|
||||||
|
|
||||||
<Content Include="..\..\..\THIRD-PARTY-NOTICES.txt" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true">
|
|
||||||
<Link>Content\THIRD-PARTY-NOTICES.txt</Link>
|
|
||||||
</Content>
|
|
||||||
<Content Include="$(RepoRoot)LICENSE.txt" CopyToOutputDirectory="PreserveNewest" IncludeInVSIX="true">
|
|
||||||
<Link>Content\LICENSE.txt</Link>
|
|
||||||
</Content>
|
|
||||||
|
|
||||||
<None Include="source.extension.vsixmanifest" SubType="Designer" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference
|
|
||||||
Include="..\..\Templates\src\Microsoft.AspNetCore.Blazor.Templates.csproj"
|
|
||||||
ReferenceOutputAssembly="false"
|
|
||||||
Private="false"
|
|
||||||
Targets="Build;Pack" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Shell.15.0" Version="15.7.27703" />
|
|
||||||
<PackageReference Include="StreamJsonRpc" Version="1.5.43" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<!-- Resources are a little bit special in a VSIX -->
|
|
||||||
<PropertyGroup>
|
|
||||||
<EnableDefaultEmbeddedResourceItems>false</EnableDefaultEmbeddedResourceItems>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<EmbeddedResource Include="Resources.resx">
|
|
||||||
<MergeWithCTO>true</MergeWithCTO>
|
|
||||||
<ManifestResourceName>VSPackage</ManifestResourceName>
|
|
||||||
</EmbeddedResource>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="PresentationCore" />
|
|
||||||
<Reference Include="PresentationFramework" />
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Design" />
|
|
||||||
<Reference Include="System.Drawing" />
|
|
||||||
<Reference Include="System.Windows.Forms" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
|
|
||||||
|
|
||||||
<!-- These need to be set after Sdk.targets because $(VersionSuffixDateStamp) is empty before Sdk.targets is evaluated. -->
|
|
||||||
<PropertyGroup>
|
|
||||||
<!--
|
|
||||||
Following VS convention of using the VS release # as a convention for the vsix version.
|
|
||||||
|
|
||||||
VS needs this build number to be parsable by System.Version, so it can't have any letters or a - which
|
|
||||||
is used by our build system.
|
|
||||||
-->
|
|
||||||
<VsixVersion Condition="'$(VersionSuffixDateStamp)' != ''">16.0.$(VersionSuffixDateStamp).$(VersionSuffixBuildOfTheDay)</VsixVersion>
|
|
||||||
<!-- For local development, set this 42 so its always higher than officil builds. -->
|
|
||||||
<VsixVersion Condition="'$(VersionSuffixDateStamp)' == ''">42.42.42.4242424</VsixVersion>
|
|
||||||
<InformationalVersion>$(VsixVersion)</InformationalVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
</Project>
|
|
||||||
|
|
@ -1,132 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<data name="110" xml:space="preserve">
|
|
||||||
<value>ASP.NET Core Blazor Language Services</value>
|
|
||||||
<comment>About dialog title</comment>
|
|
||||||
</data>
|
|
||||||
<data name="112" xml:space="preserve">
|
|
||||||
<value>Provides Visual Studio support for ASP.NET Core Blazor</value>
|
|
||||||
<comment>About dialog description</comment>
|
|
||||||
</data>
|
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<data name="400" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
|
||||||
<value>Resources\BlazorPackage.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 418 KiB |
|
|
@ -1,2 +0,0 @@
|
||||||
[$RootKey$\TemplateEngine\Templates\Blazor\0.8.0]
|
|
||||||
"InstalledPath"="$PackageFolder$\ProjectTemplates"
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
|
|
||||||
<Metadata>
|
|
||||||
<Identity Id="Microsoft.VisualStudio.BlazorExtension" Version="|%CurrentProject%;GetVsixVersion|" Language="en-US" Publisher="Microsoft" />
|
|
||||||
<DisplayName>Blazor</DisplayName>
|
|
||||||
<Description xml:space="preserve">Provides Visual Studio support for Blazor</Description>
|
|
||||||
<License>Content\LICENSE.txt</License>
|
|
||||||
<PackageId>Microsoft.VisualStudio.BlazorExtension</PackageId>
|
|
||||||
<GettingStartedGuide>https://go.microsoft.com/fwlink/?linkid=870449</GettingStartedGuide>
|
|
||||||
<ReleaseNotes>https://go.microsoft.com/fwlink/?linkid=870448</ReleaseNotes>
|
|
||||||
<Icon>Content\WebConfiguration.png</Icon>
|
|
||||||
<PreviewImage>Content\WebConfiguration.png</PreviewImage>
|
|
||||||
</Metadata>
|
|
||||||
<Installation AllUsers="true">
|
|
||||||
<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[16.2,)" />
|
|
||||||
</Installation>
|
|
||||||
<Assets>
|
|
||||||
<Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />
|
|
||||||
<Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="File" Path="Templates.pkgdef" />
|
|
||||||
<Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="File" Path="CodeSnippets.pkgdef" />
|
|
||||||
</Assets>
|
|
||||||
<Prerequisites>
|
|
||||||
<Prerequisite Id="Microsoft.VisualStudio.Component.Web" Version="[16.0,)" DisplayName="ASP.NET and web development tools" />
|
|
||||||
</Prerequisites>
|
|
||||||
</PackageManifest>
|
|
||||||
|
|
@ -322,8 +322,7 @@ namespace WsProxy {
|
||||||
name = method.Name,
|
name = method.Name,
|
||||||
startLocation = method.StartLocation.ToJObject (),
|
startLocation = method.StartLocation.ToJObject (),
|
||||||
endLocation = method.EndLocation.ToJObject (),
|
endLocation = method.EndLocation.ToJObject (),
|
||||||
}},
|
}}
|
||||||
@this = new { }
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
++frame_id;
|
++frame_id;
|
||||||
|
|
@ -485,11 +484,11 @@ namespace WsProxy {
|
||||||
var values = res.Value? ["result"]? ["value"]?.Values<JObject> ().ToArray ();
|
var values = res.Value? ["result"]? ["value"]?.Values<JObject> ().ToArray ();
|
||||||
|
|
||||||
var var_list = new List<JObject> ();
|
var var_list = new List<JObject> ();
|
||||||
|
int i = 0;
|
||||||
// Trying to inspect the stack frame for DotNetDispatcher::InvokeSynchronously
|
// Trying to inspect the stack frame for DotNetDispatcher::InvokeSynchronously
|
||||||
// results in a "Memory access out of bounds", causing 'values' to be null,
|
// results in a "Memory access out of bounds", causing 'values' to be null,
|
||||||
// so skip returning variable values in that case.
|
// so skip returning variable values in that case.
|
||||||
for (int i = 0; values != null && i < vars.Length; ++i) {
|
while (values != null && i < var_ids.Length && i < values.Length) {
|
||||||
var value = values [i] ["value"];
|
var value = values [i] ["value"];
|
||||||
if (((string)value ["description"]) == null)
|
if (((string)value ["description"]) == null)
|
||||||
value ["description"] = value ["value"]?.ToString();
|
value ["description"] = value ["value"]?.ToString();
|
||||||
|
|
@ -498,12 +497,24 @@ namespace WsProxy {
|
||||||
name = vars [i].Name,
|
name = vars [i].Name,
|
||||||
value = values [i] ["value"]
|
value = values [i] ["value"]
|
||||||
}));
|
}));
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
//Async methods are special in the way that local variables can be lifted to generated class fields
|
||||||
|
//value of "this" comes here either
|
||||||
|
while (i < values.Length) {
|
||||||
|
String name = values [i] ["name"].ToString ();
|
||||||
|
|
||||||
|
if (name.IndexOf (">", StringComparison.Ordinal) > 0)
|
||||||
|
name = name.Substring (1, name.IndexOf (">", StringComparison.Ordinal) - 1);
|
||||||
|
var_list.Add (JObject.FromObject (new {
|
||||||
|
name = name,
|
||||||
|
value = values [i+1] ["value"]
|
||||||
|
}));
|
||||||
|
i = i + 2;
|
||||||
}
|
}
|
||||||
o = JObject.FromObject (new {
|
o = JObject.FromObject (new {
|
||||||
result = var_list
|
result = var_list
|
||||||
});
|
});
|
||||||
|
|
||||||
SendResponse (msg_id, Result.Ok (o), token);
|
SendResponse (msg_id, Result.Ok (o), token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
Hello, world!
|
Hello, world!
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
protected override void OnAfterRender()
|
protected override void OnAfterRender(bool firstRender)
|
||||||
{
|
{
|
||||||
BenchmarkEvent.Send(JSRuntime, "Rendered index.cshtml");
|
BenchmarkEvent.Send(JSRuntime, "Rendered index.cshtml");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@
|
||||||
largeOrgChartJson = JsonSerializer.Serialize(largeOrgChart);
|
largeOrgChartJson = JsonSerializer.Serialize(largeOrgChart);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnAfterRender()
|
protected override void OnAfterRender(bool firstRender)
|
||||||
{
|
{
|
||||||
BenchmarkEvent.Send(JSRuntime, "Finished JSON processing");
|
BenchmarkEvent.Send(JSRuntime, "Finished JSON processing");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ Number of items: <input id="num-items" type="number" @bind=numItems />
|
||||||
show = true;
|
show = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnAfterRender()
|
protected override void OnAfterRender(bool firstRender)
|
||||||
{
|
{
|
||||||
BenchmarkEvent.Send(JSRuntime, "Finished rendering list");
|
BenchmarkEvent.Send(JSRuntime, "Finished rendering list");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -201,8 +201,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Ne
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.JsonPatch", "..\Features\JsonPatch\src\Microsoft.AspNetCore.JsonPatch.csproj", "{DC47C40A-FC38-44E4-94A4-ADE794E76309}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.JsonPatch", "..\Features\JsonPatch\src\Microsoft.AspNetCore.JsonPatch.csproj", "{DC47C40A-FC38-44E4-94A4-ADE794E76309}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.BlazorExtension", "blazor\BlazorExtension\src\Microsoft.VisualStudio.BlazorExtension.csproj", "{9088E4E4-B855-457F-AE9E-D86709A5E1F4}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BB236B66-28C0-49DD-9CD4-C4673CD4E7B4}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BB236B66-28C0-49DD-9CD4-C4673CD4E7B4}"
|
||||||
ProjectSection(SolutionItems) = preProject
|
ProjectSection(SolutionItems) = preProject
|
||||||
..\..\.editorconfig = ..\..\.editorconfig
|
..\..\.editorconfig = ..\..\.editorconfig
|
||||||
|
|
@ -226,6 +224,18 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Blazor
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.Web.Tests", "Web\test\Microsoft.AspNetCore.Components.Web.Tests.csproj", "{DE297C91-B3E9-4C6F-B74D-0AF9EFEBF684}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.Web.Tests", "Web\test\Microsoft.AspNetCore.Components.Web.Tests.csproj", "{DE297C91-B3E9-4C6F-B74D-0AF9EFEBF684}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Authorization", "Authorization", "{08791FEE-761D-40EF-B701-1D31FD1E6E53}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.Authorization", "Authorization\src\Microsoft.AspNetCore.Components.Authorization.csproj", "{956F540A-3CDA-4913-9373-1A4E8A93BDD8}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.Authorization.Tests", "Authorization\test\Microsoft.AspNetCore.Components.Authorization.Tests.csproj", "{B13CDE69-ED22-4664-AAD7-686ED8CD5E88}"
|
||||||
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Forms", "Forms", "{B0EEB429-4C8C-42AA-8822-3058E7DBC98F}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.Forms", "Forms\src\Microsoft.AspNetCore.Components.Forms.csproj", "{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.Forms.Tests", "Forms\test\Microsoft.AspNetCore.Components.Forms.Tests.csproj", "{173D84A3-0F37-480F-AC0F-7E2DBBE32B28}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
|
@ -1316,18 +1326,6 @@ Global
|
||||||
{DC47C40A-FC38-44E4-94A4-ADE794E76309}.Release|x64.Build.0 = Release|Any CPU
|
{DC47C40A-FC38-44E4-94A4-ADE794E76309}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{DC47C40A-FC38-44E4-94A4-ADE794E76309}.Release|x86.ActiveCfg = Release|Any CPU
|
{DC47C40A-FC38-44E4-94A4-ADE794E76309}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{DC47C40A-FC38-44E4-94A4-ADE794E76309}.Release|x86.Build.0 = Release|Any CPU
|
{DC47C40A-FC38-44E4-94A4-ADE794E76309}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x64.Build.0 = Debug|Any CPU
|
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x86.Build.0 = Debug|Any CPU
|
|
||||||
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
|
@ -1436,6 +1434,54 @@ Global
|
||||||
{DE297C91-B3E9-4C6F-B74D-0AF9EFEBF684}.Release|x64.Build.0 = Release|Any CPU
|
{DE297C91-B3E9-4C6F-B74D-0AF9EFEBF684}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{DE297C91-B3E9-4C6F-B74D-0AF9EFEBF684}.Release|x86.ActiveCfg = Release|Any CPU
|
{DE297C91-B3E9-4C6F-B74D-0AF9EFEBF684}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{DE297C91-B3E9-4C6F-B74D-0AF9EFEBF684}.Release|x86.Build.0 = Release|Any CPU
|
{DE297C91-B3E9-4C6F-B74D-0AF9EFEBF684}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{956F540A-3CDA-4913-9373-1A4E8A93BDD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{956F540A-3CDA-4913-9373-1A4E8A93BDD8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{956F540A-3CDA-4913-9373-1A4E8A93BDD8}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{956F540A-3CDA-4913-9373-1A4E8A93BDD8}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{956F540A-3CDA-4913-9373-1A4E8A93BDD8}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{956F540A-3CDA-4913-9373-1A4E8A93BDD8}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{956F540A-3CDA-4913-9373-1A4E8A93BDD8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{956F540A-3CDA-4913-9373-1A4E8A93BDD8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{956F540A-3CDA-4913-9373-1A4E8A93BDD8}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{956F540A-3CDA-4913-9373-1A4E8A93BDD8}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{956F540A-3CDA-4913-9373-1A4E8A93BDD8}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{956F540A-3CDA-4913-9373-1A4E8A93BDD8}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{B13CDE69-ED22-4664-AAD7-686ED8CD5E88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{B13CDE69-ED22-4664-AAD7-686ED8CD5E88}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{B13CDE69-ED22-4664-AAD7-686ED8CD5E88}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{B13CDE69-ED22-4664-AAD7-686ED8CD5E88}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{B13CDE69-ED22-4664-AAD7-686ED8CD5E88}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{B13CDE69-ED22-4664-AAD7-686ED8CD5E88}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{B13CDE69-ED22-4664-AAD7-686ED8CD5E88}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{B13CDE69-ED22-4664-AAD7-686ED8CD5E88}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{B13CDE69-ED22-4664-AAD7-686ED8CD5E88}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{B13CDE69-ED22-4664-AAD7-686ED8CD5E88}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{B13CDE69-ED22-4664-AAD7-686ED8CD5E88}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{B13CDE69-ED22-4664-AAD7-686ED8CD5E88}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{173D84A3-0F37-480F-AC0F-7E2DBBE32B28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{173D84A3-0F37-480F-AC0F-7E2DBBE32B28}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{173D84A3-0F37-480F-AC0F-7E2DBBE32B28}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{173D84A3-0F37-480F-AC0F-7E2DBBE32B28}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{173D84A3-0F37-480F-AC0F-7E2DBBE32B28}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{173D84A3-0F37-480F-AC0F-7E2DBBE32B28}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{173D84A3-0F37-480F-AC0F-7E2DBBE32B28}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{173D84A3-0F37-480F-AC0F-7E2DBBE32B28}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{173D84A3-0F37-480F-AC0F-7E2DBBE32B28}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{173D84A3-0F37-480F-AC0F-7E2DBBE32B28}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{173D84A3-0F37-480F-AC0F-7E2DBBE32B28}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{173D84A3-0F37-480F-AC0F-7E2DBBE32B28}.Release|x86.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
@ -1533,7 +1579,6 @@ Global
|
||||||
{3FAF725B-A628-4531-9F61-499660CD4347} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
{3FAF725B-A628-4531-9F61-499660CD4347} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
||||||
{04262990-929C-42BF-85A9-21C25FA95617} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
{04262990-929C-42BF-85A9-21C25FA95617} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
||||||
{DC47C40A-FC38-44E4-94A4-ADE794E76309} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
{DC47C40A-FC38-44E4-94A4-ADE794E76309} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
||||||
{9088E4E4-B855-457F-AE9E-D86709A5E1F4} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF}
|
|
||||||
{ED210157-461B-45BB-9D86-B81A62792C30} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
{ED210157-461B-45BB-9D86-B81A62792C30} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
||||||
{DA137BD4-F7F1-4D53-855F-5EC40CEA36B0} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
{DA137BD4-F7F1-4D53-855F-5EC40CEA36B0} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
||||||
{0CDAB70B-71DC-43BE-ACB7-AD2EE3541FFB} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
{0CDAB70B-71DC-43BE-ACB7-AD2EE3541FFB} = {2FC10057-7A0A-4E34-8302-879925BC0102}
|
||||||
|
|
@ -1543,6 +1588,10 @@ Global
|
||||||
{74D21785-2FAB-4266-B7C4-E311EC8EE0DF} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF}
|
{74D21785-2FAB-4266-B7C4-E311EC8EE0DF} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF}
|
||||||
{E4C01A3F-D3C1-4639-A6A9-930E918843DD} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF}
|
{E4C01A3F-D3C1-4639-A6A9-930E918843DD} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF}
|
||||||
{DE297C91-B3E9-4C6F-B74D-0AF9EFEBF684} = {A27FF193-195B-4474-8E6C-840B2E339373}
|
{DE297C91-B3E9-4C6F-B74D-0AF9EFEBF684} = {A27FF193-195B-4474-8E6C-840B2E339373}
|
||||||
|
{956F540A-3CDA-4913-9373-1A4E8A93BDD8} = {08791FEE-761D-40EF-B701-1D31FD1E6E53}
|
||||||
|
{B13CDE69-ED22-4664-AAD7-686ED8CD5E88} = {08791FEE-761D-40EF-B701-1D31FD1E6E53}
|
||||||
|
{A5C132FB-1E03-4DA9-8D05-80755ED1D0ED} = {B0EEB429-4C8C-42AA-8822-3058E7DBC98F}
|
||||||
|
{173D84A3-0F37-480F-AC0F-7E2DBBE32B28} = {B0EEB429-4C8C-42AA-8822-3058E7DBC98F}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {CC3C47E1-AD1A-4619-9CD3-E08A0148E5CE}
|
SolutionGuid = {CC3C47E1-AD1A-4619-9CD3-E08A0148E5CE}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,18 @@
|
||||||
<!-- This file is automatically generated. -->
|
<!-- This file is automatically generated. -->
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netstandard2.0</TargetFrameworks>
|
<TargetFrameworks>netstandard2.0;netcoreapp3.0</TargetFrameworks>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
|
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
|
||||||
<Compile Include="Microsoft.AspNetCore.Components.netstandard2.0.cs" />
|
<Compile Include="Microsoft.AspNetCore.Components.netstandard2.0.cs" />
|
||||||
<Reference Include="Microsoft.AspNetCore.Authorization" />
|
|
||||||
<Reference Include="Microsoft.JSInterop" />
|
<Reference Include="Microsoft.JSInterop" />
|
||||||
<Reference Include="System.ComponentModel.Annotations" />
|
<Reference Include="Microsoft.Extensions.Logging.Abstractions" />
|
||||||
|
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
|
||||||
|
<Compile Include="Microsoft.AspNetCore.Components.netcoreapp3.0.cs" />
|
||||||
|
<Reference Include="Microsoft.JSInterop" />
|
||||||
|
<Reference Include="Microsoft.Extensions.Logging.Abstractions" />
|
||||||
|
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,530 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Components
|
||||||
|
{
|
||||||
|
public static partial class BindConverter
|
||||||
|
{
|
||||||
|
public static bool FormatValue(bool value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(System.DateTime value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(System.DateTime value, string format, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(System.DateTimeOffset value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(System.DateTimeOffset value, string format, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(decimal value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(double value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(int value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(long value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static bool? FormatValue(bool? value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(System.DateTimeOffset? value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(System.DateTimeOffset? value, string format, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(System.DateTime? value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(System.DateTime? value, string format, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(decimal? value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(double? value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(int? value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(long? value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(float? value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(float value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static string FormatValue(string value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static object FormatValue<T>(T value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static bool TryConvertToBool(object obj, System.Globalization.CultureInfo culture, out bool value) { throw null; }
|
||||||
|
public static bool TryConvertToDateTime(object obj, System.Globalization.CultureInfo culture, out System.DateTime value) { throw null; }
|
||||||
|
public static bool TryConvertToDateTime(object obj, System.Globalization.CultureInfo culture, string format, out System.DateTime value) { throw null; }
|
||||||
|
public static bool TryConvertToDateTimeOffset(object obj, System.Globalization.CultureInfo culture, out System.DateTimeOffset value) { throw null; }
|
||||||
|
public static bool TryConvertToDateTimeOffset(object obj, System.Globalization.CultureInfo culture, string format, out System.DateTimeOffset value) { throw null; }
|
||||||
|
public static bool TryConvertToDecimal(object obj, System.Globalization.CultureInfo culture, out decimal value) { throw null; }
|
||||||
|
public static bool TryConvertToDouble(object obj, System.Globalization.CultureInfo culture, out double value) { throw null; }
|
||||||
|
public static bool TryConvertToFloat(object obj, System.Globalization.CultureInfo culture, out float value) { throw null; }
|
||||||
|
public static bool TryConvertToInt(object obj, System.Globalization.CultureInfo culture, out int value) { throw null; }
|
||||||
|
public static bool TryConvertToLong(object obj, System.Globalization.CultureInfo culture, out long value) { throw null; }
|
||||||
|
public static bool TryConvertToNullableBool(object obj, System.Globalization.CultureInfo culture, out bool? value) { throw null; }
|
||||||
|
public static bool TryConvertToNullableDateTime(object obj, System.Globalization.CultureInfo culture, out System.DateTime? value) { throw null; }
|
||||||
|
public static bool TryConvertToNullableDateTime(object obj, System.Globalization.CultureInfo culture, string format, out System.DateTime? value) { throw null; }
|
||||||
|
public static bool TryConvertToNullableDateTimeOffset(object obj, System.Globalization.CultureInfo culture, out System.DateTimeOffset? value) { throw null; }
|
||||||
|
public static bool TryConvertToNullableDateTimeOffset(object obj, System.Globalization.CultureInfo culture, string format, out System.DateTimeOffset? value) { throw null; }
|
||||||
|
public static bool TryConvertToNullableDecimal(object obj, System.Globalization.CultureInfo culture, out decimal? value) { throw null; }
|
||||||
|
public static bool TryConvertToNullableDouble(object obj, System.Globalization.CultureInfo culture, out double? value) { throw null; }
|
||||||
|
public static bool TryConvertToNullableFloat(object obj, System.Globalization.CultureInfo culture, out float? value) { throw null; }
|
||||||
|
public static bool TryConvertToNullableInt(object obj, System.Globalization.CultureInfo culture, out int? value) { throw null; }
|
||||||
|
public static bool TryConvertToNullableLong(object obj, System.Globalization.CultureInfo culture, out long? value) { throw null; }
|
||||||
|
public static bool TryConvertToString(object obj, System.Globalization.CultureInfo culture, out string value) { throw null; }
|
||||||
|
public static bool TryConvertTo<T>(object obj, System.Globalization.CultureInfo culture, out T value) { throw null; }
|
||||||
|
}
|
||||||
|
[System.AttributeUsageAttribute(System.AttributeTargets.Property, AllowMultiple=false, Inherited=true)]
|
||||||
|
public sealed partial class CascadingParameterAttribute : System.Attribute
|
||||||
|
{
|
||||||
|
public CascadingParameterAttribute() { }
|
||||||
|
public string Name { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
}
|
||||||
|
public partial class CascadingValue<TValue> : Microsoft.AspNetCore.Components.IComponent
|
||||||
|
{
|
||||||
|
public CascadingValue() { }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment ChildContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public bool IsFixed { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public string Name { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public TValue Value { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
public void Attach(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { }
|
||||||
|
public System.Threading.Tasks.Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterView parameters) { throw null; }
|
||||||
|
}
|
||||||
|
public partial class ChangeEventArgs : System.EventArgs
|
||||||
|
{
|
||||||
|
public ChangeEventArgs() { }
|
||||||
|
public object Value { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
}
|
||||||
|
public abstract partial class ComponentBase : Microsoft.AspNetCore.Components.IComponent, Microsoft.AspNetCore.Components.IHandleAfterRender, Microsoft.AspNetCore.Components.IHandleEvent
|
||||||
|
{
|
||||||
|
public ComponentBase() { }
|
||||||
|
protected virtual void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { }
|
||||||
|
protected System.Threading.Tasks.Task InvokeAsync(System.Action workItem) { throw null; }
|
||||||
|
protected System.Threading.Tasks.Task InvokeAsync(System.Func<System.Threading.Tasks.Task> workItem) { throw null; }
|
||||||
|
void Microsoft.AspNetCore.Components.IComponent.Attach(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { }
|
||||||
|
System.Threading.Tasks.Task Microsoft.AspNetCore.Components.IHandleAfterRender.OnAfterRenderAsync() { throw null; }
|
||||||
|
System.Threading.Tasks.Task Microsoft.AspNetCore.Components.IHandleEvent.HandleEventAsync(Microsoft.AspNetCore.Components.EventCallbackWorkItem callback, object arg) { throw null; }
|
||||||
|
protected virtual void OnAfterRender(bool firstRender) { }
|
||||||
|
protected virtual System.Threading.Tasks.Task OnAfterRenderAsync(bool firstRender) { throw null; }
|
||||||
|
protected virtual void OnInitialized() { }
|
||||||
|
protected virtual System.Threading.Tasks.Task OnInitializedAsync() { throw null; }
|
||||||
|
protected virtual void OnParametersSet() { }
|
||||||
|
protected virtual System.Threading.Tasks.Task OnParametersSetAsync() { throw null; }
|
||||||
|
public virtual System.Threading.Tasks.Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterView parameters) { throw null; }
|
||||||
|
protected virtual bool ShouldRender() { throw null; }
|
||||||
|
protected void StateHasChanged() { }
|
||||||
|
}
|
||||||
|
public abstract partial class Dispatcher
|
||||||
|
{
|
||||||
|
protected Dispatcher() { }
|
||||||
|
public abstract bool CheckAccess();
|
||||||
|
public static Microsoft.AspNetCore.Components.Dispatcher CreateDefault() { throw null; }
|
||||||
|
public abstract System.Threading.Tasks.Task InvokeAsync(System.Action workItem);
|
||||||
|
public abstract System.Threading.Tasks.Task InvokeAsync(System.Func<System.Threading.Tasks.Task> workItem);
|
||||||
|
public abstract System.Threading.Tasks.Task<TResult> InvokeAsync<TResult>(System.Func<System.Threading.Tasks.Task<TResult>> workItem);
|
||||||
|
public abstract System.Threading.Tasks.Task<TResult> InvokeAsync<TResult>(System.Func<TResult> workItem);
|
||||||
|
protected void OnUnhandledException(System.UnhandledExceptionEventArgs e) { }
|
||||||
|
}
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct ElementReference
|
||||||
|
{
|
||||||
|
private readonly object _dummy;
|
||||||
|
}
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct EventCallback
|
||||||
|
{
|
||||||
|
private readonly object _dummy;
|
||||||
|
public static readonly Microsoft.AspNetCore.Components.EventCallback Empty;
|
||||||
|
public static readonly Microsoft.AspNetCore.Components.EventCallbackFactory Factory;
|
||||||
|
public EventCallback(Microsoft.AspNetCore.Components.IHandleEvent receiver, System.MulticastDelegate @delegate) { throw null; }
|
||||||
|
public bool HasDelegate { get { throw null; } }
|
||||||
|
public System.Threading.Tasks.Task InvokeAsync(object arg) { throw null; }
|
||||||
|
}
|
||||||
|
public sealed partial class EventCallbackFactory
|
||||||
|
{
|
||||||
|
public EventCallbackFactory() { }
|
||||||
|
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
|
||||||
|
public Microsoft.AspNetCore.Components.EventCallback Create(object receiver, Microsoft.AspNetCore.Components.EventCallback callback) { throw null; }
|
||||||
|
public Microsoft.AspNetCore.Components.EventCallback Create(object receiver, System.Action callback) { throw null; }
|
||||||
|
public Microsoft.AspNetCore.Components.EventCallback Create(object receiver, System.Action<object> callback) { throw null; }
|
||||||
|
public Microsoft.AspNetCore.Components.EventCallback Create(object receiver, System.Func<object, System.Threading.Tasks.Task> callback) { throw null; }
|
||||||
|
public Microsoft.AspNetCore.Components.EventCallback Create(object receiver, System.Func<System.Threading.Tasks.Task> callback) { throw null; }
|
||||||
|
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
|
||||||
|
public Microsoft.AspNetCore.Components.EventCallback<TValue> CreateInferred<TValue>(object receiver, System.Action<TValue> callback, TValue value) { throw null; }
|
||||||
|
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
|
||||||
|
public Microsoft.AspNetCore.Components.EventCallback<TValue> CreateInferred<TValue>(object receiver, System.Func<TValue, System.Threading.Tasks.Task> callback, TValue value) { throw null; }
|
||||||
|
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
|
||||||
|
public Microsoft.AspNetCore.Components.EventCallback<TValue> Create<TValue>(object receiver, Microsoft.AspNetCore.Components.EventCallback callback) { throw null; }
|
||||||
|
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
|
||||||
|
public Microsoft.AspNetCore.Components.EventCallback<TValue> Create<TValue>(object receiver, Microsoft.AspNetCore.Components.EventCallback<TValue> callback) { throw null; }
|
||||||
|
public Microsoft.AspNetCore.Components.EventCallback<TValue> Create<TValue>(object receiver, System.Action callback) { throw null; }
|
||||||
|
public Microsoft.AspNetCore.Components.EventCallback<TValue> Create<TValue>(object receiver, System.Action<TValue> callback) { throw null; }
|
||||||
|
public Microsoft.AspNetCore.Components.EventCallback<TValue> Create<TValue>(object receiver, System.Func<System.Threading.Tasks.Task> callback) { throw null; }
|
||||||
|
public Microsoft.AspNetCore.Components.EventCallback<TValue> Create<TValue>(object receiver, System.Func<TValue, System.Threading.Tasks.Task> callback) { throw null; }
|
||||||
|
}
|
||||||
|
public static partial class EventCallbackFactoryBinderExtensions
|
||||||
|
{
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<bool> setter, bool existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTimeOffset> setter, System.DateTimeOffset existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTimeOffset> setter, System.DateTimeOffset existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime> setter, System.DateTime existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime> setter, System.DateTime existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<decimal> setter, decimal existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<double> setter, double existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<int> setter, int existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<long> setter, long existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<bool?> setter, bool? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTimeOffset?> setter, System.DateTimeOffset? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTimeOffset?> setter, System.DateTimeOffset? existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime?> setter, System.DateTime? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime?> setter, System.DateTime? existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<decimal?> setter, decimal? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<double?> setter, double? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<int?> setter, int? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<long?> setter, long? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<float?> setter, float? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<float> setter, float existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<string> setter, string existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder<T>(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<T> setter, T existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
}
|
||||||
|
public static partial class EventCallbackFactoryEventArgsExtensions
|
||||||
|
{
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> Create(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<Microsoft.AspNetCore.Components.ChangeEventArgs> callback) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<System.EventArgs> Create(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.EventArgs> callback) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> Create(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Func<Microsoft.AspNetCore.Components.ChangeEventArgs, System.Threading.Tasks.Task> callback) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<System.EventArgs> Create(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Func<System.EventArgs, System.Threading.Tasks.Task> callback) { throw null; }
|
||||||
|
}
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct EventCallbackWorkItem
|
||||||
|
{
|
||||||
|
private readonly object _dummy;
|
||||||
|
public static readonly Microsoft.AspNetCore.Components.EventCallbackWorkItem Empty;
|
||||||
|
public EventCallbackWorkItem(System.MulticastDelegate @delegate) { throw null; }
|
||||||
|
public System.Threading.Tasks.Task InvokeAsync(object arg) { throw null; }
|
||||||
|
}
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct EventCallback<TValue>
|
||||||
|
{
|
||||||
|
private readonly object _dummy;
|
||||||
|
public static readonly Microsoft.AspNetCore.Components.EventCallback<TValue> Empty;
|
||||||
|
public EventCallback(Microsoft.AspNetCore.Components.IHandleEvent receiver, System.MulticastDelegate @delegate) { throw null; }
|
||||||
|
public bool HasDelegate { get { throw null; } }
|
||||||
|
public System.Threading.Tasks.Task InvokeAsync(TValue arg) { throw null; }
|
||||||
|
}
|
||||||
|
public partial interface IComponent
|
||||||
|
{
|
||||||
|
void Attach(Microsoft.AspNetCore.Components.RenderHandle renderHandle);
|
||||||
|
System.Threading.Tasks.Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterView parameters);
|
||||||
|
}
|
||||||
|
public partial interface IComponentContext
|
||||||
|
{
|
||||||
|
bool IsConnected { get; }
|
||||||
|
}
|
||||||
|
public partial interface IHandleAfterRender
|
||||||
|
{
|
||||||
|
System.Threading.Tasks.Task OnAfterRenderAsync();
|
||||||
|
}
|
||||||
|
public partial interface IHandleEvent
|
||||||
|
{
|
||||||
|
System.Threading.Tasks.Task HandleEventAsync(Microsoft.AspNetCore.Components.EventCallbackWorkItem item, object arg);
|
||||||
|
}
|
||||||
|
[System.AttributeUsageAttribute(System.AttributeTargets.Property, AllowMultiple=false, Inherited=true)]
|
||||||
|
public sealed partial class InjectAttribute : System.Attribute
|
||||||
|
{
|
||||||
|
public InjectAttribute() { }
|
||||||
|
}
|
||||||
|
[System.AttributeUsageAttribute(System.AttributeTargets.Class, AllowMultiple=false, Inherited=true)]
|
||||||
|
public sealed partial class LayoutAttribute : System.Attribute
|
||||||
|
{
|
||||||
|
public LayoutAttribute(System.Type layoutType) { }
|
||||||
|
public System.Type LayoutType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
}
|
||||||
|
public abstract partial class LayoutComponentBase : Microsoft.AspNetCore.Components.ComponentBase
|
||||||
|
{
|
||||||
|
protected LayoutComponentBase() { }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment Body { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
}
|
||||||
|
public partial class LayoutView : Microsoft.AspNetCore.Components.IComponent
|
||||||
|
{
|
||||||
|
public LayoutView() { }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment ChildContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public System.Type Layout { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
public void Attach(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { }
|
||||||
|
public System.Threading.Tasks.Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterView parameters) { throw null; }
|
||||||
|
}
|
||||||
|
public sealed partial class LocationChangeException : System.Exception
|
||||||
|
{
|
||||||
|
public LocationChangeException(string message, System.Exception innerException) { }
|
||||||
|
}
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct MarkupString
|
||||||
|
{
|
||||||
|
private readonly object _dummy;
|
||||||
|
public MarkupString(string value) { throw null; }
|
||||||
|
public string Value { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public static explicit operator Microsoft.AspNetCore.Components.MarkupString (string value) { throw null; }
|
||||||
|
public override string ToString() { throw null; }
|
||||||
|
}
|
||||||
|
public partial class NavigationException : System.Exception
|
||||||
|
{
|
||||||
|
public NavigationException(string uri) { }
|
||||||
|
public string Location { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
}
|
||||||
|
public abstract partial class NavigationManager
|
||||||
|
{
|
||||||
|
protected NavigationManager() { }
|
||||||
|
public string BaseUri { get { throw null; } protected set { } }
|
||||||
|
public string Uri { get { throw null; } protected set { } }
|
||||||
|
public event System.EventHandler<Microsoft.AspNetCore.Components.Routing.LocationChangedEventArgs> LocationChanged { add { } remove { } }
|
||||||
|
protected virtual void EnsureInitialized() { }
|
||||||
|
protected void Initialize(string baseUri, string uri) { }
|
||||||
|
public void NavigateTo(string uri, bool forceLoad = false) { }
|
||||||
|
protected abstract void NavigateToCore(string uri, bool forceLoad);
|
||||||
|
protected void NotifyLocationChanged(bool isInterceptedLink) { }
|
||||||
|
public System.Uri ToAbsoluteUri(string relativeUri) { throw null; }
|
||||||
|
public string ToBaseRelativePath(string uri) { throw null; }
|
||||||
|
}
|
||||||
|
public abstract partial class OwningComponentBase : Microsoft.AspNetCore.Components.ComponentBase, System.IDisposable
|
||||||
|
{
|
||||||
|
protected OwningComponentBase() { }
|
||||||
|
protected bool IsDisposed { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
protected System.IServiceProvider ScopedServices { get { throw null; } }
|
||||||
|
protected virtual void Dispose(bool disposing) { }
|
||||||
|
void System.IDisposable.Dispose() { }
|
||||||
|
}
|
||||||
|
public abstract partial class OwningComponentBase<TService> : Microsoft.AspNetCore.Components.OwningComponentBase, System.IDisposable
|
||||||
|
{
|
||||||
|
protected OwningComponentBase() { }
|
||||||
|
protected TService Service { get { throw null; } }
|
||||||
|
}
|
||||||
|
[System.AttributeUsageAttribute(System.AttributeTargets.Property, AllowMultiple=false, Inherited=true)]
|
||||||
|
public sealed partial class ParameterAttribute : System.Attribute
|
||||||
|
{
|
||||||
|
public ParameterAttribute() { }
|
||||||
|
public bool CaptureUnmatchedValues { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
}
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct ParameterValue
|
||||||
|
{
|
||||||
|
private readonly object _dummy;
|
||||||
|
private readonly int _dummyPrimitive;
|
||||||
|
public bool Cascading { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public string Name { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public object Value { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
}
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct ParameterView
|
||||||
|
{
|
||||||
|
private readonly object _dummy;
|
||||||
|
private readonly int _dummyPrimitive;
|
||||||
|
public static Microsoft.AspNetCore.Components.ParameterView Empty { get { throw null; } }
|
||||||
|
public static Microsoft.AspNetCore.Components.ParameterView FromDictionary(System.Collections.Generic.IDictionary<string, object> parameters) { throw null; }
|
||||||
|
public Microsoft.AspNetCore.Components.ParameterView.Enumerator GetEnumerator() { throw null; }
|
||||||
|
public TValue GetValueOrDefault<TValue>(string parameterName) { throw null; }
|
||||||
|
public TValue GetValueOrDefault<TValue>(string parameterName, TValue defaultValue) { throw null; }
|
||||||
|
public void SetParameterProperties(object target) { }
|
||||||
|
public System.Collections.Generic.IReadOnlyDictionary<string, object> ToDictionary() { throw null; }
|
||||||
|
public bool TryGetValue<TValue>(string parameterName, out TValue result) { throw null; }
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public partial struct Enumerator
|
||||||
|
{
|
||||||
|
private object _dummy;
|
||||||
|
private int _dummyPrimitive;
|
||||||
|
public Microsoft.AspNetCore.Components.ParameterValue Current { get { throw null; } }
|
||||||
|
public bool MoveNext() { throw null; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public delegate void RenderFragment(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder);
|
||||||
|
public delegate Microsoft.AspNetCore.Components.RenderFragment RenderFragment<TValue>(TValue value);
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct RenderHandle
|
||||||
|
{
|
||||||
|
private readonly object _dummy;
|
||||||
|
private readonly int _dummyPrimitive;
|
||||||
|
public Microsoft.AspNetCore.Components.Dispatcher Dispatcher { get { throw null; } }
|
||||||
|
public bool IsInitialized { get { throw null; } }
|
||||||
|
public void Render(Microsoft.AspNetCore.Components.RenderFragment renderFragment) { }
|
||||||
|
}
|
||||||
|
[System.AttributeUsageAttribute(System.AttributeTargets.Class, AllowMultiple=true, Inherited=false)]
|
||||||
|
public sealed partial class RouteAttribute : System.Attribute
|
||||||
|
{
|
||||||
|
public RouteAttribute(string template) { }
|
||||||
|
public string Template { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
}
|
||||||
|
public sealed partial class RouteData
|
||||||
|
{
|
||||||
|
public RouteData(System.Type pageType, System.Collections.Generic.IReadOnlyDictionary<string, object> routeValues) { }
|
||||||
|
public System.Type PageType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public System.Collections.Generic.IReadOnlyDictionary<string, object> RouteValues { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
}
|
||||||
|
public partial class RouteView : Microsoft.AspNetCore.Components.IComponent
|
||||||
|
{
|
||||||
|
public RouteView() { }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public System.Type DefaultLayout { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RouteData RouteData { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
public void Attach(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { }
|
||||||
|
protected virtual void Render(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { }
|
||||||
|
public System.Threading.Tasks.Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterView parameters) { throw null; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
namespace Microsoft.AspNetCore.Components.CompilerServices
|
||||||
|
{
|
||||||
|
public static partial class RuntimeHelpers
|
||||||
|
{
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<T> CreateInferredEventCallback<T>(object receiver, System.Action<T> callback, T value) { throw null; }
|
||||||
|
public static Microsoft.AspNetCore.Components.EventCallback<T> CreateInferredEventCallback<T>(object receiver, System.Func<T, System.Threading.Tasks.Task> callback, T value) { throw null; }
|
||||||
|
public static T TypeCheck<T>(T value) { throw null; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
namespace Microsoft.AspNetCore.Components.Rendering
|
||||||
|
{
|
||||||
|
public partial class EventFieldInfo
|
||||||
|
{
|
||||||
|
public EventFieldInfo() { }
|
||||||
|
public int ComponentId { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
public object FieldValue { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
}
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct RenderBatch
|
||||||
|
{
|
||||||
|
private readonly object _dummy;
|
||||||
|
public Microsoft.AspNetCore.Components.RenderTree.ArrayRange<int> DisposedComponentIDs { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public Microsoft.AspNetCore.Components.RenderTree.ArrayRange<ulong> DisposedEventHandlerIDs { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public Microsoft.AspNetCore.Components.RenderTree.ArrayRange<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame> ReferenceFrames { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public Microsoft.AspNetCore.Components.RenderTree.ArrayRange<Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff> UpdatedComponents { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
}
|
||||||
|
public abstract partial class Renderer : System.IDisposable
|
||||||
|
{
|
||||||
|
public Renderer(System.IServiceProvider serviceProvider, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) { }
|
||||||
|
public abstract Microsoft.AspNetCore.Components.Dispatcher Dispatcher { get; }
|
||||||
|
public event System.UnhandledExceptionEventHandler UnhandledSynchronizationException { add { } remove { } }
|
||||||
|
protected internal int AssignRootComponentId(Microsoft.AspNetCore.Components.IComponent component) { throw null; }
|
||||||
|
public virtual System.Threading.Tasks.Task DispatchEventAsync(ulong eventHandlerId, Microsoft.AspNetCore.Components.Rendering.EventFieldInfo fieldInfo, System.EventArgs eventArgs) { throw null; }
|
||||||
|
public void Dispose() { }
|
||||||
|
protected virtual void Dispose(bool disposing) { }
|
||||||
|
protected Microsoft.AspNetCore.Components.RenderTree.ArrayRange<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame> GetCurrentRenderTreeFrames(int componentId) { throw null; }
|
||||||
|
protected abstract void HandleException(System.Exception exception);
|
||||||
|
protected Microsoft.AspNetCore.Components.IComponent InstantiateComponent(System.Type componentType) { throw null; }
|
||||||
|
protected virtual void ProcessPendingRender() { }
|
||||||
|
protected System.Threading.Tasks.Task RenderRootComponentAsync(int componentId) { throw null; }
|
||||||
|
[System.Diagnostics.DebuggerStepThroughAttribute]
|
||||||
|
protected System.Threading.Tasks.Task RenderRootComponentAsync(int componentId, Microsoft.AspNetCore.Components.ParameterView initialParameters) { throw null; }
|
||||||
|
protected abstract System.Threading.Tasks.Task UpdateDisplayAsync(in Microsoft.AspNetCore.Components.Rendering.RenderBatch renderBatch);
|
||||||
|
}
|
||||||
|
public sealed partial class RenderTreeBuilder : System.IDisposable
|
||||||
|
{
|
||||||
|
public RenderTreeBuilder() { }
|
||||||
|
public void AddAttribute(int sequence, in Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame frame) { }
|
||||||
|
public void AddAttribute(int sequence, string name, Microsoft.AspNetCore.Components.EventCallback value) { }
|
||||||
|
public void AddAttribute(int sequence, string name, bool value) { }
|
||||||
|
public void AddAttribute(int sequence, string name, System.MulticastDelegate value) { }
|
||||||
|
public void AddAttribute(int sequence, string name, object value) { }
|
||||||
|
public void AddAttribute(int sequence, string name, string value) { }
|
||||||
|
public void AddAttribute<TArgument>(int sequence, string name, Microsoft.AspNetCore.Components.EventCallback<TArgument> value) { }
|
||||||
|
public void AddComponentReferenceCapture(int sequence, System.Action<object> componentReferenceCaptureAction) { }
|
||||||
|
public void AddContent(int sequence, Microsoft.AspNetCore.Components.MarkupString markupContent) { }
|
||||||
|
public void AddContent(int sequence, Microsoft.AspNetCore.Components.RenderFragment fragment) { }
|
||||||
|
public void AddContent(int sequence, object textContent) { }
|
||||||
|
public void AddContent(int sequence, string textContent) { }
|
||||||
|
public void AddContent<TValue>(int sequence, Microsoft.AspNetCore.Components.RenderFragment<TValue> fragment, TValue value) { }
|
||||||
|
public void AddElementReferenceCapture(int sequence, System.Action<Microsoft.AspNetCore.Components.ElementReference> elementReferenceCaptureAction) { }
|
||||||
|
public void AddMarkupContent(int sequence, string markupContent) { }
|
||||||
|
public void AddMultipleAttributes(int sequence, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) { }
|
||||||
|
public void Clear() { }
|
||||||
|
public void CloseComponent() { }
|
||||||
|
public void CloseElement() { }
|
||||||
|
public void CloseRegion() { }
|
||||||
|
public Microsoft.AspNetCore.Components.RenderTree.ArrayRange<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame> GetFrames() { throw null; }
|
||||||
|
public void OpenComponent(int sequence, System.Type componentType) { }
|
||||||
|
public void OpenComponent<TComponent>(int sequence) where TComponent : Microsoft.AspNetCore.Components.IComponent { }
|
||||||
|
public void OpenElement(int sequence, string elementName) { }
|
||||||
|
public void OpenRegion(int sequence) { }
|
||||||
|
public void SetKey(object value) { }
|
||||||
|
public void SetUpdatesAttributeName(string updatesAttributeName) { }
|
||||||
|
void System.IDisposable.Dispose() { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
namespace Microsoft.AspNetCore.Components.RenderTree
|
||||||
|
{
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct ArrayBuilderSegment<T> : System.Collections.Generic.IEnumerable<T>, System.Collections.IEnumerable
|
||||||
|
{
|
||||||
|
private readonly object _dummy;
|
||||||
|
private readonly int _dummyPrimitive;
|
||||||
|
public T[] Array { get { throw null; } }
|
||||||
|
public int Count { get { throw null; } }
|
||||||
|
public T this[int index] { get { throw null; } }
|
||||||
|
public int Offset { get { throw null; } }
|
||||||
|
System.Collections.Generic.IEnumerator<T> System.Collections.Generic.IEnumerable<T>.GetEnumerator() { throw null; }
|
||||||
|
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { throw null; }
|
||||||
|
}
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct ArrayRange<T>
|
||||||
|
{
|
||||||
|
public readonly T[] Array;
|
||||||
|
public readonly int Count;
|
||||||
|
public ArrayRange(T[] array, int count) { throw null; }
|
||||||
|
public Microsoft.AspNetCore.Components.RenderTree.ArrayRange<T> Clone() { throw null; }
|
||||||
|
}
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct RenderTreeDiff
|
||||||
|
{
|
||||||
|
public readonly int ComponentId;
|
||||||
|
public readonly Microsoft.AspNetCore.Components.RenderTree.ArrayBuilderSegment<Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit> Edits;
|
||||||
|
}
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Explicit)]
|
||||||
|
public readonly partial struct RenderTreeEdit
|
||||||
|
{
|
||||||
|
[System.Runtime.InteropServices.FieldOffsetAttribute(8)]
|
||||||
|
public readonly int MoveToSiblingIndex;
|
||||||
|
[System.Runtime.InteropServices.FieldOffsetAttribute(8)]
|
||||||
|
public readonly int ReferenceFrameIndex;
|
||||||
|
[System.Runtime.InteropServices.FieldOffsetAttribute(16)]
|
||||||
|
public readonly string RemovedAttributeName;
|
||||||
|
[System.Runtime.InteropServices.FieldOffsetAttribute(4)]
|
||||||
|
public readonly int SiblingIndex;
|
||||||
|
[System.Runtime.InteropServices.FieldOffsetAttribute(0)]
|
||||||
|
public readonly Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType Type;
|
||||||
|
}
|
||||||
|
public enum RenderTreeEditType
|
||||||
|
{
|
||||||
|
PrependFrame = 1,
|
||||||
|
RemoveFrame = 2,
|
||||||
|
SetAttribute = 3,
|
||||||
|
RemoveAttribute = 4,
|
||||||
|
UpdateText = 5,
|
||||||
|
StepIn = 6,
|
||||||
|
StepOut = 7,
|
||||||
|
UpdateMarkup = 8,
|
||||||
|
PermutationListEntry = 9,
|
||||||
|
PermutationListEnd = 10,
|
||||||
|
}
|
||||||
|
public enum RenderTreeFrameType : short
|
||||||
|
{
|
||||||
|
None = (short)0,
|
||||||
|
Element = (short)1,
|
||||||
|
Text = (short)2,
|
||||||
|
Attribute = (short)3,
|
||||||
|
Component = (short)4,
|
||||||
|
Region = (short)5,
|
||||||
|
ElementReferenceCapture = (short)6,
|
||||||
|
ComponentReferenceCapture = (short)7,
|
||||||
|
Markup = (short)8,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
namespace Microsoft.AspNetCore.Components.Routing
|
||||||
|
{
|
||||||
|
public partial interface IHostEnvironmentNavigationManager
|
||||||
|
{
|
||||||
|
void Initialize(string baseUri, string uri);
|
||||||
|
}
|
||||||
|
public partial interface INavigationInterception
|
||||||
|
{
|
||||||
|
System.Threading.Tasks.Task EnableNavigationInterceptionAsync();
|
||||||
|
}
|
||||||
|
public partial class LocationChangedEventArgs : System.EventArgs
|
||||||
|
{
|
||||||
|
public LocationChangedEventArgs(string location, bool isNavigationIntercepted) { }
|
||||||
|
public bool IsNavigationIntercepted { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public string Location { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
}
|
||||||
|
public partial class Router : Microsoft.AspNetCore.Components.IComponent, Microsoft.AspNetCore.Components.IHandleAfterRender, System.IDisposable
|
||||||
|
{
|
||||||
|
public Router() { }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public System.Reflection.Assembly AppAssembly { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.RouteData> Found { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
||||||
|
public Microsoft.AspNetCore.Components.RenderFragment NotFound { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
public void Attach(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { }
|
||||||
|
public void Dispose() { }
|
||||||
|
System.Threading.Tasks.Task Microsoft.AspNetCore.Components.IHandleAfterRender.OnAfterRenderAsync() { throw null; }
|
||||||
|
public System.Threading.Tasks.Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterView parameters) { throw null; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,55 +3,6 @@
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components
|
namespace Microsoft.AspNetCore.Components
|
||||||
{
|
{
|
||||||
public partial class AuthenticationState
|
|
||||||
{
|
|
||||||
public AuthenticationState(System.Security.Claims.ClaimsPrincipal user) { }
|
|
||||||
public System.Security.Claims.ClaimsPrincipal User { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
|
||||||
}
|
|
||||||
public delegate void AuthenticationStateChangedHandler(System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.AuthenticationState> task);
|
|
||||||
public abstract partial class AuthenticationStateProvider
|
|
||||||
{
|
|
||||||
protected AuthenticationStateProvider() { }
|
|
||||||
public event Microsoft.AspNetCore.Components.AuthenticationStateChangedHandler AuthenticationStateChanged { add { } remove { } }
|
|
||||||
public abstract System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.AuthenticationState> GetAuthenticationStateAsync();
|
|
||||||
protected void NotifyAuthenticationStateChanged(System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.AuthenticationState> task) { }
|
|
||||||
}
|
|
||||||
public sealed partial class AuthorizeRouteView : Microsoft.AspNetCore.Components.RouteView
|
|
||||||
{
|
|
||||||
public AuthorizeRouteView() { }
|
|
||||||
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
|
||||||
public Microsoft.AspNetCore.Components.RenderFragment Authorizing { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
|
||||||
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
|
||||||
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.AuthenticationState> NotAuthorized { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
|
||||||
protected override void Render(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { }
|
|
||||||
}
|
|
||||||
public partial class AuthorizeView : Microsoft.AspNetCore.Components.AuthorizeViewCore
|
|
||||||
{
|
|
||||||
public AuthorizeView() { }
|
|
||||||
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
|
||||||
public string Policy { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
|
||||||
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
|
||||||
public string Roles { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
|
||||||
protected override Microsoft.AspNetCore.Authorization.IAuthorizeData[] GetAuthorizeData() { throw null; }
|
|
||||||
}
|
|
||||||
public abstract partial class AuthorizeViewCore : Microsoft.AspNetCore.Components.ComponentBase
|
|
||||||
{
|
|
||||||
protected AuthorizeViewCore() { }
|
|
||||||
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
|
||||||
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.AuthenticationState> Authorized { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
|
||||||
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
|
||||||
public Microsoft.AspNetCore.Components.RenderFragment Authorizing { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
|
||||||
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
|
||||||
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.AuthenticationState> ChildContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
|
||||||
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
|
||||||
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.AuthenticationState> NotAuthorized { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
|
||||||
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
|
||||||
public object Resource { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
|
||||||
protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { }
|
|
||||||
protected abstract Microsoft.AspNetCore.Authorization.IAuthorizeData[] GetAuthorizeData();
|
|
||||||
[System.Diagnostics.DebuggerStepThroughAttribute]
|
|
||||||
protected override System.Threading.Tasks.Task OnParametersSetAsync() { throw null; }
|
|
||||||
}
|
|
||||||
public static partial class BindConverter
|
public static partial class BindConverter
|
||||||
{
|
{
|
||||||
public static bool FormatValue(bool value, System.Globalization.CultureInfo culture = null) { throw null; }
|
public static bool FormatValue(bool value, System.Globalization.CultureInfo culture = null) { throw null; }
|
||||||
|
|
@ -99,15 +50,6 @@ namespace Microsoft.AspNetCore.Components
|
||||||
public static bool TryConvertToString(object obj, System.Globalization.CultureInfo culture, out string value) { throw null; }
|
public static bool TryConvertToString(object obj, System.Globalization.CultureInfo culture, out string value) { throw null; }
|
||||||
public static bool TryConvertTo<T>(object obj, System.Globalization.CultureInfo culture, out T value) { throw null; }
|
public static bool TryConvertTo<T>(object obj, System.Globalization.CultureInfo culture, out T value) { throw null; }
|
||||||
}
|
}
|
||||||
public partial class CascadingAuthenticationState : Microsoft.AspNetCore.Components.ComponentBase, System.IDisposable
|
|
||||||
{
|
|
||||||
public CascadingAuthenticationState() { }
|
|
||||||
[Microsoft.AspNetCore.Components.ParameterAttribute]
|
|
||||||
public Microsoft.AspNetCore.Components.RenderFragment ChildContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
|
||||||
protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { }
|
|
||||||
protected override void OnInitialized() { }
|
|
||||||
void System.IDisposable.Dispose() { }
|
|
||||||
}
|
|
||||||
[System.AttributeUsageAttribute(System.AttributeTargets.Property, AllowMultiple=false, Inherited=true)]
|
[System.AttributeUsageAttribute(System.AttributeTargets.Property, AllowMultiple=false, Inherited=true)]
|
||||||
public sealed partial class CascadingParameterAttribute : System.Attribute
|
public sealed partial class CascadingParameterAttribute : System.Attribute
|
||||||
{
|
{
|
||||||
|
|
@ -142,8 +84,8 @@ namespace Microsoft.AspNetCore.Components
|
||||||
void Microsoft.AspNetCore.Components.IComponent.Attach(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { }
|
void Microsoft.AspNetCore.Components.IComponent.Attach(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { }
|
||||||
System.Threading.Tasks.Task Microsoft.AspNetCore.Components.IHandleAfterRender.OnAfterRenderAsync() { throw null; }
|
System.Threading.Tasks.Task Microsoft.AspNetCore.Components.IHandleAfterRender.OnAfterRenderAsync() { throw null; }
|
||||||
System.Threading.Tasks.Task Microsoft.AspNetCore.Components.IHandleEvent.HandleEventAsync(Microsoft.AspNetCore.Components.EventCallbackWorkItem callback, object arg) { throw null; }
|
System.Threading.Tasks.Task Microsoft.AspNetCore.Components.IHandleEvent.HandleEventAsync(Microsoft.AspNetCore.Components.EventCallbackWorkItem callback, object arg) { throw null; }
|
||||||
protected virtual void OnAfterRender() { }
|
protected virtual void OnAfterRender(bool firstRender) { }
|
||||||
protected virtual System.Threading.Tasks.Task OnAfterRenderAsync() { throw null; }
|
protected virtual System.Threading.Tasks.Task OnAfterRenderAsync(bool firstRender) { throw null; }
|
||||||
protected virtual void OnInitialized() { }
|
protected virtual void OnInitialized() { }
|
||||||
protected virtual System.Threading.Tasks.Task OnInitializedAsync() { throw null; }
|
protected virtual System.Threading.Tasks.Task OnInitializedAsync() { throw null; }
|
||||||
protected virtual void OnParametersSet() { }
|
protected virtual void OnParametersSet() { }
|
||||||
|
|
@ -266,10 +208,6 @@ namespace Microsoft.AspNetCore.Components
|
||||||
{
|
{
|
||||||
System.Threading.Tasks.Task HandleEventAsync(Microsoft.AspNetCore.Components.EventCallbackWorkItem item, object arg);
|
System.Threading.Tasks.Task HandleEventAsync(Microsoft.AspNetCore.Components.EventCallbackWorkItem item, object arg);
|
||||||
}
|
}
|
||||||
public partial interface IHostEnvironmentAuthenticationStateProvider
|
|
||||||
{
|
|
||||||
void SetAuthenticationState(System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.AuthenticationState> authenticationStateTask);
|
|
||||||
}
|
|
||||||
[System.AttributeUsageAttribute(System.AttributeTargets.Property, AllowMultiple=false, Inherited=true)]
|
[System.AttributeUsageAttribute(System.AttributeTargets.Property, AllowMultiple=false, Inherited=true)]
|
||||||
public sealed partial class InjectAttribute : System.Attribute
|
public sealed partial class InjectAttribute : System.Attribute
|
||||||
{
|
{
|
||||||
|
|
@ -423,104 +361,14 @@ namespace Microsoft.AspNetCore.Components.CompilerServices
|
||||||
public static T TypeCheck<T>(T value) { throw null; }
|
public static T TypeCheck<T>(T value) { throw null; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
namespace Microsoft.AspNetCore.Components.Forms
|
|
||||||
{
|
|
||||||
public partial class DataAnnotationsValidator : Microsoft.AspNetCore.Components.ComponentBase
|
|
||||||
{
|
|
||||||
public DataAnnotationsValidator() { }
|
|
||||||
protected override void OnInitialized() { }
|
|
||||||
}
|
|
||||||
public sealed partial class EditContext
|
|
||||||
{
|
|
||||||
public EditContext(object model) { }
|
|
||||||
public object Model { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
|
||||||
public event System.EventHandler<Microsoft.AspNetCore.Components.Forms.FieldChangedEventArgs> OnFieldChanged { add { } remove { } }
|
|
||||||
public event System.EventHandler<Microsoft.AspNetCore.Components.Forms.ValidationRequestedEventArgs> OnValidationRequested { add { } remove { } }
|
|
||||||
public event System.EventHandler<Microsoft.AspNetCore.Components.Forms.ValidationStateChangedEventArgs> OnValidationStateChanged { add { } remove { } }
|
|
||||||
public Microsoft.AspNetCore.Components.Forms.FieldIdentifier Field(string fieldName) { throw null; }
|
|
||||||
public System.Collections.Generic.IEnumerable<string> GetValidationMessages() { throw null; }
|
|
||||||
public System.Collections.Generic.IEnumerable<string> GetValidationMessages(Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { throw null; }
|
|
||||||
public System.Collections.Generic.IEnumerable<string> GetValidationMessages(System.Linq.Expressions.Expression<System.Func<object>> accessor) { throw null; }
|
|
||||||
public bool IsModified() { throw null; }
|
|
||||||
public bool IsModified(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { throw null; }
|
|
||||||
public bool IsModified(System.Linq.Expressions.Expression<System.Func<object>> accessor) { throw null; }
|
|
||||||
public void MarkAsUnmodified() { }
|
|
||||||
public void MarkAsUnmodified(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
|
|
||||||
public void NotifyFieldChanged(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
|
|
||||||
public void NotifyValidationStateChanged() { }
|
|
||||||
public bool Validate() { throw null; }
|
|
||||||
}
|
|
||||||
public static partial class EditContextDataAnnotationsExtensions
|
|
||||||
{
|
|
||||||
public static Microsoft.AspNetCore.Components.Forms.EditContext AddDataAnnotationsValidation(this Microsoft.AspNetCore.Components.Forms.EditContext editContext) { throw null; }
|
|
||||||
}
|
|
||||||
public sealed partial class FieldChangedEventArgs : System.EventArgs
|
|
||||||
{
|
|
||||||
public FieldChangedEventArgs(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
|
|
||||||
public Microsoft.AspNetCore.Components.Forms.FieldIdentifier FieldIdentifier { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
|
||||||
}
|
|
||||||
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
|
||||||
public readonly partial struct FieldIdentifier : System.IEquatable<Microsoft.AspNetCore.Components.Forms.FieldIdentifier>
|
|
||||||
{
|
|
||||||
private readonly object _dummy;
|
|
||||||
public FieldIdentifier(object model, string fieldName) { throw null; }
|
|
||||||
public string FieldName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
|
||||||
public object Model { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
|
||||||
public static Microsoft.AspNetCore.Components.Forms.FieldIdentifier Create<TField>(System.Linq.Expressions.Expression<System.Func<TField>> accessor) { throw null; }
|
|
||||||
public bool Equals(Microsoft.AspNetCore.Components.Forms.FieldIdentifier otherIdentifier) { throw null; }
|
|
||||||
public override bool Equals(object obj) { throw null; }
|
|
||||||
public override int GetHashCode() { throw null; }
|
|
||||||
}
|
|
||||||
public sealed partial class ValidationMessageStore
|
|
||||||
{
|
|
||||||
public ValidationMessageStore(Microsoft.AspNetCore.Components.Forms.EditContext editContext) { }
|
|
||||||
public System.Collections.Generic.IEnumerable<string> this[Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier] { get { throw null; } }
|
|
||||||
public System.Collections.Generic.IEnumerable<string> this[System.Linq.Expressions.Expression<System.Func<object>> accessor] { get { throw null; } }
|
|
||||||
public void Add(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier, System.Collections.Generic.IEnumerable<string> messages) { }
|
|
||||||
public void Add(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier, string message) { }
|
|
||||||
public void Add(System.Linq.Expressions.Expression<System.Func<object>> accessor, System.Collections.Generic.IEnumerable<string> messages) { }
|
|
||||||
public void Add(System.Linq.Expressions.Expression<System.Func<object>> accessor, string message) { }
|
|
||||||
public void Clear() { }
|
|
||||||
public void Clear(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
|
|
||||||
public void Clear(System.Linq.Expressions.Expression<System.Func<object>> accessor) { }
|
|
||||||
}
|
|
||||||
public sealed partial class ValidationRequestedEventArgs : System.EventArgs
|
|
||||||
{
|
|
||||||
public static readonly new Microsoft.AspNetCore.Components.Forms.ValidationRequestedEventArgs Empty;
|
|
||||||
public ValidationRequestedEventArgs() { }
|
|
||||||
}
|
|
||||||
public sealed partial class ValidationStateChangedEventArgs : System.EventArgs
|
|
||||||
{
|
|
||||||
public static readonly new Microsoft.AspNetCore.Components.Forms.ValidationStateChangedEventArgs Empty;
|
|
||||||
public ValidationStateChangedEventArgs() { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
namespace Microsoft.AspNetCore.Components.Rendering
|
namespace Microsoft.AspNetCore.Components.Rendering
|
||||||
{
|
{
|
||||||
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
|
||||||
public readonly partial struct ComponentRenderedText
|
|
||||||
{
|
|
||||||
private readonly object _dummy;
|
|
||||||
private readonly int _dummyPrimitive;
|
|
||||||
public int ComponentId { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
|
||||||
public System.Collections.Generic.IEnumerable<string> Tokens { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
|
||||||
}
|
|
||||||
public partial class EventFieldInfo
|
public partial class EventFieldInfo
|
||||||
{
|
{
|
||||||
public EventFieldInfo() { }
|
public EventFieldInfo() { }
|
||||||
public int ComponentId { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
public int ComponentId { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
public object FieldValue { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
public object FieldValue { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
}
|
}
|
||||||
public partial class HtmlRenderer : Microsoft.AspNetCore.Components.Rendering.Renderer
|
|
||||||
{
|
|
||||||
public HtmlRenderer(System.IServiceProvider serviceProvider, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, System.Func<string, string> htmlEncoder) : base (default(System.IServiceProvider), default(Microsoft.Extensions.Logging.ILoggerFactory)) { }
|
|
||||||
public override Microsoft.AspNetCore.Components.Dispatcher Dispatcher { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
|
||||||
protected override void HandleException(System.Exception exception) { }
|
|
||||||
[System.Diagnostics.DebuggerStepThroughAttribute]
|
|
||||||
public System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Rendering.ComponentRenderedText> RenderComponentAsync(System.Type componentType, Microsoft.AspNetCore.Components.ParameterView initialParameters) { throw null; }
|
|
||||||
public System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Rendering.ComponentRenderedText> RenderComponentAsync<TComponent>(Microsoft.AspNetCore.Components.ParameterView initialParameters) where TComponent : Microsoft.AspNetCore.Components.IComponent { throw null; }
|
|
||||||
protected override System.Threading.Tasks.Task UpdateDisplayAsync(in Microsoft.AspNetCore.Components.Rendering.RenderBatch renderBatch) { throw null; }
|
|
||||||
}
|
|
||||||
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
public readonly partial struct RenderBatch
|
public readonly partial struct RenderBatch
|
||||||
{
|
{
|
||||||
|
|
@ -539,6 +387,7 @@ namespace Microsoft.AspNetCore.Components.Rendering
|
||||||
public virtual System.Threading.Tasks.Task DispatchEventAsync(ulong eventHandlerId, Microsoft.AspNetCore.Components.Rendering.EventFieldInfo fieldInfo, System.EventArgs eventArgs) { throw null; }
|
public virtual System.Threading.Tasks.Task DispatchEventAsync(ulong eventHandlerId, Microsoft.AspNetCore.Components.Rendering.EventFieldInfo fieldInfo, System.EventArgs eventArgs) { throw null; }
|
||||||
public void Dispose() { }
|
public void Dispose() { }
|
||||||
protected virtual void Dispose(bool disposing) { }
|
protected virtual void Dispose(bool disposing) { }
|
||||||
|
protected Microsoft.AspNetCore.Components.RenderTree.ArrayRange<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame> GetCurrentRenderTreeFrames(int componentId) { throw null; }
|
||||||
protected abstract void HandleException(System.Exception exception);
|
protected abstract void HandleException(System.Exception exception);
|
||||||
protected Microsoft.AspNetCore.Components.IComponent InstantiateComponent(System.Type componentType) { throw null; }
|
protected Microsoft.AspNetCore.Components.IComponent InstantiateComponent(System.Type componentType) { throw null; }
|
||||||
protected virtual void ProcessPendingRender() { }
|
protected virtual void ProcessPendingRender() { }
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ namespace Microsoft.AspNetCore.Components
|
||||||
private bool _initialized;
|
private bool _initialized;
|
||||||
private bool _hasNeverRendered = true;
|
private bool _hasNeverRendered = true;
|
||||||
private bool _hasPendingQueuedRender;
|
private bool _hasPendingQueuedRender;
|
||||||
|
private bool _hasCalledOnAfterRender;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructs an instance of <see cref="ComponentBase"/>.
|
/// Constructs an instance of <see cref="ComponentBase"/>.
|
||||||
|
|
@ -129,7 +130,17 @@ namespace Microsoft.AspNetCore.Components
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Method invoked after each time the component has been rendered.
|
/// Method invoked after each time the component has been rendered.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected virtual void OnAfterRender()
|
/// <param name="firstRender">
|
||||||
|
/// Set to <c>true</c> if this is the first time <see cref="OnAfterRender(bool)"/> has been invoked
|
||||||
|
/// on this component instance; otherwise <c>false</c>.
|
||||||
|
/// </param>
|
||||||
|
/// <remarks>
|
||||||
|
/// The <see cref="OnAfterRender(bool)"/> and <see cref="OnAfterRenderAsync(bool)"/> lifecycle methods
|
||||||
|
/// are useful for performing interop, or interacting with values recieved from <c>@ref</c>.
|
||||||
|
/// Use the <paramref name="firstRender"/> parameter to ensure that initialization work is only performed
|
||||||
|
/// once.
|
||||||
|
/// </remarks>
|
||||||
|
protected virtual void OnAfterRender(bool firstRender)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -138,8 +149,18 @@ namespace Microsoft.AspNetCore.Components
|
||||||
/// not automatically re-render after the completion of any returned <see cref="Task"/>, because
|
/// not automatically re-render after the completion of any returned <see cref="Task"/>, because
|
||||||
/// that would cause an infinite render loop.
|
/// that would cause an infinite render loop.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="firstRender">
|
||||||
|
/// Set to <c>true</c> if this is the first time <see cref="OnAfterRender(bool)"/> has been invoked
|
||||||
|
/// on this component instance; otherwise <c>false</c>.
|
||||||
|
/// </param>
|
||||||
/// <returns>A <see cref="Task"/> representing any asynchronous operation.</returns>
|
/// <returns>A <see cref="Task"/> representing any asynchronous operation.</returns>
|
||||||
protected virtual Task OnAfterRenderAsync()
|
/// <remarks>
|
||||||
|
/// The <see cref="OnAfterRender(bool)"/> and <see cref="OnAfterRenderAsync(bool)"/> lifecycle methods
|
||||||
|
/// are useful for performing interop, or interacting with values recieved from <c>@ref</c>.
|
||||||
|
/// Use the <paramref name="firstRender"/> parameter to ensure that initialization work is only performed
|
||||||
|
/// once.
|
||||||
|
/// </remarks>
|
||||||
|
protected virtual Task OnAfterRenderAsync(bool firstRender)
|
||||||
=> Task.CompletedTask;
|
=> Task.CompletedTask;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -298,9 +319,12 @@ namespace Microsoft.AspNetCore.Components
|
||||||
|
|
||||||
Task IHandleAfterRender.OnAfterRenderAsync()
|
Task IHandleAfterRender.OnAfterRenderAsync()
|
||||||
{
|
{
|
||||||
OnAfterRender();
|
var firstRender = !_hasCalledOnAfterRender;
|
||||||
|
_hasCalledOnAfterRender |= true;
|
||||||
|
|
||||||
return OnAfterRenderAsync();
|
OnAfterRender(firstRender);
|
||||||
|
|
||||||
|
return OnAfterRenderAsync(firstRender);
|
||||||
|
|
||||||
// Note that we don't call StateHasChanged to trigger a render after
|
// Note that we don't call StateHasChanged to trigger a render after
|
||||||
// handling this, because that would be an infinite loop. The only
|
// handling this, because that would be an infinite loop. The only
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.Razor">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFrameworks>netstandard2.0;netcoreapp3.0</TargetFrameworks>
|
||||||
|
<TargetFrameworks Condition="'$(DotNetBuildFromSource)' == 'true'">netcoreapp3.0</TargetFrameworks>
|
||||||
<Description>Components feature for ASP.NET Core.</Description>
|
<Description>Components feature for ASP.NET Core.</Description>
|
||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
<IsShippingPackage>true</IsShippingPackage>
|
<IsShippingPackage>true</IsShippingPackage>
|
||||||
<IsAspNetCoreApp>true</IsAspNetCoreApp>
|
<IsAspNetCoreApp>true</IsAspNetCoreApp>
|
||||||
<RazorLangVersion>3.0</RazorLangVersion>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
@ -15,9 +15,9 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="Microsoft.AspNetCore.Authorization" />
|
|
||||||
<Reference Include="Microsoft.JSInterop" />
|
<Reference Include="Microsoft.JSInterop" />
|
||||||
<Reference Include="System.ComponentModel.Annotations" />
|
<Reference Include="Microsoft.Extensions.Logging.Abstractions" />
|
||||||
|
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="_GetNuspecDependencyPackageVersions">
|
<Target Name="_GetNuspecDependencyPackageVersions">
|
||||||
|
|
@ -34,15 +34,17 @@
|
||||||
|
|
||||||
<!-- Pack settings -->
|
<!-- Pack settings -->
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<NuspecFile>Microsoft.AspNetCore.Components.nuspec</NuspecFile>
|
<NuspecFile>Microsoft.AspNetCore.Components.multitarget.nuspec</NuspecFile>
|
||||||
|
<NuspecFile Condition="'$(DotNetBuildFromSource)' == 'true'">Microsoft.AspNetCore.Components.netcoreapp3.0.nuspec</NuspecFile>
|
||||||
<GenerateNuspecDependsOn>$(GenerateNuspecDependsOn);_GetNuspecDependencyPackageVersions</GenerateNuspecDependsOn>
|
<GenerateNuspecDependsOn>$(GenerateNuspecDependsOn);_GetNuspecDependencyPackageVersions</GenerateNuspecDependsOn>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<NuspecProperty Include="jsInteropPackageVersion=$(MicrosoftJSInteropPackageVersion)" />
|
<NuspecProperty Include="jsInteropPackageVersion=$(MicrosoftJSInteropPackageVersion)" />
|
||||||
<NuspecProperty Include="systemComponentModelAnnotationsPackageVersion=$(SystemComponentModelAnnotationsPackageVersion)" />
|
<NuspecProperty Condition="'$(DotNetBuildFromSource)' != 'true'" Include="systemComponentModelAnnotationsPackageVersion=$(SystemComponentModelAnnotationsPackageVersion)" />
|
||||||
<NuspecProperty Include="outputPath=$(OutputPath)" />
|
<NuspecProperty Include="OutputBinary=$(MSBuildProjectDirectory)\$(OutputPath)**\$(AssemblyName).dll" />
|
||||||
<NuspecProperty Include="assemblyName=$(AssemblyName)" />
|
<NuspecProperty Include="OutputSymbol=$(MSBuildProjectDirectory)\$(OutputPath)**\$(AssemblyName).pdb" />
|
||||||
|
<NuspecProperty Include="OutputDocumentation=$(MSBuildProjectDirectory)\$(OutputPath)**\$(AssemblyName).xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -9,12 +9,17 @@
|
||||||
<dependency id="Microsoft.JSInterop" version="$jsInteropPackageVersion$" exclude="Build,Analyzers" />
|
<dependency id="Microsoft.JSInterop" version="$jsInteropPackageVersion$" exclude="Build,Analyzers" />
|
||||||
<dependency id="System.ComponentModel.Annotations" version="$systemComponentModelAnnotationsPackageVersion$" exclude="Build,Analyzers" />
|
<dependency id="System.ComponentModel.Annotations" version="$systemComponentModelAnnotationsPackageVersion$" exclude="Build,Analyzers" />
|
||||||
</group>
|
</group>
|
||||||
|
<group targetFramework=".NETCoreApp3.0">
|
||||||
|
<dependency id="Microsoft.AspNetCore.Components.Analyzers" version="$componentAnalyzerPackageVersion$" />
|
||||||
|
<dependency id="Microsoft.AspNetCore.Authorization" version="$authorizationPackageVersion$" exclude="Build,Analyzers" />
|
||||||
|
<dependency id="Microsoft.JSInterop" version="$jsInteropPackageVersion$" exclude="Build,Analyzers" />
|
||||||
|
</group>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</metadata>
|
</metadata>
|
||||||
<files>
|
<files>
|
||||||
<file src="$outputPath$$assemblyName$.dll" target="lib\netstandard2.0\$assemblyname$.dll" />
|
<file src="$OutputBinary$" target="lib\" />
|
||||||
<file src="$outputPath$$assemblyName$.xml" target="lib\netstandard2.0\$assemblyname$.xml" />
|
<file src="$OutputDocumentation$" target="lib\" />
|
||||||
<file src="$outputPath$$assemblyName$.pdb" target="lib\netstandard2.0\$assemblyname$.pdb" />
|
<file src="$OutputSymbol$" target="lib\" />
|
||||||
<file src="..\..\THIRD-PARTY-NOTICES.txt" target=".\THIRD-PARTY-NOTICES.txt" />
|
<file src="..\..\THIRD-PARTY-NOTICES.txt" target=".\THIRD-PARTY-NOTICES.txt" />
|
||||||
</files>
|
</files>
|
||||||
</package>
|
</package>
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
|
||||||
|
<metadata>
|
||||||
|
$CommonMetadataElements$
|
||||||
|
<dependencies>
|
||||||
|
<group targetFramework=".NETCoreApp3.0">
|
||||||
|
<dependency id="Microsoft.AspNetCore.Components.Analyzers" version="$componentAnalyzerPackageVersion$" />
|
||||||
|
<dependency id="Microsoft.AspNetCore.Authorization" version="$authorizationPackageVersion$" exclude="Build,Analyzers" />
|
||||||
|
<dependency id="Microsoft.JSInterop" version="$jsInteropPackageVersion$" exclude="Build,Analyzers" />
|
||||||
|
</group>
|
||||||
|
</dependencies>
|
||||||
|
</metadata>
|
||||||
|
<files>
|
||||||
|
<file src="$OutputBinary$" target="lib\" />
|
||||||
|
<file src="$OutputDocumentation$" target="lib\" />
|
||||||
|
<file src="$OutputSymbol$" target="lib\" />
|
||||||
|
<file src="..\..\THIRD-PARTY-NOTICES.txt" target=".\THIRD-PARTY-NOTICES.txt" />
|
||||||
|
</files>
|
||||||
|
</package>
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Blazor.Build.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Blazor.Build.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Components.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Components.Authorization.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Components.Web.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Components.Forms.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Components.Performance, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Components.Performance, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Components.Server.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Components.Server.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
|
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Components.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
|
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Components.Web.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
[assembly: InternalsVisibleTo("Ignitor, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
[assembly: InternalsVisibleTo("Ignitor, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
[assembly: InternalsVisibleTo("Ignitor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
[assembly: InternalsVisibleTo("Ignitor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
|
||||||
|
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components.Rendering
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Represents the result of rendering a component into static html.
|
|
||||||
/// </summary>
|
|
||||||
public readonly struct ComponentRenderedText
|
|
||||||
{
|
|
||||||
internal ComponentRenderedText(int componentId, IEnumerable<string> tokens)
|
|
||||||
{
|
|
||||||
ComponentId = componentId;
|
|
||||||
Tokens = tokens;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the id associated with the component.
|
|
||||||
/// </summary>
|
|
||||||
public int ComponentId { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the sequence of tokens that when concatenated represent the html for the rendered component.
|
|
||||||
/// </summary>
|
|
||||||
public IEnumerable<string> Tokens { get; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -75,16 +75,24 @@ namespace Microsoft.AspNetCore.Components.Rendering
|
||||||
batchBuilder.UpdatedComponentDiffs.Append(diff);
|
batchBuilder.UpdatedComponentDiffs.Append(diff);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DisposeInBatch(RenderBatchBuilder batchBuilder)
|
public bool TryDisposeInBatch(RenderBatchBuilder batchBuilder, out Exception exception)
|
||||||
{
|
{
|
||||||
_componentWasDisposed = true;
|
_componentWasDisposed = true;
|
||||||
|
exception = null;
|
||||||
|
|
||||||
// TODO: Handle components throwing during dispose. Shouldn't break the whole render batch.
|
try
|
||||||
if (Component is IDisposable disposable)
|
|
||||||
{
|
{
|
||||||
disposable.Dispose();
|
if (Component is IDisposable disposable)
|
||||||
|
{
|
||||||
|
disposable.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
exception = ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We don't expect these things to throw.
|
||||||
RenderTreeDiffBuilder.DisposeFrames(batchBuilder, CurrentRenderTree.GetFrames());
|
RenderTreeDiffBuilder.DisposeFrames(batchBuilder, CurrentRenderTree.GetFrames());
|
||||||
|
|
||||||
if (_hasAnyCascadingParameterSubscriptions)
|
if (_hasAnyCascadingParameterSubscriptions)
|
||||||
|
|
@ -93,13 +101,27 @@ namespace Microsoft.AspNetCore.Components.Rendering
|
||||||
}
|
}
|
||||||
|
|
||||||
DisposeBuffers();
|
DisposeBuffers();
|
||||||
|
|
||||||
|
return exception == null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Callers expect this method to always return a faulted task.
|
||||||
public Task NotifyRenderCompletedAsync()
|
public Task NotifyRenderCompletedAsync()
|
||||||
{
|
{
|
||||||
if (Component is IHandleAfterRender handlerAfterRender)
|
if (Component is IHandleAfterRender handlerAfterRender)
|
||||||
{
|
{
|
||||||
return handlerAfterRender.OnAfterRenderAsync();
|
try
|
||||||
|
{
|
||||||
|
return handlerAfterRender.OnAfterRenderAsync();
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException cex)
|
||||||
|
{
|
||||||
|
return Task.FromCanceled(cex.CancellationToken);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return Task.FromException(ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ namespace Microsoft.AspNetCore.Components.Rendering
|
||||||
private bool _isBatchInProgress;
|
private bool _isBatchInProgress;
|
||||||
private ulong _lastEventHandlerId;
|
private ulong _lastEventHandlerId;
|
||||||
private List<Task> _pendingTasks;
|
private List<Task> _pendingTasks;
|
||||||
|
private bool _disposed;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Allows the caller to handle exceptions from the SynchronizationContext when one is available.
|
/// Allows the caller to handle exceptions from the SynchronizationContext when one is available.
|
||||||
|
|
@ -93,7 +94,7 @@ namespace Microsoft.AspNetCore.Components.Rendering
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="componentId">The id for the component.</param>
|
/// <param name="componentId">The id for the component.</param>
|
||||||
/// <returns>The <see cref="RenderTreeBuilder"/> representing the current render tree.</returns>
|
/// <returns>The <see cref="RenderTreeBuilder"/> representing the current render tree.</returns>
|
||||||
private protected ArrayRange<RenderTreeFrame> GetCurrentRenderTreeFrames(int componentId) => GetRequiredComponentState(componentId).CurrentRenderTree.GetFrames();
|
protected ArrayRange<RenderTreeFrame> GetCurrentRenderTreeFrames(int componentId) => GetRequiredComponentState(componentId).CurrentRenderTree.GetFrames();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Performs the first render for a root component, waiting for this component and all
|
/// Performs the first render for a root component, waiting for this component and all
|
||||||
|
|
@ -403,6 +404,11 @@ namespace Microsoft.AspNetCore.Components.Rendering
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected virtual void ProcessPendingRender()
|
protected virtual void ProcessPendingRender()
|
||||||
{
|
{
|
||||||
|
if (_disposed)
|
||||||
|
{
|
||||||
|
throw new ObjectDisposedException(nameof(Renderer), "Cannot process pending renders after the renderer has been disposed.");
|
||||||
|
}
|
||||||
|
|
||||||
ProcessRenderQueue();
|
ProcessRenderQueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -587,16 +593,31 @@ namespace Microsoft.AspNetCore.Components.Rendering
|
||||||
Log.RenderingComponent(_logger, componentState);
|
Log.RenderingComponent(_logger, componentState);
|
||||||
componentState.RenderIntoBatch(_batchBuilder, renderQueueEntry.RenderFragment);
|
componentState.RenderIntoBatch(_batchBuilder, renderQueueEntry.RenderFragment);
|
||||||
|
|
||||||
|
List<Exception> exceptions = null;
|
||||||
|
|
||||||
// Process disposal queue now in case it causes further component renders to be enqueued
|
// Process disposal queue now in case it causes further component renders to be enqueued
|
||||||
while (_batchBuilder.ComponentDisposalQueue.Count > 0)
|
while (_batchBuilder.ComponentDisposalQueue.Count > 0)
|
||||||
{
|
{
|
||||||
var disposeComponentId = _batchBuilder.ComponentDisposalQueue.Dequeue();
|
var disposeComponentId = _batchBuilder.ComponentDisposalQueue.Dequeue();
|
||||||
var disposeComponentState = GetRequiredComponentState(disposeComponentId);
|
var disposeComponentState = GetRequiredComponentState(disposeComponentId);
|
||||||
Log.DisposingComponent(_logger, disposeComponentState);
|
Log.DisposingComponent(_logger, disposeComponentState);
|
||||||
disposeComponentState.DisposeInBatch(_batchBuilder);
|
if (!disposeComponentState.TryDisposeInBatch(_batchBuilder, out var exception))
|
||||||
|
{
|
||||||
|
exceptions ??= new List<Exception>();
|
||||||
|
exceptions.Add(exception);
|
||||||
|
}
|
||||||
_componentStateById.Remove(disposeComponentId);
|
_componentStateById.Remove(disposeComponentId);
|
||||||
_batchBuilder.DisposedComponentIds.Append(disposeComponentId);
|
_batchBuilder.DisposedComponentIds.Append(disposeComponentId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (exceptions?.Count > 1)
|
||||||
|
{
|
||||||
|
HandleException(new AggregateException("Exceptions were encountered while disposing components.", exceptions));
|
||||||
|
}
|
||||||
|
else if (exceptions?.Count == 1)
|
||||||
|
{
|
||||||
|
HandleException(exceptions[0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RemoveEventHandlerIds(ArrayRange<ulong> eventHandlerIds, Task afterTaskIgnoreErrors)
|
private void RemoveEventHandlerIds(ArrayRange<ulong> eventHandlerIds, Task afterTaskIgnoreErrors)
|
||||||
|
|
@ -681,6 +702,11 @@ namespace Microsoft.AspNetCore.Components.Rendering
|
||||||
/// <param name="disposing"><see langword="true"/> if this method is being invoked by <see cref="IDisposable.Dispose"/>, otherwise <see langword="false"/>.</param>
|
/// <param name="disposing"><see langword="true"/> if this method is being invoked by <see cref="IDisposable.Dispose"/>, otherwise <see langword="false"/>.</param>
|
||||||
protected virtual void Dispose(bool disposing)
|
protected virtual void Dispose(bool disposing)
|
||||||
{
|
{
|
||||||
|
_disposed = true;
|
||||||
|
|
||||||
|
// It's important that we handle all exceptions here before reporting any of them.
|
||||||
|
// This way we can dispose all components before an error handler kicks in.
|
||||||
|
List<Exception> exceptions = null;
|
||||||
foreach (var componentState in _componentStateById.Values)
|
foreach (var componentState in _componentStateById.Values)
|
||||||
{
|
{
|
||||||
Log.DisposingComponent(_logger, componentState);
|
Log.DisposingComponent(_logger, componentState);
|
||||||
|
|
@ -693,11 +719,22 @@ namespace Microsoft.AspNetCore.Components.Rendering
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
HandleException(exception);
|
exceptions ??= new List<Exception>();
|
||||||
|
exceptions.Add(exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_batchBuilder.Dispose();
|
_componentStateById.Clear(); // So we know they were all disposed
|
||||||
|
_batchBuilder.Dispose();
|
||||||
|
|
||||||
|
if (exceptions?.Count > 1)
|
||||||
|
{
|
||||||
|
HandleException(new AggregateException("Exceptions were encountered while disposing components.", exceptions));
|
||||||
|
}
|
||||||
|
else if (exceptions?.Count == 1)
|
||||||
|
{
|
||||||
|
HandleException(exceptions[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Reflection.Metadata.Ecma335;
|
||||||
|
using System.Runtime.ExceptionServices;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Components.Rendering;
|
using Microsoft.AspNetCore.Components.Rendering;
|
||||||
|
|
@ -261,6 +263,98 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
Assert.Equal(2, renderer.Batches.Count);
|
Assert.Equal(2, renderer.Batches.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task RunsOnAfterRender_AfterRenderingCompletes()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var renderer = new TestRenderer();
|
||||||
|
var component = new TestComponent() { Counter = 1 };
|
||||||
|
|
||||||
|
var onAfterRenderCompleted = false;
|
||||||
|
component.OnAfterRenderLogic = (c, firstRender) =>
|
||||||
|
{
|
||||||
|
Assert.True(firstRender);
|
||||||
|
Assert.Single(renderer.Batches);
|
||||||
|
onAfterRenderCompleted = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var componentId = renderer.AssignRootComponentId(component);
|
||||||
|
var renderTask = renderer.RenderRootComponentAsync(componentId);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
await renderTask;
|
||||||
|
Assert.True(onAfterRenderCompleted);
|
||||||
|
|
||||||
|
// Component should not be rendered again. OnAfterRender doesn't do that.
|
||||||
|
Assert.Single(renderer.Batches);
|
||||||
|
|
||||||
|
// Act: Render again!
|
||||||
|
onAfterRenderCompleted = false;
|
||||||
|
component.OnAfterRenderLogic = (c, firstRender) =>
|
||||||
|
{
|
||||||
|
Assert.False(firstRender);
|
||||||
|
Assert.Equal(2, renderer.Batches.Count);
|
||||||
|
onAfterRenderCompleted = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
renderTask = renderer.RenderRootComponentAsync(componentId);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.True(onAfterRenderCompleted);
|
||||||
|
Assert.Equal(2, renderer.Batches.Count);
|
||||||
|
await renderTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task RunsOnAfterRenderAsync_AfterRenderingCompletes()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var renderer = new TestRenderer();
|
||||||
|
var component = new TestComponent() { Counter = 1 };
|
||||||
|
|
||||||
|
var onAfterRenderCompleted = false;
|
||||||
|
var tcs = new TaskCompletionSource<object>();
|
||||||
|
component.OnAfterRenderAsyncLogic = async (c, firstRender) =>
|
||||||
|
{
|
||||||
|
Assert.True(firstRender);
|
||||||
|
Assert.Single(renderer.Batches);
|
||||||
|
onAfterRenderCompleted = true;
|
||||||
|
await tcs.Task;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var componentId = renderer.AssignRootComponentId(component);
|
||||||
|
var renderTask = renderer.RenderRootComponentAsync(componentId);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
tcs.SetResult(null);
|
||||||
|
await renderTask;
|
||||||
|
Assert.True(onAfterRenderCompleted);
|
||||||
|
|
||||||
|
// Component should not be rendered again. OnAfterRenderAsync doesn't do that.
|
||||||
|
Assert.Single(renderer.Batches);
|
||||||
|
|
||||||
|
// Act: Render again!
|
||||||
|
onAfterRenderCompleted = false;
|
||||||
|
tcs = new TaskCompletionSource<object>();
|
||||||
|
component.OnAfterRenderAsyncLogic = async (c, firstRender) =>
|
||||||
|
{
|
||||||
|
Assert.False(firstRender);
|
||||||
|
Assert.Equal(2, renderer.Batches.Count);
|
||||||
|
onAfterRenderCompleted = true;
|
||||||
|
await tcs.Task;
|
||||||
|
};
|
||||||
|
|
||||||
|
renderTask = renderer.RenderRootComponentAsync(componentId);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
tcs.SetResult(null);
|
||||||
|
await renderTask;
|
||||||
|
Assert.True(onAfterRenderCompleted);
|
||||||
|
Assert.Equal(2, renderer.Batches.Count);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task DoesNotRenderAfterOnInitAsyncTaskIsCancelledUsingCancellationToken()
|
public async Task DoesNotRenderAfterOnInitAsyncTaskIsCancelledUsingCancellationToken()
|
||||||
{
|
{
|
||||||
|
|
@ -386,6 +480,10 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
|
|
||||||
public bool RunsBaseOnParametersSetAsync { get; set; } = true;
|
public bool RunsBaseOnParametersSetAsync { get; set; } = true;
|
||||||
|
|
||||||
|
public bool RunsBaseOnAfterRender { get; set; } = true;
|
||||||
|
|
||||||
|
public bool RunsBaseOnAfterRenderAsync { get; set; } = true;
|
||||||
|
|
||||||
public Action<TestComponent> OnInitLogic { get; set; }
|
public Action<TestComponent> OnInitLogic { get; set; }
|
||||||
|
|
||||||
public Func<TestComponent, Task> OnInitAsyncLogic { get; set; }
|
public Func<TestComponent, Task> OnInitAsyncLogic { get; set; }
|
||||||
|
|
@ -394,6 +492,10 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
|
|
||||||
public Func<TestComponent, Task> OnParametersSetAsyncLogic { get; set; }
|
public Func<TestComponent, Task> OnParametersSetAsyncLogic { get; set; }
|
||||||
|
|
||||||
|
public Action<TestComponent, bool> OnAfterRenderLogic { get; set; }
|
||||||
|
|
||||||
|
public Func<TestComponent, bool, Task> OnAfterRenderAsyncLogic { get; set; }
|
||||||
|
|
||||||
public int Counter { get; set; }
|
public int Counter { get; set; }
|
||||||
|
|
||||||
protected override void BuildRenderTree(RenderTreeBuilder builder)
|
protected override void BuildRenderTree(RenderTreeBuilder builder)
|
||||||
|
|
@ -448,6 +550,32 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
await OnParametersSetAsyncLogic(this);
|
await OnParametersSetAsyncLogic(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void OnAfterRender(bool firstRender)
|
||||||
|
{
|
||||||
|
if (RunsBaseOnAfterRender)
|
||||||
|
{
|
||||||
|
base.OnAfterRender(firstRender);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OnAfterRenderLogic != null)
|
||||||
|
{
|
||||||
|
OnAfterRenderLogic(this, firstRender);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||||
|
{
|
||||||
|
if (RunsBaseOnAfterRenderAsync)
|
||||||
|
{
|
||||||
|
await base.OnAfterRenderAsync(firstRender);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OnAfterRenderAsyncLogic != null)
|
||||||
|
{
|
||||||
|
await OnAfterRenderAsyncLogic(this, firstRender);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2046,6 +2046,127 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
Assert.Equal(2, renderer.Batches.Count);
|
Assert.Equal(2, renderer.Batches.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void RenderBatch_HandlesExceptionsFromAllDisposedComponents()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var renderer = new TestRenderer { ShouldHandleExceptions = true };
|
||||||
|
var exception1 = new Exception();
|
||||||
|
var exception2 = new Exception();
|
||||||
|
|
||||||
|
var firstRender = true;
|
||||||
|
var component = new TestComponent(builder =>
|
||||||
|
{
|
||||||
|
if (firstRender)
|
||||||
|
{
|
||||||
|
builder.AddContent(0, "Hello");
|
||||||
|
builder.OpenComponent<DisposableComponent>(1);
|
||||||
|
builder.AddAttribute(1, nameof(DisposableComponent.DisposeAction), (Action)(() => throw exception1));
|
||||||
|
builder.CloseComponent();
|
||||||
|
|
||||||
|
builder.OpenComponent<DisposableComponent>(2);
|
||||||
|
builder.AddAttribute(1, nameof(DisposableComponent.DisposeAction), (Action)(() => throw exception2));
|
||||||
|
builder.CloseComponent();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var componentId = renderer.AssignRootComponentId(component);
|
||||||
|
component.TriggerRender();
|
||||||
|
|
||||||
|
// Act: Second render
|
||||||
|
firstRender = false;
|
||||||
|
component.TriggerRender();
|
||||||
|
|
||||||
|
// Assert: Applicable children are included in disposal list
|
||||||
|
Assert.Equal(2, renderer.Batches.Count);
|
||||||
|
Assert.Equal(new[] { 1, 2 }, renderer.Batches[1].DisposedComponentIDs);
|
||||||
|
|
||||||
|
// Outer component is still alive and not disposed.
|
||||||
|
Assert.False(component.Disposed);
|
||||||
|
var aex = Assert.IsType<AggregateException>(Assert.Single(renderer.HandledExceptions));
|
||||||
|
Assert.Contains(exception1, aex.InnerExceptions);
|
||||||
|
Assert.Contains(exception2, aex.InnerExceptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void RenderBatch_DoesNotDisposeComponentMultipleTimes()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var renderer = new TestRenderer { ShouldHandleExceptions = true };
|
||||||
|
var exception1 = new Exception();
|
||||||
|
var exception2 = new Exception();
|
||||||
|
|
||||||
|
var count1 = 0;
|
||||||
|
var count2 = 0;
|
||||||
|
var count3 = 0;
|
||||||
|
var count4 = 0;
|
||||||
|
var count5 = 0;
|
||||||
|
|
||||||
|
var firstRender = true;
|
||||||
|
var component = new TestComponent(builder =>
|
||||||
|
{
|
||||||
|
if (firstRender)
|
||||||
|
{
|
||||||
|
builder.AddContent(0, "Hello");
|
||||||
|
builder.OpenComponent<DisposableComponent>(1);
|
||||||
|
builder.AddAttribute(1, nameof(DisposableComponent.DisposeAction), (Action)(() => { count1++; }));
|
||||||
|
builder.CloseComponent();
|
||||||
|
|
||||||
|
builder.OpenComponent<DisposableComponent>(2);
|
||||||
|
builder.AddAttribute(1, nameof(DisposableComponent.DisposeAction), (Action)(() => { count2++; throw exception1; }));
|
||||||
|
builder.CloseComponent();
|
||||||
|
|
||||||
|
builder.OpenComponent<DisposableComponent>(3);
|
||||||
|
builder.AddAttribute(1, nameof(DisposableComponent.DisposeAction), (Action)(() => { count3++; }));
|
||||||
|
builder.CloseComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.OpenComponent<DisposableComponent>(4);
|
||||||
|
builder.AddAttribute(1, nameof(DisposableComponent.DisposeAction), (Action)(() => { count4++; throw exception2; }));
|
||||||
|
builder.CloseComponent();
|
||||||
|
|
||||||
|
builder.OpenComponent<DisposableComponent>(5);
|
||||||
|
builder.AddAttribute(1, nameof(DisposableComponent.DisposeAction), (Action)(() => { count5++; }));
|
||||||
|
builder.CloseComponent();
|
||||||
|
});
|
||||||
|
var componentId = renderer.AssignRootComponentId(component);
|
||||||
|
component.TriggerRender();
|
||||||
|
|
||||||
|
// Act: Second render
|
||||||
|
firstRender = false;
|
||||||
|
component.TriggerRender();
|
||||||
|
|
||||||
|
// Assert: Applicable children are included in disposal list
|
||||||
|
Assert.Equal(2, renderer.Batches.Count);
|
||||||
|
Assert.Equal(new[] { 1, 2, 3 }, renderer.Batches[1].DisposedComponentIDs);
|
||||||
|
|
||||||
|
// Components "disposed" in the batch were all disposed, components that are still live were not disposed
|
||||||
|
Assert.Equal(1, count1);
|
||||||
|
Assert.Equal(1, count2);
|
||||||
|
Assert.Equal(1, count3);
|
||||||
|
Assert.Equal(0, count4);
|
||||||
|
Assert.Equal(0, count5);
|
||||||
|
|
||||||
|
// Outer component is still alive and not disposed.
|
||||||
|
Assert.False(component.Disposed);
|
||||||
|
var ex = Assert.IsType<Exception>(Assert.Single(renderer.HandledExceptions));
|
||||||
|
Assert.Same(exception1, ex);
|
||||||
|
|
||||||
|
// Act: Dispose renderer
|
||||||
|
renderer.Dispose();
|
||||||
|
|
||||||
|
Assert.Equal(2, renderer.HandledExceptions.Count);
|
||||||
|
ex = renderer.HandledExceptions[1];
|
||||||
|
Assert.Same(exception2, ex);
|
||||||
|
|
||||||
|
// Assert: Everything was disposed once.
|
||||||
|
Assert.Equal(1, count1);
|
||||||
|
Assert.Equal(1, count2);
|
||||||
|
Assert.Equal(1, count3);
|
||||||
|
Assert.Equal(1, count4);
|
||||||
|
Assert.Equal(1, count5);
|
||||||
|
Assert.True(component.Disposed);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task DisposesEventHandlersWhenAttributeValueChanged()
|
public async Task DisposesEventHandlersWhenAttributeValueChanged()
|
||||||
{
|
{
|
||||||
|
|
@ -2431,7 +2552,7 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
.ComponentId;
|
.ComponentId;
|
||||||
var origEventHandlerId = renderer.Batches.Single()
|
var origEventHandlerId = renderer.Batches.Single()
|
||||||
.ReferenceFrames
|
.ReferenceFrames
|
||||||
.Where(f => f.FrameType == RenderTreeFrameType.Attribute && f.AttributeName == "onclick")
|
.Where(f => f.FrameType == RenderTreeFrameType.Attribute && f.AttributeName == "onmycustomevent")
|
||||||
.Single(f => f.AttributeEventHandlerId != 0)
|
.Single(f => f.AttributeEventHandlerId != 0)
|
||||||
.AttributeEventHandlerId;
|
.AttributeEventHandlerId;
|
||||||
|
|
||||||
|
|
@ -3059,7 +3180,7 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task ExceptionsThrownFromHandleAfterRender_AreHandled()
|
public async Task ExceptionsThrownFromHandleAfterRender_Sync_AreHandled()
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var renderer = new TestRenderer { ShouldHandleExceptions = true };
|
var renderer = new TestRenderer { ShouldHandleExceptions = true };
|
||||||
|
|
@ -3078,7 +3199,7 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
{
|
{
|
||||||
new NestedAsyncComponent.ExecutionAction
|
new NestedAsyncComponent.ExecutionAction
|
||||||
{
|
{
|
||||||
Event = NestedAsyncComponent.EventType.OnAfterRenderAsync,
|
Event = NestedAsyncComponent.EventType.OnAfterRenderAsyncSync,
|
||||||
EventAction = () =>
|
EventAction = () =>
|
||||||
{
|
{
|
||||||
throw exception;
|
throw exception;
|
||||||
|
|
@ -3089,12 +3210,11 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
{
|
{
|
||||||
new NestedAsyncComponent.ExecutionAction
|
new NestedAsyncComponent.ExecutionAction
|
||||||
{
|
{
|
||||||
Event = NestedAsyncComponent.EventType.OnAfterRenderAsync,
|
Event = NestedAsyncComponent.EventType.OnAfterRenderAsyncSync,
|
||||||
EventAction = async () =>
|
EventAction = () =>
|
||||||
{
|
{
|
||||||
await Task.Yield();
|
|
||||||
taskCompletionSource.TrySetResult(0);
|
taskCompletionSource.TrySetResult(0);
|
||||||
return (1, NestedAsyncComponent.EventType.OnAfterRenderAsync);
|
return Task.FromResult((1, NestedAsyncComponent.EventType.OnAfterRenderAsyncSync));
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3113,6 +3233,137 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
Assert.Same(exception, Assert.Single(renderer.HandledExceptions).GetBaseException());
|
Assert.Same(exception, Assert.Single(renderer.HandledExceptions).GetBaseException());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task ExceptionsThrownFromHandleAfterRender_Async_AreHandled()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var renderer = new TestRenderer { ShouldHandleExceptions = true };
|
||||||
|
var component = new NestedAsyncComponent();
|
||||||
|
var exception = new InvalidTimeZoneException();
|
||||||
|
|
||||||
|
var taskCompletionSource = new TaskCompletionSource<int>();
|
||||||
|
|
||||||
|
// Act/Assert
|
||||||
|
var componentId = renderer.AssignRootComponentId(component);
|
||||||
|
var renderTask = renderer.RenderRootComponentAsync(componentId, ParameterView.FromDictionary(new Dictionary<string, object>
|
||||||
|
{
|
||||||
|
[nameof(NestedAsyncComponent.EventActions)] = new Dictionary<int, IList<NestedAsyncComponent.ExecutionAction>>
|
||||||
|
{
|
||||||
|
[0] = new[]
|
||||||
|
{
|
||||||
|
new NestedAsyncComponent.ExecutionAction
|
||||||
|
{
|
||||||
|
Event = NestedAsyncComponent.EventType.OnAfterRenderAsyncAsync,
|
||||||
|
EventAction = async () =>
|
||||||
|
{
|
||||||
|
await Task.Yield();
|
||||||
|
throw exception;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[1] = new[]
|
||||||
|
{
|
||||||
|
new NestedAsyncComponent.ExecutionAction
|
||||||
|
{
|
||||||
|
Event = NestedAsyncComponent.EventType.OnAfterRenderAsyncAsync,
|
||||||
|
EventAction = async () =>
|
||||||
|
{
|
||||||
|
await Task.Yield();
|
||||||
|
taskCompletionSource.TrySetResult(0);
|
||||||
|
return (1, NestedAsyncComponent.EventType.OnAfterRenderAsyncAsync);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[nameof(NestedAsyncComponent.WhatToRender)] = new Dictionary<int, Func<NestedAsyncComponent, RenderFragment>>
|
||||||
|
{
|
||||||
|
[0] = CreateRenderFactory(new[] { 1 }),
|
||||||
|
[1] = CreateRenderFactory(Array.Empty<int>()),
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
|
Assert.True(renderTask.IsCompletedSuccessfully);
|
||||||
|
|
||||||
|
// OnAfterRenderAsync happens in the background. Make it more predictable, by gating it until we're ready to capture exceptions.
|
||||||
|
await taskCompletionSource.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
|
||||||
|
Assert.Same(exception, Assert.Single(renderer.HandledExceptions).GetBaseException());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task ExceptionThrownFromConstructor()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var renderer = new TestRenderer { ShouldHandleExceptions = true };
|
||||||
|
var component = new TestComponent(builder =>
|
||||||
|
{
|
||||||
|
builder.OpenComponent<ConstructorThrowingComponent>(0);
|
||||||
|
builder.CloseComponent();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Act/Assert
|
||||||
|
var componentId = renderer.AssignRootComponentId(component);
|
||||||
|
var renderTask = renderer.RenderRootComponentAsync(componentId);
|
||||||
|
|
||||||
|
await renderTask;
|
||||||
|
Assert.True(renderTask.IsCompletedSuccessfully);
|
||||||
|
Assert.Same(ConstructorThrowingComponent.Exception, Assert.Single(renderer.HandledExceptions).GetBaseException());
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ConstructorThrowingComponent : IComponent
|
||||||
|
{
|
||||||
|
public static readonly Exception Exception = new InvalidTimeZoneException();
|
||||||
|
|
||||||
|
public ConstructorThrowingComponent()
|
||||||
|
{
|
||||||
|
throw Exception;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Attach(RenderHandle renderHandle)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task SetParametersAsync(ParameterView parameters)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task ExceptionThrownFromAttach()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var renderer = new TestRenderer { ShouldHandleExceptions = true };
|
||||||
|
var component = new TestComponent(builder =>
|
||||||
|
{
|
||||||
|
builder.OpenComponent<AttachThrowingComponent>(0);
|
||||||
|
builder.CloseComponent();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Act/Assert
|
||||||
|
var componentId = renderer.AssignRootComponentId(component);
|
||||||
|
var renderTask = renderer.RenderRootComponentAsync(componentId);
|
||||||
|
|
||||||
|
await renderTask;
|
||||||
|
Assert.True(renderTask.IsCompletedSuccessfully);
|
||||||
|
Assert.Same(AttachThrowingComponent.Exception, Assert.Single(renderer.HandledExceptions).GetBaseException());
|
||||||
|
}
|
||||||
|
|
||||||
|
private class AttachThrowingComponent : IComponent
|
||||||
|
{
|
||||||
|
public static readonly Exception Exception = new InvalidTimeZoneException();
|
||||||
|
|
||||||
|
public void Attach(RenderHandle renderHandle)
|
||||||
|
{
|
||||||
|
throw Exception;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task SetParametersAsync(ParameterView parameters)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void SynchronousCancelledTasks_HandleAfterRender_Works()
|
public void SynchronousCancelledTasks_HandleAfterRender_Works()
|
||||||
{
|
{
|
||||||
|
|
@ -3132,7 +3383,7 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
{
|
{
|
||||||
new NestedAsyncComponent.ExecutionAction
|
new NestedAsyncComponent.ExecutionAction
|
||||||
{
|
{
|
||||||
Event = NestedAsyncComponent.EventType.OnAfterRenderAsync,
|
Event = NestedAsyncComponent.EventType.OnAfterRenderAsyncAsync,
|
||||||
EventAction = () => tcs.Task,
|
EventAction = () => tcs.Task,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -3166,7 +3417,7 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
{
|
{
|
||||||
new NestedAsyncComponent.ExecutionAction
|
new NestedAsyncComponent.ExecutionAction
|
||||||
{
|
{
|
||||||
Event = NestedAsyncComponent.EventType.OnAfterRenderAsync,
|
Event = NestedAsyncComponent.EventType.OnAfterRenderAsyncAsync,
|
||||||
EventAction = () => tcs.Task,
|
EventAction = () => tcs.Task,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -3203,7 +3454,7 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
{
|
{
|
||||||
new NestedAsyncComponent.ExecutionAction
|
new NestedAsyncComponent.ExecutionAction
|
||||||
{
|
{
|
||||||
Event = NestedAsyncComponent.EventType.OnAfterRenderAsync,
|
Event = NestedAsyncComponent.EventType.OnAfterRenderAsyncSync,
|
||||||
EventAction = () =>
|
EventAction = () =>
|
||||||
{
|
{
|
||||||
taskCompletionSource.TrySetResult(0);
|
taskCompletionSource.TrySetResult(0);
|
||||||
|
|
@ -3239,6 +3490,41 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
Assert.True(component.Disposed);
|
Assert.True(component.Disposed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void DisposingRenderer_RejectsAttemptsToStartMoreRenderBatches()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var renderer = new TestRenderer();
|
||||||
|
renderer.Dispose();
|
||||||
|
|
||||||
|
// Act/Assert
|
||||||
|
var ex = Assert.Throws<ObjectDisposedException>(() => renderer.ProcessPendingRender());
|
||||||
|
Assert.Contains("Cannot process pending renders after the renderer has been disposed.", ex.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void WhenRendererIsDisposed_ComponentRenderRequestsAreSkipped()
|
||||||
|
{
|
||||||
|
// The important point of this is that user code in components may continue to call
|
||||||
|
// StateHasChanged (e.g., after an async task completion), and we don't want that to
|
||||||
|
// show up as an error. In general, components should skip rendering after disposal.
|
||||||
|
// This test shows that we don't add any new entries to the render queue after disposal.
|
||||||
|
// There's a different test showing that if the render queue entry was already added
|
||||||
|
// before a component got individually disposed, that render queue entry gets skipped.
|
||||||
|
|
||||||
|
// Arrange
|
||||||
|
var renderer = new TestRenderer();
|
||||||
|
var component = new DisposableComponent();
|
||||||
|
renderer.AssignRootComponentId(component);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
renderer.Dispose();
|
||||||
|
component.TriggerRender();
|
||||||
|
|
||||||
|
// Assert: no exception, no batch produced
|
||||||
|
Assert.Empty(renderer.Batches);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void DisposingRenderer_DisposesNestedComponents()
|
public void DisposingRenderer_DisposesNestedComponents()
|
||||||
{
|
{
|
||||||
|
|
@ -3291,9 +3577,9 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
|
|
||||||
// All components must be disposed even if some throw as part of being diposed.
|
// All components must be disposed even if some throw as part of being diposed.
|
||||||
Assert.True(component.Disposed);
|
Assert.True(component.Disposed);
|
||||||
Assert.Equal(2, renderer.HandledExceptions.Count);
|
var aex = Assert.IsType<AggregateException>(Assert.Single(renderer.HandledExceptions));
|
||||||
Assert.Contains(exception1, renderer.HandledExceptions);
|
Assert.Contains(exception1, aex.InnerExceptions);
|
||||||
Assert.Contains(exception2, renderer.HandledExceptions);
|
Assert.Contains(exception2, aex.InnerExceptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
|
|
@ -3685,7 +3971,7 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
=> _renderHandle.Render(builder =>
|
=> _renderHandle.Render(builder =>
|
||||||
{
|
{
|
||||||
builder.OpenElement(0, "my button");
|
builder.OpenElement(0, "my button");
|
||||||
builder.AddAttribute(1, "my click handler", new Action<EventArgs>(eventArgs => OnClick(eventArgs)));
|
builder.AddAttribute(1, "onmycustomevent", EventCallback.Factory.Create(this, eventArgs => OnClick(eventArgs)));
|
||||||
builder.CloseElement();
|
builder.CloseElement();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -3941,6 +4227,7 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
if (TryGetEntry(EventType.OnInit, out var entry))
|
if (TryGetEntry(EventType.OnInit, out var entry))
|
||||||
{
|
{
|
||||||
var result = entry.EventAction();
|
var result = entry.EventAction();
|
||||||
|
Assert.True(result.IsCompleted, "Task must complete synchronously.");
|
||||||
LogResult(result.Result);
|
LogResult(result.Result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3949,8 +4236,9 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
{
|
{
|
||||||
if (TryGetEntry(EventType.OnInitAsyncSync, out var entrySync))
|
if (TryGetEntry(EventType.OnInitAsyncSync, out var entrySync))
|
||||||
{
|
{
|
||||||
var result = await entrySync.EventAction();
|
var result = entrySync.EventAction();
|
||||||
LogResult(result);
|
Assert.True(result.IsCompleted, "Task must complete synchronously.");
|
||||||
|
LogResult(result.Result);
|
||||||
}
|
}
|
||||||
else if (TryGetEntry(EventType.OnInitAsyncAsync, out var entryAsync))
|
else if (TryGetEntry(EventType.OnInitAsyncAsync, out var entryAsync))
|
||||||
{
|
{
|
||||||
|
|
@ -3964,6 +4252,7 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
if (TryGetEntry(EventType.OnParametersSet, out var entry))
|
if (TryGetEntry(EventType.OnParametersSet, out var entry))
|
||||||
{
|
{
|
||||||
var result = entry.EventAction();
|
var result = entry.EventAction();
|
||||||
|
Assert.True(result.IsCompleted, "Task must complete synchronously.");
|
||||||
LogResult(result.Result);
|
LogResult(result.Result);
|
||||||
}
|
}
|
||||||
base.OnParametersSet();
|
base.OnParametersSet();
|
||||||
|
|
@ -3973,10 +4262,9 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
{
|
{
|
||||||
if (TryGetEntry(EventType.OnParametersSetAsyncSync, out var entrySync))
|
if (TryGetEntry(EventType.OnParametersSetAsyncSync, out var entrySync))
|
||||||
{
|
{
|
||||||
var result = await entrySync.EventAction();
|
var result = entrySync.EventAction();
|
||||||
LogResult(result);
|
Assert.True(result.IsCompleted, "Task must complete synchronously.");
|
||||||
|
LogResult(result.Result);
|
||||||
await entrySync.EventAction();
|
|
||||||
}
|
}
|
||||||
else if (TryGetEntry(EventType.OnParametersSetAsyncAsync, out var entryAsync))
|
else if (TryGetEntry(EventType.OnParametersSetAsyncAsync, out var entryAsync))
|
||||||
{
|
{
|
||||||
|
|
@ -3991,11 +4279,17 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
renderFactory(this)(builder);
|
renderFactory(this)(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async Task OnAfterRenderAsync()
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||||
{
|
{
|
||||||
if (TryGetEntry(EventType.OnAfterRenderAsync, out var entry))
|
if (TryGetEntry(EventType.OnAfterRenderAsyncSync, out var entrySync))
|
||||||
{
|
{
|
||||||
var result = await entry.EventAction();
|
var result = entrySync.EventAction();
|
||||||
|
Assert.True(result.IsCompleted, "Task must complete synchronously.");
|
||||||
|
LogResult(result.Result);
|
||||||
|
}
|
||||||
|
if (TryGetEntry(EventType.OnAfterRenderAsyncAsync, out var entryAsync))
|
||||||
|
{
|
||||||
|
var result = await entryAsync.EventAction();
|
||||||
LogResult(result);
|
LogResult(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4054,7 +4348,8 @@ namespace Microsoft.AspNetCore.Components.Test
|
||||||
OnParametersSet,
|
OnParametersSet,
|
||||||
OnParametersSetAsyncSync,
|
OnParametersSetAsyncSync,
|
||||||
OnParametersSetAsyncAsync,
|
OnParametersSetAsyncAsync,
|
||||||
OnAfterRenderAsync,
|
OnAfterRenderAsyncSync,
|
||||||
|
OnAfterRenderAsyncAsync,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
@ -261,6 +262,7 @@ namespace Microsoft.AspNetCore.Components.RenderTree
|
||||||
Assert.Single(ArrayPool.ReturnedBuffers);
|
Assert.Single(ArrayPool.ReturnedBuffers);
|
||||||
var returnedBuffer = Assert.Single(ArrayPool.ReturnedBuffers);
|
var returnedBuffer = Assert.Single(ArrayPool.ReturnedBuffers);
|
||||||
Assert.Same(buffer, returnedBuffer);
|
Assert.Same(buffer, returnedBuffer);
|
||||||
|
Assert.NotSame(builder.Buffer, buffer); // Prevents use after free
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -281,6 +283,21 @@ namespace Microsoft.AspNetCore.Components.RenderTree
|
||||||
Assert.Same(buffer, returnedBuffer);
|
Assert.Same(buffer, returnedBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Dispose_ThrowsOnReuse()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var builder = CreateArrayBuilder();
|
||||||
|
builder.Append(1);
|
||||||
|
var buffer = builder.Buffer;
|
||||||
|
|
||||||
|
builder.Dispose();
|
||||||
|
Assert.Single(ArrayPool.ReturnedBuffers);
|
||||||
|
|
||||||
|
// Act & Assert
|
||||||
|
Assert.Throws<ObjectDisposedException>(() => builder.Append(1));
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void UnusedBufferIsReturned_OnResize()
|
public void UnusedBufferIsReturned_OnResize()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using Microsoft.Extensions.Logging.Abstractions;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components.Rendering
|
|
||||||
{
|
|
||||||
public class HtmlRendererTests : HtmlRendererTestBase
|
|
||||||
{
|
|
||||||
protected override HtmlRenderer GetHtmlRenderer(IServiceProvider serviceProvider)
|
|
||||||
{
|
|
||||||
return new HtmlRenderer(serviceProvider, NullLoggerFactory.Instance, _encoder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
"projects": [
|
"projects": [
|
||||||
"Analyzers\\src\\Microsoft.AspNetCore.Components.Analyzers.csproj",
|
"Analyzers\\src\\Microsoft.AspNetCore.Components.Analyzers.csproj",
|
||||||
"Analyzers\\test\\Microsoft.AspNetCore.Components.Analyzers.Tests.csproj",
|
"Analyzers\\test\\Microsoft.AspNetCore.Components.Analyzers.Tests.csproj",
|
||||||
|
"Authorization\\src\\Microsoft.AspNetCore.Components.Authorization.csproj",
|
||||||
|
"Authorization\\test\\Microsoft.AspNetCore.Components.Authorization.Tests.csproj",
|
||||||
"Blazor\\Blazor\\src\\Microsoft.AspNetCore.Blazor.csproj",
|
"Blazor\\Blazor\\src\\Microsoft.AspNetCore.Blazor.csproj",
|
||||||
"Blazor\\Blazor\\test\\Microsoft.AspNetCore.Blazor.Tests.csproj",
|
"Blazor\\Blazor\\test\\Microsoft.AspNetCore.Blazor.Tests.csproj",
|
||||||
"Blazor\\Build\\src\\Microsoft.AspNetCore.Blazor.Build.csproj",
|
"Blazor\\Build\\src\\Microsoft.AspNetCore.Blazor.Build.csproj",
|
||||||
|
|
@ -19,6 +21,8 @@
|
||||||
"Blazor\\testassets\\MonoSanityClient\\MonoSanityClient.csproj",
|
"Blazor\\testassets\\MonoSanityClient\\MonoSanityClient.csproj",
|
||||||
"Blazor\\testassets\\MonoSanity\\MonoSanity.csproj",
|
"Blazor\\testassets\\MonoSanity\\MonoSanity.csproj",
|
||||||
"Blazor\\testassets\\StandaloneApp\\StandaloneApp.csproj",
|
"Blazor\\testassets\\StandaloneApp\\StandaloneApp.csproj",
|
||||||
|
"Forms\\src\\Microsoft.AspNetCore.Components.Forms.csproj",
|
||||||
|
"Forms\\test\\Microsoft.AspNetCore.Components.Forms.Tests.csproj",
|
||||||
"Web\\src\\Microsoft.AspNetCore.Components.Web.csproj",
|
"Web\\src\\Microsoft.AspNetCore.Components.Web.csproj",
|
||||||
"Web\\test\\Microsoft.AspNetCore.Components.Web.Tests.csproj",
|
"Web\\test\\Microsoft.AspNetCore.Components.Web.Tests.csproj",
|
||||||
"Components\\perf\\Microsoft.AspNetCore.Components.Performance.csproj",
|
"Components\\perf\\Microsoft.AspNetCore.Components.Performance.csproj",
|
||||||
|
|
@ -26,7 +30,6 @@
|
||||||
"Components\\test\\Microsoft.AspNetCore.Components.Tests.csproj",
|
"Components\\test\\Microsoft.AspNetCore.Components.Tests.csproj",
|
||||||
"Server\\src\\Microsoft.AspNetCore.Components.Server.csproj",
|
"Server\\src\\Microsoft.AspNetCore.Components.Server.csproj",
|
||||||
"Server\\test\\Microsoft.AspNetCore.Components.Server.Tests.csproj",
|
"Server\\test\\Microsoft.AspNetCore.Components.Server.Tests.csproj",
|
||||||
"blazor\\BlazorExtension\\src\\Microsoft.VisualStudio.BlazorExtension.csproj",
|
|
||||||
"test\\E2ETest\\Microsoft.AspNetCore.Components.E2ETests.csproj",
|
"test\\E2ETest\\Microsoft.AspNetCore.Components.E2ETests.csproj",
|
||||||
"test\\testassets\\BasicTestApp\\BasicTestApp.csproj",
|
"test\\testassets\\BasicTestApp\\BasicTestApp.csproj",
|
||||||
"test\\testassets\\ComponentsApp.App\\ComponentsApp.App.csproj",
|
"test\\testassets\\ComponentsApp.App\\ComponentsApp.App.csproj",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
<!-- This file is automatically generated. -->
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>netstandard2.0;netcoreapp3.0</TargetFrameworks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
|
||||||
|
<Compile Include="Microsoft.AspNetCore.Components.Forms.netstandard2.0.cs" />
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Components" />
|
||||||
|
<Reference Include="System.ComponentModel.Annotations" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
|
||||||
|
<Compile Include="Microsoft.AspNetCore.Components.Forms.netcoreapp3.0.cs" />
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Components" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Components.Forms
|
||||||
|
{
|
||||||
|
public partial class DataAnnotationsValidator : Microsoft.AspNetCore.Components.ComponentBase
|
||||||
|
{
|
||||||
|
public DataAnnotationsValidator() { }
|
||||||
|
protected override void OnInitialized() { }
|
||||||
|
}
|
||||||
|
public sealed partial class EditContext
|
||||||
|
{
|
||||||
|
public EditContext(object model) { }
|
||||||
|
public object Model { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public event System.EventHandler<Microsoft.AspNetCore.Components.Forms.FieldChangedEventArgs> OnFieldChanged { add { } remove { } }
|
||||||
|
public event System.EventHandler<Microsoft.AspNetCore.Components.Forms.ValidationRequestedEventArgs> OnValidationRequested { add { } remove { } }
|
||||||
|
public event System.EventHandler<Microsoft.AspNetCore.Components.Forms.ValidationStateChangedEventArgs> OnValidationStateChanged { add { } remove { } }
|
||||||
|
public Microsoft.AspNetCore.Components.Forms.FieldIdentifier Field(string fieldName) { throw null; }
|
||||||
|
public System.Collections.Generic.IEnumerable<string> GetValidationMessages() { throw null; }
|
||||||
|
public System.Collections.Generic.IEnumerable<string> GetValidationMessages(Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { throw null; }
|
||||||
|
public System.Collections.Generic.IEnumerable<string> GetValidationMessages(System.Linq.Expressions.Expression<System.Func<object>> accessor) { throw null; }
|
||||||
|
public bool IsModified() { throw null; }
|
||||||
|
public bool IsModified(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { throw null; }
|
||||||
|
public bool IsModified(System.Linq.Expressions.Expression<System.Func<object>> accessor) { throw null; }
|
||||||
|
public void MarkAsUnmodified() { }
|
||||||
|
public void MarkAsUnmodified(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
|
||||||
|
public void NotifyFieldChanged(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
|
||||||
|
public void NotifyValidationStateChanged() { }
|
||||||
|
public bool Validate() { throw null; }
|
||||||
|
}
|
||||||
|
public static partial class EditContextDataAnnotationsExtensions
|
||||||
|
{
|
||||||
|
public static Microsoft.AspNetCore.Components.Forms.EditContext AddDataAnnotationsValidation(this Microsoft.AspNetCore.Components.Forms.EditContext editContext) { throw null; }
|
||||||
|
}
|
||||||
|
public sealed partial class FieldChangedEventArgs : System.EventArgs
|
||||||
|
{
|
||||||
|
public FieldChangedEventArgs(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
|
||||||
|
public Microsoft.AspNetCore.Components.Forms.FieldIdentifier FieldIdentifier { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
}
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct FieldIdentifier : System.IEquatable<Microsoft.AspNetCore.Components.Forms.FieldIdentifier>
|
||||||
|
{
|
||||||
|
private readonly object _dummy;
|
||||||
|
public FieldIdentifier(object model, string fieldName) { throw null; }
|
||||||
|
public string FieldName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public object Model { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public static Microsoft.AspNetCore.Components.Forms.FieldIdentifier Create<TField>(System.Linq.Expressions.Expression<System.Func<TField>> accessor) { throw null; }
|
||||||
|
public bool Equals(Microsoft.AspNetCore.Components.Forms.FieldIdentifier otherIdentifier) { throw null; }
|
||||||
|
public override bool Equals(object obj) { throw null; }
|
||||||
|
public override int GetHashCode() { throw null; }
|
||||||
|
}
|
||||||
|
public sealed partial class ValidationMessageStore
|
||||||
|
{
|
||||||
|
public ValidationMessageStore(Microsoft.AspNetCore.Components.Forms.EditContext editContext) { }
|
||||||
|
public System.Collections.Generic.IEnumerable<string> this[Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier] { get { throw null; } }
|
||||||
|
public System.Collections.Generic.IEnumerable<string> this[System.Linq.Expressions.Expression<System.Func<object>> accessor] { get { throw null; } }
|
||||||
|
public void Add(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier, System.Collections.Generic.IEnumerable<string> messages) { }
|
||||||
|
public void Add(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier, string message) { }
|
||||||
|
public void Add(System.Linq.Expressions.Expression<System.Func<object>> accessor, System.Collections.Generic.IEnumerable<string> messages) { }
|
||||||
|
public void Add(System.Linq.Expressions.Expression<System.Func<object>> accessor, string message) { }
|
||||||
|
public void Clear() { }
|
||||||
|
public void Clear(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
|
||||||
|
public void Clear(System.Linq.Expressions.Expression<System.Func<object>> accessor) { }
|
||||||
|
}
|
||||||
|
public sealed partial class ValidationRequestedEventArgs : System.EventArgs
|
||||||
|
{
|
||||||
|
public static readonly new Microsoft.AspNetCore.Components.Forms.ValidationRequestedEventArgs Empty;
|
||||||
|
public ValidationRequestedEventArgs() { }
|
||||||
|
}
|
||||||
|
public sealed partial class ValidationStateChangedEventArgs : System.EventArgs
|
||||||
|
{
|
||||||
|
public static readonly new Microsoft.AspNetCore.Components.Forms.ValidationStateChangedEventArgs Empty;
|
||||||
|
public ValidationStateChangedEventArgs() { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Components.Forms
|
||||||
|
{
|
||||||
|
public partial class DataAnnotationsValidator : Microsoft.AspNetCore.Components.ComponentBase
|
||||||
|
{
|
||||||
|
public DataAnnotationsValidator() { }
|
||||||
|
protected override void OnInitialized() { }
|
||||||
|
}
|
||||||
|
public sealed partial class EditContext
|
||||||
|
{
|
||||||
|
public EditContext(object model) { }
|
||||||
|
public object Model { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public event System.EventHandler<Microsoft.AspNetCore.Components.Forms.FieldChangedEventArgs> OnFieldChanged { add { } remove { } }
|
||||||
|
public event System.EventHandler<Microsoft.AspNetCore.Components.Forms.ValidationRequestedEventArgs> OnValidationRequested { add { } remove { } }
|
||||||
|
public event System.EventHandler<Microsoft.AspNetCore.Components.Forms.ValidationStateChangedEventArgs> OnValidationStateChanged { add { } remove { } }
|
||||||
|
public Microsoft.AspNetCore.Components.Forms.FieldIdentifier Field(string fieldName) { throw null; }
|
||||||
|
public System.Collections.Generic.IEnumerable<string> GetValidationMessages() { throw null; }
|
||||||
|
public System.Collections.Generic.IEnumerable<string> GetValidationMessages(Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { throw null; }
|
||||||
|
public System.Collections.Generic.IEnumerable<string> GetValidationMessages(System.Linq.Expressions.Expression<System.Func<object>> accessor) { throw null; }
|
||||||
|
public bool IsModified() { throw null; }
|
||||||
|
public bool IsModified(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { throw null; }
|
||||||
|
public bool IsModified(System.Linq.Expressions.Expression<System.Func<object>> accessor) { throw null; }
|
||||||
|
public void MarkAsUnmodified() { }
|
||||||
|
public void MarkAsUnmodified(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
|
||||||
|
public void NotifyFieldChanged(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
|
||||||
|
public void NotifyValidationStateChanged() { }
|
||||||
|
public bool Validate() { throw null; }
|
||||||
|
}
|
||||||
|
public static partial class EditContextDataAnnotationsExtensions
|
||||||
|
{
|
||||||
|
public static Microsoft.AspNetCore.Components.Forms.EditContext AddDataAnnotationsValidation(this Microsoft.AspNetCore.Components.Forms.EditContext editContext) { throw null; }
|
||||||
|
}
|
||||||
|
public sealed partial class FieldChangedEventArgs : System.EventArgs
|
||||||
|
{
|
||||||
|
public FieldChangedEventArgs(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
|
||||||
|
public Microsoft.AspNetCore.Components.Forms.FieldIdentifier FieldIdentifier { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
}
|
||||||
|
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
|
||||||
|
public readonly partial struct FieldIdentifier : System.IEquatable<Microsoft.AspNetCore.Components.Forms.FieldIdentifier>
|
||||||
|
{
|
||||||
|
private readonly object _dummy;
|
||||||
|
public FieldIdentifier(object model, string fieldName) { throw null; }
|
||||||
|
public string FieldName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public object Model { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||||
|
public static Microsoft.AspNetCore.Components.Forms.FieldIdentifier Create<TField>(System.Linq.Expressions.Expression<System.Func<TField>> accessor) { throw null; }
|
||||||
|
public bool Equals(Microsoft.AspNetCore.Components.Forms.FieldIdentifier otherIdentifier) { throw null; }
|
||||||
|
public override bool Equals(object obj) { throw null; }
|
||||||
|
public override int GetHashCode() { throw null; }
|
||||||
|
}
|
||||||
|
public sealed partial class ValidationMessageStore
|
||||||
|
{
|
||||||
|
public ValidationMessageStore(Microsoft.AspNetCore.Components.Forms.EditContext editContext) { }
|
||||||
|
public System.Collections.Generic.IEnumerable<string> this[Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier] { get { throw null; } }
|
||||||
|
public System.Collections.Generic.IEnumerable<string> this[System.Linq.Expressions.Expression<System.Func<object>> accessor] { get { throw null; } }
|
||||||
|
public void Add(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier, System.Collections.Generic.IEnumerable<string> messages) { }
|
||||||
|
public void Add(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier, string message) { }
|
||||||
|
public void Add(System.Linq.Expressions.Expression<System.Func<object>> accessor, System.Collections.Generic.IEnumerable<string> messages) { }
|
||||||
|
public void Add(System.Linq.Expressions.Expression<System.Func<object>> accessor, string message) { }
|
||||||
|
public void Clear() { }
|
||||||
|
public void Clear(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
|
||||||
|
public void Clear(System.Linq.Expressions.Expression<System.Func<object>> accessor) { }
|
||||||
|
}
|
||||||
|
public sealed partial class ValidationRequestedEventArgs : System.EventArgs
|
||||||
|
{
|
||||||
|
public static readonly new Microsoft.AspNetCore.Components.Forms.ValidationRequestedEventArgs Empty;
|
||||||
|
public ValidationRequestedEventArgs() { }
|
||||||
|
}
|
||||||
|
public sealed partial class ValidationStateChangedEventArgs : System.EventArgs
|
||||||
|
{
|
||||||
|
public static readonly new Microsoft.AspNetCore.Components.Forms.ValidationStateChangedEventArgs Empty;
|
||||||
|
public ValidationStateChangedEventArgs() { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>netstandard2.0;netcoreapp3.0</TargetFrameworks>
|
||||||
|
<TargetFrameworks Condition="'$(DotNetBuildFromSource)' == 'true'">netcoreapp3.0</TargetFrameworks>
|
||||||
|
<IsAspNetCoreApp>true</IsAspNetCoreApp>
|
||||||
|
<Description>Forms and validation support for Blazor applications.</Description>
|
||||||
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
|
<IsShippingPackage>true</IsShippingPackage>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Components" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'" >
|
||||||
|
<Reference Include="System.ComponentModel.Annotations" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||||
|
<RootNamespace>Microsoft.AspNetCore.Components.Forms</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Components.Forms" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="$(ComponentsSharedSourceRoot)test\**\*.cs" LinkBase="Helpers" />
|
||||||
|
<Compile Include="$(SharedSourceRoot)test\SkipOnHelixAttribute.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
|
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
|
||||||
<Compile Include="Microsoft.AspNetCore.Components.Server.netcoreapp3.0.cs" />
|
<Compile Include="Microsoft.AspNetCore.Components.Server.netcoreapp3.0.cs" />
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Components.Authorization" />
|
||||||
<Reference Include="Microsoft.AspNetCore.Components.Web" />
|
<Reference Include="Microsoft.AspNetCore.Components.Web" />
|
||||||
<Reference Include="Microsoft.AspNetCore.DataProtection" />
|
<Reference Include="Microsoft.AspNetCore.DataProtection" />
|
||||||
<Reference Include="Microsoft.AspNetCore.SignalR" />
|
<Reference Include="Microsoft.AspNetCore.SignalR" />
|
||||||
|
|
|
||||||
|
|
@ -41,13 +41,13 @@ namespace Microsoft.AspNetCore.Components.Server
|
||||||
protected abstract System.TimeSpan RevalidationInterval { get; }
|
protected abstract System.TimeSpan RevalidationInterval { get; }
|
||||||
protected virtual void Dispose(bool disposing) { }
|
protected virtual void Dispose(bool disposing) { }
|
||||||
void System.IDisposable.Dispose() { }
|
void System.IDisposable.Dispose() { }
|
||||||
protected abstract System.Threading.Tasks.Task<bool> ValidateAuthenticationStateAsync(Microsoft.AspNetCore.Components.AuthenticationState authenticationState, System.Threading.CancellationToken cancellationToken);
|
protected abstract System.Threading.Tasks.Task<bool> ValidateAuthenticationStateAsync(Microsoft.AspNetCore.Components.Authorization.AuthenticationState authenticationState, System.Threading.CancellationToken cancellationToken);
|
||||||
}
|
}
|
||||||
public partial class ServerAuthenticationStateProvider : Microsoft.AspNetCore.Components.AuthenticationStateProvider, Microsoft.AspNetCore.Components.IHostEnvironmentAuthenticationStateProvider
|
public partial class ServerAuthenticationStateProvider : Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider, Microsoft.AspNetCore.Components.Authorization.IHostEnvironmentAuthenticationStateProvider
|
||||||
{
|
{
|
||||||
public ServerAuthenticationStateProvider() { }
|
public ServerAuthenticationStateProvider() { }
|
||||||
public override System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.AuthenticationState> GetAuthenticationStateAsync() { throw null; }
|
public override System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> GetAuthenticationStateAsync() { throw null; }
|
||||||
public void SetAuthenticationState(System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.AuthenticationState> authenticationStateTask) { }
|
public void SetAuthenticationState(System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Authorization.AuthenticationState> authenticationStateTask) { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
namespace Microsoft.AspNetCore.Components.Server.Circuits
|
namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ namespace Microsoft.AspNetCore.Components.Server
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await Registry.Terminate(circuitId);
|
await Registry.TerminateAsync(circuitId);
|
||||||
Log.CircuitTerminatedGracefully(Logger, circuitId);
|
Log.CircuitTerminatedGracefully(Logger, circuitId);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
|
{
|
||||||
|
// Used to isolate a circuit from a CircuitHost.
|
||||||
|
//
|
||||||
|
// We can't refer to Hub.Items from a CircuitHost - but we want need to be
|
||||||
|
// able to break the link between Hub.Items and a CircuitHost.
|
||||||
|
internal class CircuitHandle
|
||||||
|
{
|
||||||
|
public CircuitHost CircuitHost { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,8 +6,10 @@ using System.Collections.Generic;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.Components.Authorization;
|
||||||
using Microsoft.AspNetCore.Components.Web;
|
using Microsoft.AspNetCore.Components.Web;
|
||||||
using Microsoft.AspNetCore.Components.Web.Rendering;
|
using Microsoft.AspNetCore.Components.Web.Rendering;
|
||||||
|
using Microsoft.AspNetCore.SignalR;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.JSInterop;
|
using Microsoft.JSInterop;
|
||||||
|
|
@ -18,9 +20,11 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
{
|
{
|
||||||
private readonly SemaphoreSlim HandlerLock = new SemaphoreSlim(1);
|
private readonly SemaphoreSlim HandlerLock = new SemaphoreSlim(1);
|
||||||
private readonly IServiceScope _scope;
|
private readonly IServiceScope _scope;
|
||||||
|
private readonly CircuitOptions _options;
|
||||||
private readonly CircuitHandler[] _circuitHandlers;
|
private readonly CircuitHandler[] _circuitHandlers;
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private bool _initialized;
|
private bool _initialized;
|
||||||
|
private bool _disposed;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the current <see cref="Circuits.Circuit"/>.
|
/// Sets the current <see cref="Circuits.Circuit"/>.
|
||||||
|
|
@ -42,11 +46,18 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
JSInterop.JSRuntime.SetCurrentJSRuntime(circuitHost.JSRuntime);
|
JSInterop.JSRuntime.SetCurrentJSRuntime(circuitHost.JSRuntime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This event is fired when there's an unrecoverable exception coming from the circuit, and
|
||||||
|
// it need so be torn down. The registry listens to this even so that the circuit can
|
||||||
|
// be torn down even when a client is not connected.
|
||||||
|
//
|
||||||
|
// We don't expect the registry to do anything with the exception. We only provide it here
|
||||||
|
// for testability.
|
||||||
public event UnhandledExceptionEventHandler UnhandledException;
|
public event UnhandledExceptionEventHandler UnhandledException;
|
||||||
|
|
||||||
public CircuitHost(
|
public CircuitHost(
|
||||||
string circuitId,
|
string circuitId,
|
||||||
IServiceScope scope,
|
IServiceScope scope,
|
||||||
|
CircuitOptions options,
|
||||||
CircuitClientProxy client,
|
CircuitClientProxy client,
|
||||||
RemoteRenderer renderer,
|
RemoteRenderer renderer,
|
||||||
IReadOnlyList<ComponentDescriptor> descriptors,
|
IReadOnlyList<ComponentDescriptor> descriptors,
|
||||||
|
|
@ -54,23 +65,28 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
CircuitHandler[] circuitHandlers,
|
CircuitHandler[] circuitHandlers,
|
||||||
ILogger logger)
|
ILogger logger)
|
||||||
{
|
{
|
||||||
CircuitId = circuitId;
|
CircuitId = circuitId ?? throw new ArgumentNullException(nameof(circuitId));
|
||||||
|
|
||||||
_scope = scope ?? throw new ArgumentNullException(nameof(scope));
|
_scope = scope ?? throw new ArgumentNullException(nameof(scope));
|
||||||
Client = client;
|
_options = options ?? throw new ArgumentNullException(nameof(options));
|
||||||
Descriptors = descriptors ?? throw new ArgumentNullException(nameof(descriptors));
|
Client = client ?? throw new ArgumentNullException(nameof(client));
|
||||||
Renderer = renderer ?? throw new ArgumentNullException(nameof(renderer));
|
Renderer = renderer ?? throw new ArgumentNullException(nameof(renderer));
|
||||||
|
Descriptors = descriptors ?? throw new ArgumentNullException(nameof(descriptors));
|
||||||
JSRuntime = jsRuntime ?? throw new ArgumentNullException(nameof(jsRuntime));
|
JSRuntime = jsRuntime ?? throw new ArgumentNullException(nameof(jsRuntime));
|
||||||
_logger = logger;
|
_circuitHandlers = circuitHandlers ?? throw new ArgumentNullException(nameof(circuitHandlers));
|
||||||
|
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||||
|
|
||||||
Services = scope.ServiceProvider;
|
Services = scope.ServiceProvider;
|
||||||
|
|
||||||
Circuit = new Circuit(this);
|
Circuit = new Circuit(this);
|
||||||
_circuitHandlers = circuitHandlers;
|
Handle = new CircuitHandle() { CircuitHost = this, };
|
||||||
|
|
||||||
Renderer.UnhandledException += Renderer_UnhandledException;
|
Renderer.UnhandledException += Renderer_UnhandledException;
|
||||||
Renderer.UnhandledSynchronizationException += SynchronizationContext_UnhandledException;
|
Renderer.UnhandledSynchronizationException += SynchronizationContext_UnhandledException;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CircuitHandle Handle { get; }
|
||||||
|
|
||||||
public string CircuitId { get; }
|
public string CircuitId { get; }
|
||||||
|
|
||||||
public Circuit Circuit { get; }
|
public Circuit Circuit { get; }
|
||||||
|
|
@ -85,88 +101,19 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
|
|
||||||
public IServiceProvider Services { get; }
|
public IServiceProvider Services { get; }
|
||||||
|
|
||||||
public void SetCircuitUser(ClaimsPrincipal user)
|
// InitializeAsync is used in a fire-and-forget context, so it's responsible for its own
|
||||||
|
// error handling.
|
||||||
|
public Task InitializeAsync(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var authenticationStateProvider = Services.GetService<AuthenticationStateProvider>() as IHostEnvironmentAuthenticationStateProvider;
|
Log.InitializationStarted(_logger);
|
||||||
if (authenticationStateProvider != null)
|
|
||||||
|
return Renderer.Dispatcher.InvokeAsync(async () =>
|
||||||
{
|
{
|
||||||
var authenticationState = new AuthenticationState(user);
|
if (_initialized)
|
||||||
authenticationStateProvider.SetAuthenticationState(Task.FromResult(authenticationState));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void SendPendingBatches()
|
|
||||||
{
|
|
||||||
// Dispatch any buffered renders we accumulated during a disconnect.
|
|
||||||
// Note that while the rendering is async, we cannot await it here. The Task returned by ProcessBufferedRenderBatches relies on
|
|
||||||
// OnRenderCompleted to be invoked to complete, and SignalR does not allow concurrent hub method invocations.
|
|
||||||
_ = Renderer.Dispatcher.InvokeAsync(() => Renderer.ProcessBufferedRenderBatches());
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task EndInvokeJSFromDotNet(long asyncCall, bool succeded, string arguments)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
AssertInitialized();
|
|
||||||
|
|
||||||
await Renderer.Dispatcher.InvokeAsync(() =>
|
|
||||||
{
|
{
|
||||||
SetCurrentCircuitHost(this);
|
throw new InvalidOperationException("The circuit host is already initialized.");
|
||||||
if (!succeded)
|
}
|
||||||
{
|
|
||||||
// We can log the arguments here because it is simply the JS error with the call stack.
|
|
||||||
Log.EndInvokeJSFailed(_logger, asyncCall, arguments);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Log.EndInvokeJSSucceeded(_logger, asyncCall);
|
|
||||||
}
|
|
||||||
|
|
||||||
DotNetDispatcher.EndInvoke(arguments);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Log.EndInvokeDispatchException(_logger, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task DispatchEvent(string eventDescriptorJson, string eventArgsJson)
|
|
||||||
{
|
|
||||||
WebEventData webEventData;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
AssertInitialized();
|
|
||||||
webEventData = WebEventData.Parse(eventDescriptorJson, eventArgsJson);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Log.DispatchEventFailedToParseEventData(_logger, ex);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await Renderer.Dispatcher.InvokeAsync(() =>
|
|
||||||
{
|
|
||||||
SetCurrentCircuitHost(this);
|
|
||||||
return Renderer.DispatchEventAsync(
|
|
||||||
webEventData.EventHandlerId,
|
|
||||||
webEventData.EventFieldInfo,
|
|
||||||
webEventData.EventArgs);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Log.DispatchEventFailedToDispatchEvent(_logger, webEventData.EventHandlerId.ToString(), ex);
|
|
||||||
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task InitializeAsync(CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
await Renderer.Dispatcher.InvokeAsync(async () =>
|
|
||||||
{
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
SetCurrentCircuitHost(this);
|
SetCurrentCircuitHost(this);
|
||||||
|
|
@ -185,92 +132,117 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
var (componentType, domElementSelector) = Descriptors[i];
|
var (componentType, domElementSelector) = Descriptors[i];
|
||||||
await Renderer.AddComponentAsync(componentType, domElementSelector);
|
await Renderer.AddComponentAsync(componentType, domElementSelector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Log.InitializationSucceeded(_logger);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
// We have to handle all our own errors here, because the upstream caller
|
// Report errors asynchronously. InitializeAsync is designed not to throw.
|
||||||
// has to fire-and-forget this
|
Log.InitializationFailed(_logger, ex);
|
||||||
Renderer_UnhandledException(this, ex);
|
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task BeginInvokeDotNetFromJS(string callId, string assemblyName, string methodIdentifier, long dotNetObjectId, string argsJson)
|
// We handle errors in DisposeAsync because there's no real value in letting it propagate.
|
||||||
|
// We run user code here (CircuitHandlers) and it's reasonable to expect some might throw, however,
|
||||||
|
// there isn't anything better to do than log when one of these exceptions happens - because the
|
||||||
|
// client is already gone.
|
||||||
|
public async ValueTask DisposeAsync()
|
||||||
{
|
{
|
||||||
try
|
Log.DisposeStarted(_logger, CircuitId);
|
||||||
{
|
|
||||||
AssertInitialized();
|
|
||||||
|
|
||||||
await Renderer.Dispatcher.InvokeAsync(() =>
|
await Renderer.Dispatcher.InvokeAsync(async () =>
|
||||||
{
|
|
||||||
SetCurrentCircuitHost(this);
|
|
||||||
Log.BeginInvokeDotNet(_logger, callId, assemblyName, methodIdentifier, dotNetObjectId);
|
|
||||||
DotNetDispatcher.BeginInvoke(callId, assemblyName, methodIdentifier, dotNetObjectId, argsJson);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
{
|
||||||
// We don't expect any of this code to actually throw, because DotNetDispatcher.BeginInvoke doesn't throw
|
if (_disposed)
|
||||||
// however, we still want this to get logged if we do.
|
{
|
||||||
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
// Make sure that no hub or connection can refer to this circuit anymore now that it's shutting down.
|
||||||
public async Task OnLocationChangedAsync(string uri, bool intercepted)
|
Handle.CircuitHost = null;
|
||||||
{
|
_disposed = true;
|
||||||
try
|
|
||||||
{
|
try
|
||||||
AssertInitialized();
|
{
|
||||||
await Renderer.Dispatcher.InvokeAsync(() =>
|
await OnConnectionDownAsync(CancellationToken.None);
|
||||||
{
|
}
|
||||||
SetCurrentCircuitHost(this);
|
catch
|
||||||
Log.LocationChange(_logger, CircuitId, uri);
|
{
|
||||||
var navigationManager = (RemoteNavigationManager)Services.GetRequiredService<NavigationManager>();
|
// Individual exceptions logged as part of OnConnectionDownAsync - nothing to do here
|
||||||
navigationManager.NotifyLocationChanged(uri, intercepted);
|
// since we're already shutting down.
|
||||||
Log.LocationChangeSucceeded(_logger, CircuitId, uri);
|
}
|
||||||
});
|
|
||||||
}
|
try
|
||||||
catch (Exception ex)
|
{
|
||||||
{
|
await OnCircuitDownAsync(CancellationToken.None);
|
||||||
// It's up to the NavigationManager implementation to validate the URI.
|
}
|
||||||
//
|
catch
|
||||||
// Note that it's also possible that setting the URI could cause a failure in code that listens
|
{
|
||||||
// to NavigationManager.LocationChanged.
|
// Individual exceptions logged as part of OnCircuitDownAsync - nothing to do here
|
||||||
//
|
// since we're already shutting down.
|
||||||
// In either case, a well-behaved client will not send invalid URIs, and we don't really
|
}
|
||||||
// want to continue processing with the circuit if setting the URI failed inside application
|
|
||||||
// code. The safest thing to do is consider it a critical failure since URI is global state,
|
try
|
||||||
// and a failure means that an update to global state was partially applied.
|
{
|
||||||
Log.LocationChangeFailed(_logger, CircuitId, uri, ex);
|
Renderer.Dispose();
|
||||||
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
|
_scope.Dispose();
|
||||||
}
|
Log.DisposeSucceeded(_logger, CircuitId);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.DisposeFailed(_logger, CircuitId, ex);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note: we log exceptions and re-throw while running handlers, because there may be multiple
|
||||||
|
// exceptions.
|
||||||
private async Task OnCircuitOpenedAsync(CancellationToken cancellationToken)
|
private async Task OnCircuitOpenedAsync(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Log.CircuitOpened(_logger, Circuit.Id);
|
Log.CircuitOpened(_logger, Circuit.Id);
|
||||||
|
|
||||||
for (var i = 0; i < _circuitHandlers.Length; i++)
|
await HandlerLock.WaitAsync(cancellationToken);
|
||||||
|
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var circuitHandler = _circuitHandlers[i];
|
List<Exception> exceptions = null;
|
||||||
try
|
|
||||||
|
for (var i = 0; i < _circuitHandlers.Length; i++)
|
||||||
{
|
{
|
||||||
await circuitHandler.OnCircuitOpenedAsync(Circuit, cancellationToken);
|
var circuitHandler = _circuitHandlers[i];
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await circuitHandler.OnCircuitOpenedAsync(Circuit, cancellationToken);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.CircuitHandlerFailed(_logger, circuitHandler, nameof(CircuitHandler.OnCircuitOpenedAsync), ex);
|
||||||
|
exceptions ??= new List<Exception>();
|
||||||
|
exceptions.Add(ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
|
||||||
|
if (exceptions != null)
|
||||||
{
|
{
|
||||||
OnHandlerError(circuitHandler, nameof(CircuitHandler.OnCircuitOpenedAsync), ex);
|
throw new AggregateException("Encountered exceptions while executing circuit handlers.", exceptions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
HandlerLock.Release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task OnConnectionUpAsync(CancellationToken cancellationToken)
|
public async Task OnConnectionUpAsync(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Log.ConnectionUp(_logger, Circuit.Id, Client.ConnectionId);
|
Log.ConnectionUp(_logger, Circuit.Id, Client.ConnectionId);
|
||||||
|
|
||||||
|
await HandlerLock.WaitAsync(cancellationToken);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await HandlerLock.WaitAsync(cancellationToken);
|
List<Exception> exceptions = null;
|
||||||
|
|
||||||
for (var i = 0; i < _circuitHandlers.Length; i++)
|
for (var i = 0; i < _circuitHandlers.Length; i++)
|
||||||
{
|
{
|
||||||
|
|
@ -281,9 +253,16 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
OnHandlerError(circuitHandler, nameof(CircuitHandler.OnConnectionUpAsync), ex);
|
Log.CircuitHandlerFailed(_logger, circuitHandler, nameof(CircuitHandler.OnConnectionUpAsync), ex);
|
||||||
|
exceptions ??= new List<Exception>();
|
||||||
|
exceptions.Add(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (exceptions != null)
|
||||||
|
{
|
||||||
|
throw new AggregateException("Encountered exceptions while executing circuit handlers.", exceptions);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|
@ -295,9 +274,11 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
{
|
{
|
||||||
Log.ConnectionDown(_logger, Circuit.Id, Client.ConnectionId);
|
Log.ConnectionDown(_logger, Circuit.Id, Client.ConnectionId);
|
||||||
|
|
||||||
|
await HandlerLock.WaitAsync(cancellationToken);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await HandlerLock.WaitAsync(cancellationToken);
|
List<Exception> exceptions = null;
|
||||||
|
|
||||||
for (var i = 0; i < _circuitHandlers.Length; i++)
|
for (var i = 0; i < _circuitHandlers.Length; i++)
|
||||||
{
|
{
|
||||||
|
|
@ -308,9 +289,16 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
OnHandlerError(circuitHandler, nameof(CircuitHandler.OnConnectionDownAsync), ex);
|
Log.CircuitHandlerFailed(_logger, circuitHandler, nameof(CircuitHandler.OnConnectionDownAsync), ex);
|
||||||
|
exceptions ??= new List<Exception>();
|
||||||
|
exceptions.Add(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (exceptions != null)
|
||||||
|
{
|
||||||
|
throw new AggregateException("Encountered exceptions while executing circuit handlers.", exceptions);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|
@ -318,46 +306,229 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void OnHandlerError(CircuitHandler circuitHandler, string handlerMethod, Exception ex)
|
private async Task OnCircuitDownAsync(CancellationToken cancellationToken)
|
||||||
{
|
|
||||||
Log.UnhandledExceptionInvokingCircuitHandler(_logger, circuitHandler, handlerMethod, ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task OnCircuitDownAsync()
|
|
||||||
{
|
{
|
||||||
Log.CircuitClosed(_logger, Circuit.Id);
|
Log.CircuitClosed(_logger, Circuit.Id);
|
||||||
|
|
||||||
for (var i = 0; i < _circuitHandlers.Length; i++)
|
await HandlerLock.WaitAsync(cancellationToken);
|
||||||
|
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var circuitHandler = _circuitHandlers[i];
|
List<Exception> exceptions = null;
|
||||||
try
|
|
||||||
|
for (var i = 0; i < _circuitHandlers.Length; i++)
|
||||||
{
|
{
|
||||||
await circuitHandler.OnCircuitClosedAsync(Circuit, default);
|
var circuitHandler = _circuitHandlers[i];
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await circuitHandler.OnCircuitClosedAsync(Circuit, cancellationToken);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.CircuitHandlerFailed(_logger, circuitHandler, nameof(CircuitHandler.OnCircuitClosedAsync), ex);
|
||||||
|
exceptions ??= new List<Exception>();
|
||||||
|
exceptions.Add(ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
|
||||||
|
if (exceptions != null)
|
||||||
{
|
{
|
||||||
OnHandlerError(circuitHandler, nameof(CircuitHandler.OnCircuitClosedAsync), ex);
|
throw new AggregateException("Encountered exceptions while executing circuit handlers.", exceptions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
HandlerLock.Release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async ValueTask DisposeAsync()
|
// BeginInvokeDotNetFromJS is used in a fire-and-forget context, so it's responsible for its own
|
||||||
|
// error handling.
|
||||||
|
public async Task BeginInvokeDotNetFromJS(string callId, string assemblyName, string methodIdentifier, long dotNetObjectId, string argsJson)
|
||||||
{
|
{
|
||||||
Log.DisposingCircuit(_logger, CircuitId);
|
AssertInitialized();
|
||||||
|
AssertNotDisposed();
|
||||||
|
|
||||||
await Renderer.Dispatcher.InvokeAsync(async () =>
|
try
|
||||||
{
|
{
|
||||||
try
|
await Renderer.Dispatcher.InvokeAsync(() =>
|
||||||
{
|
{
|
||||||
await OnConnectionDownAsync(CancellationToken.None);
|
SetCurrentCircuitHost(this);
|
||||||
await OnCircuitDownAsync();
|
Log.BeginInvokeDotNet(_logger, callId, assemblyName, methodIdentifier, dotNetObjectId);
|
||||||
}
|
DotNetDispatcher.BeginInvoke(callId, assemblyName, methodIdentifier, dotNetObjectId, argsJson);
|
||||||
finally
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// We don't expect any of this code to actually throw, because DotNetDispatcher.BeginInvoke doesn't throw
|
||||||
|
// however, we still want this to get logged if we do.
|
||||||
|
Log.BeginInvokeDotNetFailed(_logger, callId, assemblyName, methodIdentifier, dotNetObjectId, ex);
|
||||||
|
if (Client.Connected)
|
||||||
{
|
{
|
||||||
Renderer.Dispose();
|
await NotifyClientError(Client, "Interop call failed.");
|
||||||
_scope.Dispose();
|
|
||||||
}
|
}
|
||||||
});
|
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// EndInvokeJSFromDotNet is used in a fire-and-forget context, so it's responsible for its own
|
||||||
|
// error handling.
|
||||||
|
public async Task EndInvokeJSFromDotNet(long asyncCall, bool succeded, string arguments)
|
||||||
|
{
|
||||||
|
AssertInitialized();
|
||||||
|
AssertNotDisposed();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Renderer.Dispatcher.InvokeAsync(() =>
|
||||||
|
{
|
||||||
|
SetCurrentCircuitHost(this);
|
||||||
|
if (!succeded)
|
||||||
|
{
|
||||||
|
// We can log the arguments here because it is simply the JS error with the call stack.
|
||||||
|
Log.EndInvokeJSFailed(_logger, asyncCall, arguments);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.EndInvokeJSSucceeded(_logger, asyncCall);
|
||||||
|
}
|
||||||
|
|
||||||
|
DotNetDispatcher.EndInvoke(arguments);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// An error completing JS interop means that the user sent invalid data, a well-behaved
|
||||||
|
// client won't do this.
|
||||||
|
Log.EndInvokeDispatchException(_logger, ex);
|
||||||
|
if (Client.Connected)
|
||||||
|
{
|
||||||
|
await NotifyClientError(Client, "Invalid interop arguments.");
|
||||||
|
}
|
||||||
|
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DispatchEvent is used in a fire-and-forget context, so it's responsible for its own
|
||||||
|
// error handling.
|
||||||
|
public async Task DispatchEvent(string eventDescriptorJson, string eventArgsJson)
|
||||||
|
{
|
||||||
|
AssertInitialized();
|
||||||
|
AssertNotDisposed();
|
||||||
|
|
||||||
|
WebEventData webEventData;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
AssertInitialized();
|
||||||
|
webEventData = WebEventData.Parse(eventDescriptorJson, eventArgsJson);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// Invalid event data is fatal. We expect a well-behaved client to send valid JSON.
|
||||||
|
Log.DispatchEventFailedToParseEventData(_logger, ex);
|
||||||
|
if (Client.Connected)
|
||||||
|
{
|
||||||
|
await NotifyClientError(Client, "Invalid event data.");
|
||||||
|
}
|
||||||
|
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Renderer.Dispatcher.InvokeAsync(() =>
|
||||||
|
{
|
||||||
|
SetCurrentCircuitHost(this);
|
||||||
|
return Renderer.DispatchEventAsync(
|
||||||
|
webEventData.EventHandlerId,
|
||||||
|
webEventData.EventFieldInfo,
|
||||||
|
webEventData.EventArgs);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// A failure in dispatching an event means that it was an attempt to use an invalid event id.
|
||||||
|
// A well-behaved client won't do this.
|
||||||
|
Log.DispatchEventFailedToDispatchEvent(_logger, webEventData.EventHandlerId.ToString(), ex);
|
||||||
|
if (Client.Connected)
|
||||||
|
{
|
||||||
|
await NotifyClientError(Client, "Failed to dispatch event.");
|
||||||
|
}
|
||||||
|
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OnLocationChangedAsync is used in a fire-and-forget context, so it's responsible for its own
|
||||||
|
// error handling.
|
||||||
|
public async Task OnLocationChangedAsync(string uri, bool intercepted)
|
||||||
|
{
|
||||||
|
AssertInitialized();
|
||||||
|
AssertNotDisposed();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Renderer.Dispatcher.InvokeAsync(() =>
|
||||||
|
{
|
||||||
|
SetCurrentCircuitHost(this);
|
||||||
|
Log.LocationChange(_logger, uri, CircuitId);
|
||||||
|
var navigationManager = (RemoteNavigationManager)Services.GetRequiredService<NavigationManager>();
|
||||||
|
navigationManager.NotifyLocationChanged(uri, intercepted);
|
||||||
|
Log.LocationChangeSucceeded(_logger, uri, CircuitId);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// It's up to the NavigationManager implementation to validate the URI.
|
||||||
|
//
|
||||||
|
// Note that it's also possible that setting the URI could cause a failure in code that listens
|
||||||
|
// to NavigationManager.LocationChanged.
|
||||||
|
//
|
||||||
|
// In either case, a well-behaved client will not send invalid URIs, and we don't really
|
||||||
|
// want to continue processing with the circuit if setting the URI failed inside application
|
||||||
|
// code. The safest thing to do is consider it a critical failure since URI is global state,
|
||||||
|
// and a failure means that an update to global state was partially applied.
|
||||||
|
catch (LocationChangeException nex)
|
||||||
|
{
|
||||||
|
// LocationChangeException means that it failed in user-code. Treat this like an unhandled
|
||||||
|
// exception in user-code.
|
||||||
|
Log.LocationChangeFailedInCircuit(_logger, uri, CircuitId, nex);
|
||||||
|
await ReportUnhandledException(nex);
|
||||||
|
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(nex, isTerminating: false));
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// Any other exception means that it failed validation, or inside the NavigationManager. Treat
|
||||||
|
// this like bad data.
|
||||||
|
Log.LocationChangeFailed(_logger, uri, CircuitId, ex);
|
||||||
|
if (Client.Connected)
|
||||||
|
{
|
||||||
|
await NotifyClientError(Client, $"Location change to {uri} failed.");
|
||||||
|
}
|
||||||
|
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetCircuitUser(ClaimsPrincipal user)
|
||||||
|
{
|
||||||
|
// This can be called before the circuit is initialized.
|
||||||
|
AssertNotDisposed();
|
||||||
|
|
||||||
|
var authenticationStateProvider = Services.GetService<AuthenticationStateProvider>() as IHostEnvironmentAuthenticationStateProvider;
|
||||||
|
if (authenticationStateProvider != null)
|
||||||
|
{
|
||||||
|
var authenticationState = new AuthenticationState(user);
|
||||||
|
authenticationStateProvider.SetAuthenticationState(Task.FromResult(authenticationState));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendPendingBatches()
|
||||||
|
{
|
||||||
|
AssertInitialized();
|
||||||
|
AssertNotDisposed();
|
||||||
|
|
||||||
|
// Dispatch any buffered renders we accumulated during a disconnect.
|
||||||
|
// Note that while the rendering is async, we cannot await it here. The Task returned by ProcessBufferedRenderBatches relies on
|
||||||
|
// OnRenderCompleted to be invoked to complete, and SignalR does not allow concurrent hub method invocations.
|
||||||
|
_ = Renderer.Dispatcher.InvokeAsync(() => Renderer.ProcessBufferedRenderBatches());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AssertInitialized()
|
private void AssertInitialized()
|
||||||
|
|
@ -368,26 +539,86 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Renderer_UnhandledException(object sender, Exception e)
|
private void AssertNotDisposed()
|
||||||
{
|
{
|
||||||
|
if (_disposed)
|
||||||
|
{
|
||||||
|
throw new ObjectDisposedException(objectName: null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// An unhandled exception from the renderer is always fatal because it came from user code.
|
||||||
|
// We want to notify the client if it's still connected, and then tear-down the circuit.
|
||||||
|
private async void Renderer_UnhandledException(object sender, Exception e)
|
||||||
|
{
|
||||||
|
await ReportUnhandledException(e);
|
||||||
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(e, isTerminating: false));
|
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(e, isTerminating: false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SynchronizationContext_UnhandledException(object sender, UnhandledExceptionEventArgs e)
|
// An unhandled exception from the renderer is always fatal because it came from user code.
|
||||||
|
// We want to notify the client if it's still connected, and then tear-down the circuit.
|
||||||
|
private async void SynchronizationContext_UnhandledException(object sender, UnhandledExceptionEventArgs e)
|
||||||
{
|
{
|
||||||
|
await ReportUnhandledException((Exception)e.ExceptionObject);
|
||||||
UnhandledException?.Invoke(this, e);
|
UnhandledException?.Invoke(this, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task ReportUnhandledException(Exception exception)
|
||||||
|
{
|
||||||
|
Log.CircuitUnhandledException(_logger, CircuitId, exception);
|
||||||
|
if (!Client.Connected)
|
||||||
|
{
|
||||||
|
_logger.LogDebug("Client is disconnected YO.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (_options.DetailedErrors)
|
||||||
|
{
|
||||||
|
await NotifyClientError(Client, exception.ToString());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var message =
|
||||||
|
$"There was an unhandled exception on the current circuit, so this circuit will be terminated. For more details turn on " +
|
||||||
|
$"detailed exceptions in '{typeof(CircuitOptions).Name}.{nameof(CircuitOptions.DetailedErrors)}'";
|
||||||
|
await NotifyClientError(Client, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.CircuitUnhandledExceptionFailed(_logger, CircuitId, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task NotifyClientError(IClientProxy client, string error)
|
||||||
|
{
|
||||||
|
_logger.LogDebug("About to notify of an error");
|
||||||
|
await client.SendAsync("JS.Error", error);
|
||||||
|
_logger.LogDebug("Completed notify of an error");
|
||||||
|
}
|
||||||
|
|
||||||
private static class Log
|
private static class Log
|
||||||
{
|
{
|
||||||
private static readonly Action<ILogger, Type, string, string, Exception> _unhandledExceptionInvokingCircuitHandler;
|
private static readonly Action<ILogger, Exception> _intializationStarted;
|
||||||
private static readonly Action<ILogger, string, Exception> _disposingCircuit;
|
private static readonly Action<ILogger, Exception> _intializationSucceded;
|
||||||
|
private static readonly Action<ILogger, Exception> _intializationFailed;
|
||||||
|
private static readonly Action<ILogger, string, Exception> _disposeStarted;
|
||||||
|
private static readonly Action<ILogger, string, Exception> _disposeSucceded;
|
||||||
|
private static readonly Action<ILogger, string, Exception> _disposeFailed;
|
||||||
private static readonly Action<ILogger, string, Exception> _onCircuitOpened;
|
private static readonly Action<ILogger, string, Exception> _onCircuitOpened;
|
||||||
private static readonly Action<ILogger, string, string, Exception> _onConnectionUp;
|
private static readonly Action<ILogger, string, string, Exception> _onConnectionUp;
|
||||||
private static readonly Action<ILogger, string, string, Exception> _onConnectionDown;
|
private static readonly Action<ILogger, string, string, Exception> _onConnectionDown;
|
||||||
private static readonly Action<ILogger, string, Exception> _onCircuitClosed;
|
private static readonly Action<ILogger, string, Exception> _onCircuitClosed;
|
||||||
|
private static readonly Action<ILogger, Type, string, string, Exception> _circuitHandlerFailed;
|
||||||
|
private static readonly Action<ILogger, string, Exception> _circuitUnhandledException;
|
||||||
|
private static readonly Action<ILogger, string, Exception> _circuitUnhandledExceptionFailed;
|
||||||
|
|
||||||
private static readonly Action<ILogger, string, string, string, Exception> _beginInvokeDotNetStatic;
|
private static readonly Action<ILogger, string, string, string, Exception> _beginInvokeDotNetStatic;
|
||||||
private static readonly Action<ILogger, string, long, string, Exception> _beginInvokeDotNetInstance;
|
private static readonly Action<ILogger, string, long, string, Exception> _beginInvokeDotNetInstance;
|
||||||
|
private static readonly Action<ILogger, string, string, string, Exception> _beginInvokeDotNetStaticFailed;
|
||||||
|
private static readonly Action<ILogger, string, long, string, Exception> _beginInvokeDotNetInstanceFailed;
|
||||||
private static readonly Action<ILogger, Exception> _endInvokeDispatchException;
|
private static readonly Action<ILogger, Exception> _endInvokeDispatchException;
|
||||||
private static readonly Action<ILogger, long, string, Exception> _endInvokeJSFailed;
|
private static readonly Action<ILogger, long, string, Exception> _endInvokeJSFailed;
|
||||||
private static readonly Action<ILogger, long, Exception> _endInvokeJSSucceeded;
|
private static readonly Action<ILogger, long, Exception> _endInvokeJSSucceeded;
|
||||||
|
|
@ -396,39 +627,71 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
private static readonly Action<ILogger, string, string, Exception> _locationChange;
|
private static readonly Action<ILogger, string, string, Exception> _locationChange;
|
||||||
private static readonly Action<ILogger, string, string, Exception> _locationChangeSucceeded;
|
private static readonly Action<ILogger, string, string, Exception> _locationChangeSucceeded;
|
||||||
private static readonly Action<ILogger, string, string, Exception> _locationChangeFailed;
|
private static readonly Action<ILogger, string, string, Exception> _locationChangeFailed;
|
||||||
|
private static readonly Action<ILogger, string, string, Exception> _locationChangeFailedInCircuit;
|
||||||
|
|
||||||
private static class EventIds
|
private static class EventIds
|
||||||
{
|
{
|
||||||
public static readonly EventId ExceptionInvokingCircuitHandlerMethod = new EventId(100, "ExceptionInvokingCircuitHandlerMethod");
|
// 100s used for lifecycle stuff
|
||||||
public static readonly EventId DisposingCircuit = new EventId(101, "DisposingCircuitHost");
|
public static readonly EventId InitializationStarted = new EventId(100, "InitializationStarted");
|
||||||
public static readonly EventId OnCircuitOpened = new EventId(102, "OnCircuitOpened");
|
public static readonly EventId InitializationSucceeded = new EventId(101, "InitializationSucceeded");
|
||||||
public static readonly EventId OnConnectionUp = new EventId(103, "OnConnectionUp");
|
public static readonly EventId InitializationFailed = new EventId(102, "InitializationFailed");
|
||||||
public static readonly EventId OnConnectionDown = new EventId(104, "OnConnectionDown");
|
public static readonly EventId DisposeStarted = new EventId(103, "DisposeStarted");
|
||||||
public static readonly EventId OnCircuitClosed = new EventId(105, "OnCircuitClosed");
|
public static readonly EventId DisposeSucceeded = new EventId(104, "DisposeSucceeded");
|
||||||
public static readonly EventId InvalidBrowserEventFormat = new EventId(106, "InvalidBrowserEventFormat");
|
public static readonly EventId DisposeFailed = new EventId(105, "DisposeFailed");
|
||||||
public static readonly EventId DispatchEventFailedToParseEventData = new EventId(107, "DispatchEventFailedToParseEventData");
|
public static readonly EventId OnCircuitOpened = new EventId(106, "OnCircuitOpened");
|
||||||
public static readonly EventId DispatchEventFailedToDispatchEvent = new EventId(108, "DispatchEventFailedToDispatchEvent");
|
public static readonly EventId OnConnectionUp = new EventId(107, "OnConnectionUp");
|
||||||
public static readonly EventId BeginInvokeDotNet = new EventId(109, "BeginInvokeDotNet");
|
public static readonly EventId OnConnectionDown = new EventId(108, "OnConnectionDown");
|
||||||
public static readonly EventId EndInvokeDispatchException = new EventId(110, "EndInvokeDispatchException");
|
public static readonly EventId OnCircuitClosed = new EventId(109, "OnCircuitClosed");
|
||||||
public static readonly EventId EndInvokeJSFailed = new EventId(111, "EndInvokeJSFailed");
|
public static readonly EventId CircuitHandlerFailed = new EventId(110, "CircuitHandlerFailed");
|
||||||
public static readonly EventId EndInvokeJSSucceeded = new EventId(112, "EndInvokeJSSucceeded");
|
public static readonly EventId CircuitUnhandledException = new EventId(111, "CircuitUnhandledException");
|
||||||
public static readonly EventId DispatchEventThroughJSInterop = new EventId(113, "DispatchEventThroughJSInterop");
|
public static readonly EventId CircuitUnhandledExceptionFailed = new EventId(112, "CircuitUnhandledExceptionFailed");
|
||||||
public static readonly EventId LocationChange = new EventId(114, "LocationChange");
|
|
||||||
public static readonly EventId LocationChangeSucceded = new EventId(115, "LocationChangeSucceeded");
|
// 200s used for interactive stuff
|
||||||
public static readonly EventId LocationChangeFailed = new EventId(116, "LocationChangeFailed");
|
public static readonly EventId DispatchEventFailedToParseEventData = new EventId(200, "DispatchEventFailedToParseEventData");
|
||||||
|
public static readonly EventId DispatchEventFailedToDispatchEvent = new EventId(201, "DispatchEventFailedToDispatchEvent");
|
||||||
|
public static readonly EventId BeginInvokeDotNet = new EventId(202, "BeginInvokeDotNet");
|
||||||
|
public static readonly EventId BeginInvokeDotNetFailed = new EventId(203, "BeginInvokeDotNetFailed");
|
||||||
|
public static readonly EventId EndInvokeDispatchException = new EventId(204, "EndInvokeDispatchException");
|
||||||
|
public static readonly EventId EndInvokeJSFailed = new EventId(205, "EndInvokeJSFailed");
|
||||||
|
public static readonly EventId EndInvokeJSSucceeded = new EventId(206, "EndInvokeJSSucceeded");
|
||||||
|
public static readonly EventId DispatchEventThroughJSInterop = new EventId(207, "DispatchEventThroughJSInterop");
|
||||||
|
public static readonly EventId LocationChange = new EventId(208, "LocationChange");
|
||||||
|
public static readonly EventId LocationChangeSucceded = new EventId(209, "LocationChangeSucceeded");
|
||||||
|
public static readonly EventId LocationChangeFailed = new EventId(210, "LocationChangeFailed");
|
||||||
|
public static readonly EventId LocationChangeFailedInCircuit = new EventId(211, "LocationChangeFailedInCircuit");
|
||||||
}
|
}
|
||||||
|
|
||||||
static Log()
|
static Log()
|
||||||
{
|
{
|
||||||
_unhandledExceptionInvokingCircuitHandler = LoggerMessage.Define<Type, string, string>(
|
_intializationStarted = LoggerMessage.Define(
|
||||||
LogLevel.Error,
|
|
||||||
EventIds.ExceptionInvokingCircuitHandlerMethod,
|
|
||||||
"Unhandled error invoking circuit handler type {handlerType}.{handlerMethod}: {Message}");
|
|
||||||
|
|
||||||
_disposingCircuit = LoggerMessage.Define<string>(
|
|
||||||
LogLevel.Debug,
|
LogLevel.Debug,
|
||||||
EventIds.DisposingCircuit,
|
EventIds.InitializationFailed,
|
||||||
"Disposing circuit with identifier {CircuitId}");
|
"Circuit initialization started");
|
||||||
|
|
||||||
|
_intializationSucceded = LoggerMessage.Define(
|
||||||
|
LogLevel.Debug,
|
||||||
|
EventIds.InitializationFailed,
|
||||||
|
"Circuit initialization succeeded");
|
||||||
|
|
||||||
|
_intializationFailed = LoggerMessage.Define(
|
||||||
|
LogLevel.Debug,
|
||||||
|
EventIds.InitializationFailed,
|
||||||
|
"Circuit initialization failed");
|
||||||
|
|
||||||
|
_disposeStarted = LoggerMessage.Define<string>(
|
||||||
|
LogLevel.Debug,
|
||||||
|
EventIds.DisposeStarted,
|
||||||
|
"Disposing circuit {CircuitId} started");
|
||||||
|
|
||||||
|
_disposeSucceded = LoggerMessage.Define<string>(
|
||||||
|
LogLevel.Debug,
|
||||||
|
EventIds.DisposeSucceeded,
|
||||||
|
"Disposing circuit {CircuitId} succeded");
|
||||||
|
|
||||||
|
_disposeFailed = LoggerMessage.Define<string>(
|
||||||
|
LogLevel.Debug,
|
||||||
|
EventIds.DisposeFailed,
|
||||||
|
"Disposing circuit {CircuitId} failed");
|
||||||
|
|
||||||
_onCircuitOpened = LoggerMessage.Define<string>(
|
_onCircuitOpened = LoggerMessage.Define<string>(
|
||||||
LogLevel.Debug,
|
LogLevel.Debug,
|
||||||
|
|
@ -450,6 +713,21 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
EventIds.OnCircuitClosed,
|
EventIds.OnCircuitClosed,
|
||||||
"Closing circuit with id {CircuitId}.");
|
"Closing circuit with id {CircuitId}.");
|
||||||
|
|
||||||
|
_circuitHandlerFailed = LoggerMessage.Define<Type, string, string>(
|
||||||
|
LogLevel.Error,
|
||||||
|
EventIds.CircuitHandlerFailed,
|
||||||
|
"Unhandled error invoking circuit handler type {handlerType}.{handlerMethod}: {Message}");
|
||||||
|
|
||||||
|
_circuitUnhandledException = LoggerMessage.Define<string>(
|
||||||
|
LogLevel.Error,
|
||||||
|
EventIds.CircuitUnhandledException,
|
||||||
|
"Unhandled exception in circuit {CircuitId}");
|
||||||
|
|
||||||
|
_circuitUnhandledExceptionFailed = LoggerMessage.Define<string>(
|
||||||
|
LogLevel.Debug,
|
||||||
|
EventIds.CircuitUnhandledExceptionFailed,
|
||||||
|
"Failed to transmit exception to client in circuit {CircuitId}");
|
||||||
|
|
||||||
_beginInvokeDotNetStatic = LoggerMessage.Define<string, string, string>(
|
_beginInvokeDotNetStatic = LoggerMessage.Define<string, string, string>(
|
||||||
LogLevel.Debug,
|
LogLevel.Debug,
|
||||||
EventIds.BeginInvokeDotNet,
|
EventIds.BeginInvokeDotNet,
|
||||||
|
|
@ -460,6 +738,16 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
EventIds.BeginInvokeDotNet,
|
EventIds.BeginInvokeDotNet,
|
||||||
"Invoking instance method '{MethodIdentifier}' on instance '{DotNetObjectId}' with callback id '{CallId}'");
|
"Invoking instance method '{MethodIdentifier}' on instance '{DotNetObjectId}' with callback id '{CallId}'");
|
||||||
|
|
||||||
|
_beginInvokeDotNetStaticFailed = LoggerMessage.Define<string, string, string>(
|
||||||
|
LogLevel.Debug,
|
||||||
|
EventIds.BeginInvokeDotNetFailed,
|
||||||
|
"Failed to invoke static method with identifier '{MethodIdentifier}' on assembly '{Assembly}' with callback id '{CallId}'");
|
||||||
|
|
||||||
|
_beginInvokeDotNetInstanceFailed = LoggerMessage.Define<string, long, string>(
|
||||||
|
LogLevel.Debug,
|
||||||
|
EventIds.BeginInvokeDotNetFailed,
|
||||||
|
"Failed to invoke instance method '{MethodIdentifier}' on instance '{DotNetObjectId}' with callback id '{CallId}'");
|
||||||
|
|
||||||
_endInvokeDispatchException = LoggerMessage.Define(
|
_endInvokeDispatchException = LoggerMessage.Define(
|
||||||
LogLevel.Debug,
|
LogLevel.Debug,
|
||||||
EventIds.EndInvokeDispatchException,
|
EventIds.EndInvokeDispatchException,
|
||||||
|
|
@ -488,22 +776,38 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
_locationChange = LoggerMessage.Define<string, string>(
|
_locationChange = LoggerMessage.Define<string, string>(
|
||||||
LogLevel.Debug,
|
LogLevel.Debug,
|
||||||
EventIds.LocationChange,
|
EventIds.LocationChange,
|
||||||
"Location changing to {URI} in {CircuitId}.");
|
"Location changing to {URI} in circuit {CircuitId}.");
|
||||||
|
|
||||||
_locationChangeSucceeded = LoggerMessage.Define<string, string>(
|
_locationChangeSucceeded = LoggerMessage.Define<string, string>(
|
||||||
LogLevel.Debug,
|
LogLevel.Debug,
|
||||||
EventIds.LocationChangeSucceded,
|
EventIds.LocationChangeSucceded,
|
||||||
"Location change to {URI} in {CircuitId} succeded.");
|
"Location change to {URI} in circuit {CircuitId} succeded.");
|
||||||
|
|
||||||
_locationChangeFailed = LoggerMessage.Define<string, string>(
|
_locationChangeFailed = LoggerMessage.Define<string, string>(
|
||||||
LogLevel.Debug,
|
LogLevel.Debug,
|
||||||
EventIds.LocationChangeFailed,
|
EventIds.LocationChangeFailed,
|
||||||
"Location change to {URI} in {CircuitId} failed.");
|
"Location change to {URI} in circuit {CircuitId} failed.");
|
||||||
|
|
||||||
|
_locationChangeFailedInCircuit = LoggerMessage.Define<string, string>(
|
||||||
|
LogLevel.Error,
|
||||||
|
EventIds.LocationChangeFailed,
|
||||||
|
"Location change to {URI} in circuit {CircuitId} failed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void UnhandledExceptionInvokingCircuitHandler(ILogger logger, CircuitHandler handler, string handlerMethod, Exception exception)
|
public static void InitializationStarted(ILogger logger) =>_intializationStarted(logger, null);
|
||||||
|
public static void InitializationSucceeded(ILogger logger) => _intializationSucceded(logger, null);
|
||||||
|
public static void InitializationFailed(ILogger logger, Exception exception) => _intializationFailed(logger, exception);
|
||||||
|
public static void DisposeStarted(ILogger logger, string circuitId) => _disposeStarted(logger, circuitId, null);
|
||||||
|
public static void DisposeSucceeded(ILogger logger, string circuitId) => _disposeSucceded(logger, circuitId, null);
|
||||||
|
public static void DisposeFailed(ILogger logger, string circuitId, Exception exception) => _disposeFailed(logger, circuitId, exception);
|
||||||
|
public static void CircuitOpened(ILogger logger, string circuitId) => _onCircuitOpened(logger, circuitId, null);
|
||||||
|
public static void ConnectionUp(ILogger logger, string circuitId, string connectionId) => _onConnectionUp(logger, circuitId, connectionId, null);
|
||||||
|
public static void ConnectionDown(ILogger logger, string circuitId, string connectionId) => _onConnectionDown(logger, circuitId, connectionId, null);
|
||||||
|
public static void CircuitClosed(ILogger logger, string circuitId) => _onCircuitClosed(logger, circuitId, null);
|
||||||
|
|
||||||
|
public static void CircuitHandlerFailed(ILogger logger, CircuitHandler handler, string handlerMethod, Exception exception)
|
||||||
{
|
{
|
||||||
_unhandledExceptionInvokingCircuitHandler(
|
_circuitHandlerFailed(
|
||||||
logger,
|
logger,
|
||||||
handler.GetType(),
|
handler.GetType(),
|
||||||
handlerMethod,
|
handlerMethod,
|
||||||
|
|
@ -511,27 +815,12 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
exception);
|
exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DisposingCircuit(ILogger logger, string circuitId) => _disposingCircuit(logger, circuitId, null);
|
public static void CircuitUnhandledException(ILogger logger, string circuitId, Exception exception) => _circuitUnhandledException(logger, circuitId, exception);
|
||||||
|
public static void CircuitUnhandledExceptionFailed(ILogger logger, string circuitId, Exception exception) => _circuitUnhandledExceptionFailed(logger, circuitId, exception);
|
||||||
public static void CircuitOpened(ILogger logger, string circuitId) => _onCircuitOpened(logger, circuitId, null);
|
|
||||||
|
|
||||||
public static void ConnectionUp(ILogger logger, string circuitId, string connectionId) =>
|
|
||||||
_onConnectionUp(logger, circuitId, connectionId, null);
|
|
||||||
|
|
||||||
public static void ConnectionDown(ILogger logger, string circuitId, string connectionId) =>
|
|
||||||
_onConnectionDown(logger, circuitId, connectionId, null);
|
|
||||||
|
|
||||||
public static void CircuitClosed(ILogger logger, string circuitId) =>
|
|
||||||
_onCircuitClosed(logger, circuitId, null);
|
|
||||||
|
|
||||||
public static void EndInvokeDispatchException(ILogger logger, Exception ex) => _endInvokeDispatchException(logger, ex);
|
public static void EndInvokeDispatchException(ILogger logger, Exception ex) => _endInvokeDispatchException(logger, ex);
|
||||||
|
|
||||||
public static void EndInvokeJSFailed(ILogger logger, long asyncHandle, string arguments) => _endInvokeJSFailed(logger, asyncHandle, arguments, null);
|
public static void EndInvokeJSFailed(ILogger logger, long asyncHandle, string arguments) => _endInvokeJSFailed(logger, asyncHandle, arguments, null);
|
||||||
|
|
||||||
public static void EndInvokeJSSucceeded(ILogger logger, long asyncCall) => _endInvokeJSSucceeded(logger, asyncCall, null);
|
public static void EndInvokeJSSucceeded(ILogger logger, long asyncCall) => _endInvokeJSSucceeded(logger, asyncCall, null);
|
||||||
|
|
||||||
public static void DispatchEventFailedToParseEventData(ILogger logger, Exception ex) => _dispatchEventFailedToParseEventData(logger, ex);
|
public static void DispatchEventFailedToParseEventData(ILogger logger, Exception ex) => _dispatchEventFailedToParseEventData(logger, ex);
|
||||||
|
|
||||||
public static void DispatchEventFailedToDispatchEvent(ILogger logger, string eventHandlerId, Exception ex) => _dispatchEventFailedToDispatchEvent(logger, eventHandlerId ?? "", ex);
|
public static void DispatchEventFailedToDispatchEvent(ILogger logger, string eventHandlerId, Exception ex) => _dispatchEventFailedToDispatchEvent(logger, eventHandlerId ?? "", ex);
|
||||||
|
|
||||||
public static void BeginInvokeDotNet(ILogger logger, string callId, string assemblyName, string methodIdentifier, long dotNetObjectId)
|
public static void BeginInvokeDotNet(ILogger logger, string callId, string assemblyName, string methodIdentifier, long dotNetObjectId)
|
||||||
|
|
@ -546,11 +835,22 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void LocationChange(ILogger logger, string circuitId, string uri) => _locationChange(logger, circuitId, uri, null);
|
public static void BeginInvokeDotNetFailed(ILogger logger, string callId, string assemblyName, string methodIdentifier, long dotNetObjectId, Exception exception)
|
||||||
|
{
|
||||||
|
if (assemblyName != null)
|
||||||
|
{
|
||||||
|
_beginInvokeDotNetStaticFailed(logger, methodIdentifier, assemblyName, callId, null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_beginInvokeDotNetInstanceFailed(logger, methodIdentifier, dotNetObjectId, callId, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void LocationChangeSucceeded(ILogger logger, string circuitId, string uri) => _locationChangeSucceeded(logger, circuitId, uri, null);
|
public static void LocationChange(ILogger logger, string uri, string circuitId) => _locationChange(logger, uri, circuitId, null);
|
||||||
|
public static void LocationChangeSucceeded(ILogger logger, string uri, string circuitId) => _locationChangeSucceeded(logger, uri, circuitId, null);
|
||||||
public static void LocationChangeFailed(ILogger logger, string circuitId, string uri, Exception exception) => _locationChangeFailed(logger, circuitId, uri, exception);
|
public static void LocationChangeFailed(ILogger logger, string uri, string circuitId, Exception exception) => _locationChangeFailed(logger, uri, circuitId, exception);
|
||||||
|
public static void LocationChangeFailedInCircuit(ILogger logger, string uri, string circuitId, Exception exception) => _locationChangeFailedInCircuit(logger, uri, circuitId, exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,10 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
// This will likely never happen, except perhaps in unit tests, since CircuitIds are unique.
|
// This will likely never happen, except perhaps in unit tests, since CircuitIds are unique.
|
||||||
throw new ArgumentException($"Circuit with identity {circuitHost.CircuitId} is already registered.");
|
throw new ArgumentException($"Circuit with identity {circuitHost.CircuitId} is already registered.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Register for unhandled exceptions from the circuit. The registry is responsible for tearing
|
||||||
|
// down the circuit on errors.
|
||||||
|
circuitHost.UnhandledException += CircuitHost_UnhandledException;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual Task DisconnectAsync(CircuitHost circuitHost, string connectionId)
|
public virtual Task DisconnectAsync(CircuitHost circuitHost, string connectionId)
|
||||||
|
|
@ -154,6 +158,16 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
DisconnectedCircuits.Set(circuitHost.CircuitId, entry, entryOptions);
|
DisconnectedCircuits.Set(circuitHost.CircuitId, entry, entryOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConnectAsync is called from the CircuitHub - but the error handling story is a little bit complicated.
|
||||||
|
// We return the circuit from this method, but need to clean up the circuit on failure. So we don't want to
|
||||||
|
// throw from this method because we don't want to return a *failed* circuit.
|
||||||
|
//
|
||||||
|
// The solution is to handle exceptions here, and then return null to represent failure.
|
||||||
|
//
|
||||||
|
// 1. If the circuit id is invalue return null
|
||||||
|
// 2. If the circuit is not found return null
|
||||||
|
// 3. If the circuit is found, but fails to connect, we need to dispose it here and return null
|
||||||
|
// 4. If everything goes well, return the circuit.
|
||||||
public virtual async Task<CircuitHost> ConnectAsync(string circuitId, IClientProxy clientProxy, string connectionId, CancellationToken cancellationToken)
|
public virtual async Task<CircuitHost> ConnectAsync(string circuitId, IClientProxy clientProxy, string connectionId, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Log.CircuitConnectStarted(_logger, circuitId);
|
Log.CircuitConnectStarted(_logger, circuitId);
|
||||||
|
|
@ -169,6 +183,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
|
|
||||||
Task circuitHandlerTask;
|
Task circuitHandlerTask;
|
||||||
|
|
||||||
|
// We don't expect any of the logic inside the lock to throw, or run user code.
|
||||||
lock (CircuitRegistryLock)
|
lock (CircuitRegistryLock)
|
||||||
{
|
{
|
||||||
// Transition the host from disconnected to connected if it's available. In this critical section, we return
|
// Transition the host from disconnected to connected if it's available. In this critical section, we return
|
||||||
|
|
@ -188,7 +203,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
// b) out of order connection-up \ connection-down events e.g. a client that disconnects as soon it finishes reconnecting.
|
// b) out of order connection-up \ connection-down events e.g. a client that disconnects as soon it finishes reconnecting.
|
||||||
|
|
||||||
// Dispatch the circuit handlers inside the sync context to ensure the order of execution. CircuitHost executes circuit handlers inside of
|
// Dispatch the circuit handlers inside the sync context to ensure the order of execution. CircuitHost executes circuit handlers inside of
|
||||||
//
|
// the sync context.
|
||||||
circuitHandlerTask = circuitHost.Renderer.Dispatcher.InvokeAsync(async () =>
|
circuitHandlerTask = circuitHost.Renderer.Dispatcher.InvokeAsync(async () =>
|
||||||
{
|
{
|
||||||
if (previouslyConnected)
|
if (previouslyConnected)
|
||||||
|
|
@ -200,13 +215,22 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
|
|
||||||
await circuitHost.OnConnectionUpAsync(cancellationToken);
|
await circuitHost.OnConnectionUpAsync(cancellationToken);
|
||||||
});
|
});
|
||||||
|
|
||||||
Log.ReconnectionSucceeded(_logger, circuitId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await circuitHandlerTask;
|
try
|
||||||
|
{
|
||||||
|
await circuitHandlerTask;
|
||||||
|
Log.ReconnectionSucceeded(_logger, circuitId);
|
||||||
|
return circuitHost;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.FailedToReconnectToCircuit(_logger, circuitId, ex);
|
||||||
|
await TerminateAsync(circuitId);
|
||||||
|
|
||||||
return circuitHost;
|
// Return null on failure, because we need to clean up the circuit.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual (CircuitHost circuitHost, bool previouslyConnected) ConnectCore(string circuitId, IClientProxy clientProxy, string connectionId)
|
protected virtual (CircuitHost circuitHost, bool previouslyConnected) ConnectCore(string circuitId, IClientProxy clientProxy, string connectionId)
|
||||||
|
|
@ -268,6 +292,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
entry.CircuitHost.UnhandledException -= CircuitHost_UnhandledException;
|
||||||
await entry.CircuitHost.DisposeAsync();
|
await entry.CircuitHost.DisposeAsync();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
@ -288,7 +313,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ValueTask Terminate(string circuitId)
|
public ValueTask TerminateAsync(string circuitId)
|
||||||
{
|
{
|
||||||
CircuitHost circuitHost;
|
CircuitHost circuitHost;
|
||||||
DisconnectedCircuitEntry entry = default;
|
DisconnectedCircuitEntry entry = default;
|
||||||
|
|
@ -302,13 +327,33 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
Log.CircuitDisconnectedPermanently(_logger, circuitHost.CircuitId);
|
Log.CircuitDisconnectedPermanently(_logger, circuitHost.CircuitId);
|
||||||
circuitHost.Client.SetDisconnected();
|
circuitHost.Client.SetDisconnected();
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
return default;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return circuitHost?.DisposeAsync() ?? default;
|
if (circuitHost != null)
|
||||||
|
{
|
||||||
|
circuitHost.UnhandledException -= CircuitHost_UnhandledException;
|
||||||
|
return circuitHost.DisposeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
return default;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We don't need to do anything with the exception here, logging and sending exceptions to the client
|
||||||
|
// is done inside the circuit host.
|
||||||
|
private async void CircuitHost_UnhandledException(object sender, UnhandledExceptionEventArgs e)
|
||||||
|
{
|
||||||
|
var circuitHost = (CircuitHost)sender;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// This will dispose the circuit and remove it from the registry.
|
||||||
|
await TerminateAsync(circuitHost.CircuitId);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// We don't expect TerminateAsync to throw, but we want exceptions here for completeness.
|
||||||
|
Log.CircuitExceptionHandlerFailed(_logger, circuitHost.CircuitId, ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly struct DisconnectedCircuitEntry
|
private readonly struct DisconnectedCircuitEntry
|
||||||
|
|
@ -339,6 +384,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
private static readonly Action<ILogger, string, Exception> _circuitMarkedDisconnected;
|
private static readonly Action<ILogger, string, Exception> _circuitMarkedDisconnected;
|
||||||
private static readonly Action<ILogger, string, Exception> _circuitDisconnectedPermanently;
|
private static readonly Action<ILogger, string, Exception> _circuitDisconnectedPermanently;
|
||||||
private static readonly Action<ILogger, string, EvictionReason, Exception> _circuitEvicted;
|
private static readonly Action<ILogger, string, EvictionReason, Exception> _circuitEvicted;
|
||||||
|
private static readonly Action<ILogger, string, Exception> _circuitExceptionHandlerFailed;
|
||||||
|
|
||||||
private static class EventIds
|
private static class EventIds
|
||||||
{
|
{
|
||||||
|
|
@ -355,6 +401,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
public static readonly EventId CircuitMarkedDisconnected = new EventId(110, "CircuitMarkedDisconnected");
|
public static readonly EventId CircuitMarkedDisconnected = new EventId(110, "CircuitMarkedDisconnected");
|
||||||
public static readonly EventId CircuitEvicted = new EventId(111, "CircuitEvicted");
|
public static readonly EventId CircuitEvicted = new EventId(111, "CircuitEvicted");
|
||||||
public static readonly EventId CircuitDisconnectedPermanently = new EventId(112, "CircuitDisconnectedPermanently");
|
public static readonly EventId CircuitDisconnectedPermanently = new EventId(112, "CircuitDisconnectedPermanently");
|
||||||
|
public static readonly EventId CircuitExceptionHandlerFailed = new EventId(113, "CircuitExceptionHandlerFailed");
|
||||||
}
|
}
|
||||||
|
|
||||||
static Log()
|
static Log()
|
||||||
|
|
@ -428,6 +475,11 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
LogLevel.Debug,
|
LogLevel.Debug,
|
||||||
EventIds.CircuitEvicted,
|
EventIds.CircuitEvicted,
|
||||||
"Circuit with id {CircuitId} evicted due to {EvictionReason}.");
|
"Circuit with id {CircuitId} evicted due to {EvictionReason}.");
|
||||||
|
|
||||||
|
_circuitExceptionHandlerFailed = LoggerMessage.Define<string>(
|
||||||
|
LogLevel.Error,
|
||||||
|
EventIds.CircuitExceptionHandlerFailed,
|
||||||
|
"Exception handler for {CircuitId} failed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void UnhandledExceptionDisposingCircuitHost(ILogger logger, Exception exception) =>
|
public static void UnhandledExceptionDisposingCircuitHost(ILogger logger, Exception exception) =>
|
||||||
|
|
@ -448,8 +500,8 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
public static void ConnectingToDisconnectedCircuit(ILogger logger, string circuitId, string connectionId) =>
|
public static void ConnectingToDisconnectedCircuit(ILogger logger, string circuitId, string connectionId) =>
|
||||||
_connectingToDisconnectedCircuit(logger, circuitId, connectionId, null);
|
_connectingToDisconnectedCircuit(logger, circuitId, connectionId, null);
|
||||||
|
|
||||||
public static void FailedToReconnectToCircuit(ILogger logger, string circuitId) =>
|
public static void FailedToReconnectToCircuit(ILogger logger, string circuitId, Exception exception = null) =>
|
||||||
_failedToReconnectToCircuit(logger, circuitId, null);
|
_failedToReconnectToCircuit(logger, circuitId, exception);
|
||||||
|
|
||||||
public static void ReconnectionSucceeded(ILogger logger, string circuitId) =>
|
public static void ReconnectionSucceeded(ILogger logger, string circuitId) =>
|
||||||
_reconnectionSucceeded(logger, circuitId, null);
|
_reconnectionSucceeded(logger, circuitId, null);
|
||||||
|
|
@ -471,6 +523,9 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
|
|
||||||
public static void CircuitEvicted(ILogger logger, string circuitId, EvictionReason evictionReason) =>
|
public static void CircuitEvicted(ILogger logger, string circuitId, EvictionReason evictionReason) =>
|
||||||
_circuitEvicted(logger, circuitId, evictionReason, null);
|
_circuitEvicted(logger, circuitId, evictionReason, null);
|
||||||
|
|
||||||
|
public static void CircuitExceptionHandlerFailed(ILogger logger, string circuitId, Exception exception) =>
|
||||||
|
_circuitExceptionHandlerFailed(logger, circuitId, exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,9 @@ using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using System.Text.Encodings.Web;
|
using System.Text.Encodings.Web;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Components.Web;
|
|
||||||
using Microsoft.AspNetCore.Components.Web.Rendering;
|
|
||||||
using Microsoft.AspNetCore.Components.Routing;
|
using Microsoft.AspNetCore.Components.Routing;
|
||||||
|
using Microsoft.AspNetCore.Components.Web.Rendering;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Http.Features;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
|
@ -23,9 +20,9 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
{
|
{
|
||||||
private readonly IServiceScopeFactory _scopeFactory;
|
private readonly IServiceScopeFactory _scopeFactory;
|
||||||
private readonly ILoggerFactory _loggerFactory;
|
private readonly ILoggerFactory _loggerFactory;
|
||||||
private readonly ILogger _logger;
|
|
||||||
private readonly CircuitIdFactory _circuitIdFactory;
|
private readonly CircuitIdFactory _circuitIdFactory;
|
||||||
private readonly CircuitOptions _options;
|
private readonly CircuitOptions _options;
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
public DefaultCircuitFactory(
|
public DefaultCircuitFactory(
|
||||||
IServiceScopeFactory scopeFactory,
|
IServiceScopeFactory scopeFactory,
|
||||||
|
|
@ -34,10 +31,11 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
IOptions<CircuitOptions> options)
|
IOptions<CircuitOptions> options)
|
||||||
{
|
{
|
||||||
_scopeFactory = scopeFactory ?? throw new ArgumentNullException(nameof(scopeFactory));
|
_scopeFactory = scopeFactory ?? throw new ArgumentNullException(nameof(scopeFactory));
|
||||||
_loggerFactory = loggerFactory;
|
_loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
|
||||||
_logger = _loggerFactory.CreateLogger<CircuitFactory>();
|
|
||||||
_circuitIdFactory = circuitIdFactory ?? throw new ArgumentNullException(nameof(circuitIdFactory));
|
_circuitIdFactory = circuitIdFactory ?? throw new ArgumentNullException(nameof(circuitIdFactory));
|
||||||
_options = options.Value;
|
_options = options?.Value ?? throw new ArgumentNullException(nameof(options));
|
||||||
|
|
||||||
|
_logger = _loggerFactory.CreateLogger<DefaultCircuitFactory>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override CircuitHost CreateCircuitHost(
|
public override CircuitHost CreateCircuitHost(
|
||||||
|
|
@ -49,10 +47,9 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
{
|
{
|
||||||
// We do as much intialization as possible eagerly in this method, which makes the error handling
|
// We do as much intialization as possible eagerly in this method, which makes the error handling
|
||||||
// story much simpler. If we throw from here, it's handled inside the initial hub method.
|
// story much simpler. If we throw from here, it's handled inside the initial hub method.
|
||||||
var components = ResolveComponentMetadata(httpContext, client);
|
var components = ResolveComponentMetadata(httpContext);
|
||||||
|
|
||||||
var scope = _scopeFactory.CreateScope();
|
var scope = _scopeFactory.CreateScope();
|
||||||
var encoder = scope.ServiceProvider.GetRequiredService<HtmlEncoder>();
|
|
||||||
var jsRuntime = (RemoteJSRuntime)scope.ServiceProvider.GetRequiredService<IJSRuntime>();
|
var jsRuntime = (RemoteJSRuntime)scope.ServiceProvider.GetRequiredService<IJSRuntime>();
|
||||||
var componentContext = (RemoteComponentContext)scope.ServiceProvider.GetRequiredService<IComponentContext>();
|
var componentContext = (RemoteComponentContext)scope.ServiceProvider.GetRequiredService<IComponentContext>();
|
||||||
jsRuntime.Initialize(client);
|
jsRuntime.Initialize(client);
|
||||||
|
|
@ -78,7 +75,6 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
_options,
|
_options,
|
||||||
jsRuntime,
|
jsRuntime,
|
||||||
client,
|
client,
|
||||||
encoder,
|
|
||||||
_loggerFactory.CreateLogger<RemoteRenderer>());
|
_loggerFactory.CreateLogger<RemoteRenderer>());
|
||||||
|
|
||||||
var circuitHandlers = scope.ServiceProvider.GetServices<CircuitHandler>()
|
var circuitHandlers = scope.ServiceProvider.GetServices<CircuitHandler>()
|
||||||
|
|
@ -88,6 +84,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
var circuitHost = new CircuitHost(
|
var circuitHost = new CircuitHost(
|
||||||
_circuitIdFactory.CreateCircuitId(),
|
_circuitIdFactory.CreateCircuitId(),
|
||||||
scope,
|
scope,
|
||||||
|
_options,
|
||||||
client,
|
client,
|
||||||
renderer,
|
renderer,
|
||||||
components,
|
components,
|
||||||
|
|
@ -103,28 +100,17 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
return circuitHost;
|
return circuitHost;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static List<ComponentDescriptor> ResolveComponentMetadata(HttpContext httpContext, CircuitClientProxy client)
|
public static IReadOnlyList<ComponentDescriptor> ResolveComponentMetadata(HttpContext httpContext)
|
||||||
{
|
{
|
||||||
if (!client.Connected)
|
var endpoint = httpContext.GetEndpoint();
|
||||||
|
if (endpoint == null)
|
||||||
{
|
{
|
||||||
// This is the prerendering case. Descriptors will be registered by the prerenderer.
|
throw new InvalidOperationException(
|
||||||
return new List<ComponentDescriptor>();
|
$"{nameof(ComponentHub)} doesn't have an associated endpoint. " +
|
||||||
|
"Use 'app.UseEndpoints(endpoints => endpoints.MapBlazorHub<App>(\"app\"))' to register your hub.");
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
var endpointFeature = httpContext.Features.Get<IEndpointFeature>();
|
|
||||||
var endpoint = endpointFeature?.Endpoint;
|
|
||||||
if (endpoint == null)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException(
|
|
||||||
$"{nameof(ComponentHub)} doesn't have an associated endpoint. " +
|
|
||||||
"Use 'app.UseEndpoints(endpoints => endpoints.MapBlazorHub<App>(\"app\"))' to register your hub.");
|
|
||||||
}
|
|
||||||
|
|
||||||
var componentsMetadata = endpoint.Metadata.OfType<ComponentDescriptor>().ToList();
|
return endpoint.Metadata.GetOrderedMetadata<ComponentDescriptor>();
|
||||||
|
|
||||||
return componentsMetadata;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class Log
|
private static class Log
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.Encodings.Web;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Components.Rendering;
|
using Microsoft.AspNetCore.Components.Rendering;
|
||||||
|
|
@ -17,7 +16,7 @@ using Microsoft.JSInterop;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components.Web.Rendering
|
namespace Microsoft.AspNetCore.Components.Web.Rendering
|
||||||
{
|
{
|
||||||
internal class RemoteRenderer : HtmlRenderer
|
internal class RemoteRenderer : Renderer
|
||||||
{
|
{
|
||||||
private static readonly Task CanceledTask = Task.FromCanceled(new CancellationToken(canceled: true));
|
private static readonly Task CanceledTask = Task.FromCanceled(new CancellationToken(canceled: true));
|
||||||
|
|
||||||
|
|
@ -43,9 +42,8 @@ namespace Microsoft.AspNetCore.Components.Web.Rendering
|
||||||
CircuitOptions options,
|
CircuitOptions options,
|
||||||
IJSRuntime jsRuntime,
|
IJSRuntime jsRuntime,
|
||||||
CircuitClientProxy client,
|
CircuitClientProxy client,
|
||||||
HtmlEncoder encoder,
|
|
||||||
ILogger logger)
|
ILogger logger)
|
||||||
: base(serviceProvider, loggerFactory, encoder.Encode)
|
: base(serviceProvider, loggerFactory)
|
||||||
{
|
{
|
||||||
_jsRuntime = jsRuntime;
|
_jsRuntime = jsRuntime;
|
||||||
_client = client;
|
_client = client;
|
||||||
|
|
@ -286,7 +284,15 @@ namespace Microsoft.AspNetCore.Components.Web.Rendering
|
||||||
// missing.
|
// missing.
|
||||||
|
|
||||||
// We return the task in here, but the caller doesn't await it.
|
// We return the task in here, but the caller doesn't await it.
|
||||||
return Dispatcher.InvokeAsync(() => ProcessPendingRender());
|
return Dispatcher.InvokeAsync(() =>
|
||||||
|
{
|
||||||
|
// Now we're on the sync context, check again whether we got disposed since this
|
||||||
|
// work item was queued. If so there's nothing to do.
|
||||||
|
if (!_disposing)
|
||||||
|
{
|
||||||
|
ProcessPendingRender();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ using System;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.Components.Authorization;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components.Server
|
namespace Microsoft.AspNetCore.Components.Server
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.Components.Authorization;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components.Server
|
namespace Microsoft.AspNetCore.Components.Server
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -7,15 +7,35 @@ using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Components.Server.Circuits;
|
using Microsoft.AspNetCore.Components.Server.Circuits;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Http.Features;
|
using Microsoft.AspNetCore.Http.Features;
|
||||||
|
using Microsoft.AspNetCore.Routing;
|
||||||
using Microsoft.AspNetCore.SignalR;
|
using Microsoft.AspNetCore.SignalR;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Components.Server
|
namespace Microsoft.AspNetCore.Components.Server
|
||||||
{
|
{
|
||||||
/// <summary>
|
// Some notes about our expectations for error handling:
|
||||||
/// A SignalR hub that accepts connections to an ASP.NET Core Components application.
|
//
|
||||||
/// </summary>
|
// In general, we need to prevent any client from interacting with a circuit that's in an unpredictable
|
||||||
|
// state. This means that when a circuit throws an unhandled exception our top priority is to
|
||||||
|
// unregister and dispose the circuit. This will prevent any new dispatches from the client
|
||||||
|
// from making it into application code.
|
||||||
|
//
|
||||||
|
// As part of this process, we also notify the client (if there is one) of the error, and we
|
||||||
|
// *expect* a well-behaved client to disconnect. A malicious client can't be expected to disconnect,
|
||||||
|
// but since we've unregistered the circuit they won't be able to access it anyway. When a call
|
||||||
|
// comes into any hub method and the circuit has been disassociated, we will abort the connection.
|
||||||
|
// It's safe to assume that's the result of a race condition or misbehaving client.
|
||||||
|
//
|
||||||
|
// Now it's important to remember that we can only abort a connection as part of a hub method call.
|
||||||
|
// We can dispose a circuit in the background, but we have to deal with a possible race condition
|
||||||
|
// any time we try to acquire access to the circuit - because it could have gone away in the
|
||||||
|
// background - outside of the scope of a hub method.
|
||||||
|
//
|
||||||
|
// In general we author our Hub methods as async methods, but we fire-and-forget anything that
|
||||||
|
// needs access to the circuit/application state to unblock the message loop. Using async in our
|
||||||
|
// Hub methods allows us to ensure message delivery to the client before we abort the connection
|
||||||
|
// in error cases.
|
||||||
internal sealed class ComponentHub : Hub
|
internal sealed class ComponentHub : Hub
|
||||||
{
|
{
|
||||||
private static readonly object CircuitKey = new object();
|
private static readonly object CircuitKey = new object();
|
||||||
|
|
@ -24,10 +44,6 @@ namespace Microsoft.AspNetCore.Components.Server
|
||||||
private readonly CircuitOptions _options;
|
private readonly CircuitOptions _options;
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Intended for framework use only. Applications should not instantiate
|
|
||||||
/// this class directly.
|
|
||||||
/// </summary>
|
|
||||||
public ComponentHub(
|
public ComponentHub(
|
||||||
CircuitFactory circuitFactory,
|
CircuitFactory circuitFactory,
|
||||||
CircuitRegistry circuitRegistry,
|
CircuitRegistry circuitRegistry,
|
||||||
|
|
@ -45,24 +61,11 @@ namespace Microsoft.AspNetCore.Components.Server
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static PathString DefaultPath { get; } = "/_blazor";
|
public static PathString DefaultPath { get; } = "/_blazor";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// For unit testing only.
|
|
||||||
/// </summary>
|
|
||||||
// We store the circuit host in Context.Items which is tied to the lifetime of the underlying
|
|
||||||
// SignalR connection. There's no need to clean this up, it's a non-owning reference and it
|
|
||||||
// will go away when the connection does.
|
|
||||||
internal CircuitHost CircuitHost
|
|
||||||
{
|
|
||||||
get => (CircuitHost)Context.Items[CircuitKey];
|
|
||||||
private set => Context.Items[CircuitKey] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Intended for framework use only. Applications should not call this method directly.
|
|
||||||
/// </summary>
|
|
||||||
public override Task OnDisconnectedAsync(Exception exception)
|
public override Task OnDisconnectedAsync(Exception exception)
|
||||||
{
|
{
|
||||||
var circuitHost = CircuitHost;
|
// If the CircuitHost is gone now this isn't an error. This could happen if the disconnect
|
||||||
|
// if the result of well behaving client hanging up after an unhandled exception.
|
||||||
|
var circuitHost = GetCircuit();
|
||||||
if (circuitHost == null)
|
if (circuitHost == null)
|
||||||
{
|
{
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
|
@ -71,15 +74,16 @@ namespace Microsoft.AspNetCore.Components.Server
|
||||||
return _circuitRegistry.DisconnectAsync(circuitHost, Context.ConnectionId);
|
return _circuitRegistry.DisconnectAsync(circuitHost, Context.ConnectionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
public async ValueTask<string> StartCircuit(string baseUri, string uri)
|
||||||
/// Intended for framework use only. Applications should not call this method directly.
|
|
||||||
/// </summary>
|
|
||||||
public string StartCircuit(string baseUri, string uri)
|
|
||||||
{
|
{
|
||||||
if (CircuitHost != null)
|
var circuitHost = GetCircuit();
|
||||||
|
if (circuitHost != null)
|
||||||
{
|
{
|
||||||
Log.CircuitAlreadyInitialized(_logger, CircuitHost.CircuitId);
|
// This is an error condition and an attempt to bind multiple circuits to a single connection.
|
||||||
NotifyClientError(Clients.Caller, $"The circuit host '{CircuitHost.CircuitId}' has already been initialized.");
|
// We can reject this and terminate the connection.
|
||||||
|
Log.CircuitAlreadyInitialized(_logger, circuitHost.CircuitId);
|
||||||
|
await NotifyClientError(Clients.Caller, $"The circuit host '{circuitHost.CircuitId}' has already been initialized.");
|
||||||
|
Context.Abort();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -90,34 +94,33 @@ namespace Microsoft.AspNetCore.Components.Server
|
||||||
{
|
{
|
||||||
// We do some really minimal validation here to prevent obviously wrong data from getting in
|
// We do some really minimal validation here to prevent obviously wrong data from getting in
|
||||||
// without duplicating too much logic.
|
// without duplicating too much logic.
|
||||||
|
//
|
||||||
|
// This is an error condition attempting to initialize the circuit in a way that would fail.
|
||||||
|
// We can reject this and terminate the connection.
|
||||||
Log.InvalidInputData(_logger);
|
Log.InvalidInputData(_logger);
|
||||||
_ = NotifyClientError(Clients.Caller, $"The uris provided are invalid.");
|
await NotifyClientError(Clients.Caller, $"The uris provided are invalid.");
|
||||||
|
Context.Abort();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var circuitClient = new CircuitClientProxy(Clients.Caller, Context.ConnectionId);
|
// From this point, we can try to actually initialize the circuit.
|
||||||
if (DefaultCircuitFactory.ResolveComponentMetadata(Context.GetHttpContext(), circuitClient).Count == 0)
|
if (DefaultCircuitFactory.ResolveComponentMetadata(Context.GetHttpContext()).Count == 0)
|
||||||
{
|
{
|
||||||
var endpointFeature = Context.GetHttpContext().Features.Get<IEndpointFeature>();
|
|
||||||
var endpoint = endpointFeature?.Endpoint;
|
|
||||||
|
|
||||||
Log.NoComponentsRegisteredInEndpoint(_logger, endpoint.DisplayName);
|
|
||||||
|
|
||||||
// No components preregistered so return. This is totally normal if the components were prerendered.
|
// No components preregistered so return. This is totally normal if the components were prerendered.
|
||||||
|
Log.NoComponentsRegisteredInEndpoint(_logger, Context.GetHttpContext().GetEndpoint()?.DisplayName);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var circuitHost = _circuitFactory.CreateCircuitHost(
|
var circuitClient = new CircuitClientProxy(Clients.Caller, Context.ConnectionId);
|
||||||
|
circuitHost = _circuitFactory.CreateCircuitHost(
|
||||||
Context.GetHttpContext(),
|
Context.GetHttpContext(),
|
||||||
circuitClient,
|
circuitClient,
|
||||||
baseUri,
|
baseUri,
|
||||||
uri,
|
uri,
|
||||||
Context.User);
|
Context.User);
|
||||||
|
|
||||||
circuitHost.UnhandledException += CircuitHost_UnhandledException;
|
|
||||||
|
|
||||||
// Fire-and-forget the initialization process, because we can't block the
|
// Fire-and-forget the initialization process, because we can't block the
|
||||||
// SignalR message loop (we'd get a deadlock if any of the initialization
|
// SignalR message loop (we'd get a deadlock if any of the initialization
|
||||||
// logic relied on receiving a subsequent message from SignalR), and it will
|
// logic relied on receiving a subsequent message from SignalR), and it will
|
||||||
|
|
@ -127,141 +130,136 @@ namespace Microsoft.AspNetCore.Components.Server
|
||||||
// It's safe to *publish* the circuit now because nothing will be able
|
// It's safe to *publish* the circuit now because nothing will be able
|
||||||
// to run inside it until after InitializeAsync completes.
|
// to run inside it until after InitializeAsync completes.
|
||||||
_circuitRegistry.Register(circuitHost);
|
_circuitRegistry.Register(circuitHost);
|
||||||
CircuitHost = circuitHost;
|
SetCircuit(circuitHost);
|
||||||
return circuitHost.CircuitId;
|
return circuitHost.CircuitId;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
// If the circuit fails to initialize synchronously we can notify the client immediately
|
||||||
|
// and shut down the connection.
|
||||||
Log.CircuitInitializationFailed(_logger, ex);
|
Log.CircuitInitializationFailed(_logger, ex);
|
||||||
NotifyClientError(Clients.Caller, "The circuit failed to initialize.");
|
await NotifyClientError(Clients.Caller, "The circuit failed to initialize.");
|
||||||
|
Context.Abort();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
public async ValueTask<bool> ConnectCircuit(string circuitId)
|
||||||
/// Intended for framework use only. Applications should not call this method directly.
|
|
||||||
/// </summary>
|
|
||||||
public async Task<bool> ConnectCircuit(string circuitId)
|
|
||||||
{
|
{
|
||||||
|
// ConnectionAsync will not throw.
|
||||||
var circuitHost = await _circuitRegistry.ConnectAsync(circuitId, Clients.Caller, Context.ConnectionId, Context.ConnectionAborted);
|
var circuitHost = await _circuitRegistry.ConnectAsync(circuitId, Clients.Caller, Context.ConnectionId, Context.ConnectionAborted);
|
||||||
if (circuitHost != null)
|
if (circuitHost != null)
|
||||||
{
|
{
|
||||||
CircuitHost = circuitHost;
|
SetCircuit(circuitHost);
|
||||||
CircuitHost.UnhandledException += CircuitHost_UnhandledException;
|
|
||||||
|
|
||||||
circuitHost.SetCircuitUser(Context.User);
|
circuitHost.SetCircuitUser(Context.User);
|
||||||
circuitHost.SendPendingBatches();
|
circuitHost.SendPendingBatches();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we get here the circuit does not exist anymore. This is something that's valid for a client to
|
||||||
|
// recover from, and the client is not holding any resources right now other than the connection.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
public async ValueTask BeginInvokeDotNetFromJS(string callId, string assemblyName, string methodIdentifier, long dotNetObjectId, string argsJson)
|
||||||
/// Intended for framework use only. Applications should not call this method directly.
|
|
||||||
/// </summary>
|
|
||||||
public void BeginInvokeDotNetFromJS(string callId, string assemblyName, string methodIdentifier, long dotNetObjectId, string argsJson)
|
|
||||||
{
|
{
|
||||||
if (CircuitHost == null)
|
var circuitHost = await GetActiveCircuitAsync();
|
||||||
|
if (circuitHost == null)
|
||||||
{
|
{
|
||||||
Log.CircuitHostNotInitialized(_logger);
|
|
||||||
_ = NotifyClientError(Clients.Caller, "Circuit not initialized.");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = CircuitHost.BeginInvokeDotNetFromJS(callId, assemblyName, methodIdentifier, dotNetObjectId, argsJson);
|
_ = circuitHost.BeginInvokeDotNetFromJS(callId, assemblyName, methodIdentifier, dotNetObjectId, argsJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
public async ValueTask EndInvokeJSFromDotNet(long asyncHandle, bool succeeded, string arguments)
|
||||||
/// Intended for framework use only. Applications should not call this method directly.
|
|
||||||
/// </summary>
|
|
||||||
public void EndInvokeJSFromDotNet(long asyncHandle, bool succeeded, string arguments)
|
|
||||||
{
|
{
|
||||||
if (CircuitHost == null)
|
var circuitHost = await GetActiveCircuitAsync();
|
||||||
|
if (circuitHost == null)
|
||||||
{
|
{
|
||||||
Log.CircuitHostNotInitialized(_logger);
|
|
||||||
_ = NotifyClientError(Clients.Caller, "Circuit not initialized.");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = CircuitHost.EndInvokeJSFromDotNet(asyncHandle, succeeded, arguments);
|
_ = circuitHost.EndInvokeJSFromDotNet(asyncHandle, succeeded, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
public async ValueTask DispatchBrowserEvent(string eventDescriptor, string eventArgs)
|
||||||
/// Intended for framework use only. Applications should not call this method directly.
|
|
||||||
/// </summary>
|
|
||||||
public void DispatchBrowserEvent(string eventDescriptor, string eventArgs)
|
|
||||||
{
|
{
|
||||||
if (CircuitHost == null)
|
var circuitHost = await GetActiveCircuitAsync();
|
||||||
|
if (circuitHost == null)
|
||||||
{
|
{
|
||||||
Log.CircuitHostNotInitialized(_logger);
|
|
||||||
_ = NotifyClientError(Clients.Caller, "Circuit not initialized.");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = CircuitHost.DispatchEvent(eventDescriptor, eventArgs);
|
_ = circuitHost.DispatchEvent(eventDescriptor, eventArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
public async ValueTask OnRenderCompleted(long renderId, string errorMessageOrNull)
|
||||||
/// Intended for framework use only. Applications should not call this method directly.
|
|
||||||
/// </summary>
|
|
||||||
public void OnRenderCompleted(long renderId, string errorMessageOrNull)
|
|
||||||
{
|
{
|
||||||
if (CircuitHost == null)
|
var circuitHost = await GetActiveCircuitAsync();
|
||||||
|
if (circuitHost == null)
|
||||||
{
|
{
|
||||||
Log.CircuitHostNotInitialized(_logger);
|
|
||||||
NotifyClientError(Clients.Caller, "Circuit not initialized.");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.ReceivedConfirmationForBatch(_logger, renderId);
|
Log.ReceivedConfirmationForBatch(_logger, renderId);
|
||||||
_ = CircuitHost.Renderer.OnRenderCompleted(renderId, errorMessageOrNull);
|
_ = circuitHost.Renderer.OnRenderCompleted(renderId, errorMessageOrNull);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnLocationChanged(string uri, bool intercepted)
|
public async ValueTask OnLocationChanged(string uri, bool intercepted)
|
||||||
{
|
{
|
||||||
if (CircuitHost == null)
|
var circuitHost = await GetActiveCircuitAsync();
|
||||||
|
if (circuitHost == null)
|
||||||
{
|
{
|
||||||
Log.CircuitHostNotInitialized(_logger);
|
|
||||||
NotifyClientError(Clients.Caller, "Circuit not initialized.");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = CircuitHost.OnLocationChangedAsync(uri, intercepted);
|
_ = circuitHost.OnLocationChangedAsync(uri, intercepted);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void CircuitHost_UnhandledException(object sender, UnhandledExceptionEventArgs e)
|
// We store the CircuitHost through a *handle* here because Context.Items is tied to the lifetime
|
||||||
|
// of the connection. It's possible that a misbehaving client could cause disposal of a CircuitHost
|
||||||
|
// but keep a connection open indefinitely, preventing GC of the Circuit and related application state.
|
||||||
|
// Using a handle allows the CircuitHost to clear this reference in the background.
|
||||||
|
//
|
||||||
|
// See comment on error handling on the class definition.
|
||||||
|
private async ValueTask<CircuitHost> GetActiveCircuitAsync([CallerMemberName] string callSite = "")
|
||||||
{
|
{
|
||||||
var circuitHost = (CircuitHost)sender;
|
var handle = (CircuitHandle)Context.Items[CircuitKey];
|
||||||
var circuitId = circuitHost?.CircuitId;
|
var circuitHost = handle?.CircuitHost;
|
||||||
|
if (handle != null && circuitHost == null)
|
||||||
try
|
|
||||||
{
|
{
|
||||||
Log.UnhandledExceptionInCircuit(_logger, circuitId, (Exception)e.ExceptionObject);
|
// This can occur when a circuit host does not exist anymore due to an unhandled exception.
|
||||||
if (_options.DetailedErrors)
|
// We can reject this and terminate the connection.
|
||||||
{
|
Log.CircuitHostShutdown(_logger, callSite);
|
||||||
await NotifyClientError(circuitHost.Client, e.ExceptionObject.ToString());
|
await NotifyClientError(Clients.Caller, "Circuit has been shut down due to error.");
|
||||||
}
|
Context.Abort();
|
||||||
else
|
return null;
|
||||||
{
|
|
||||||
var message = $"There was an unhandled exception on the current circuit, so this circuit will be terminated. For more details turn on " +
|
|
||||||
$"detailed exceptions in '{typeof(CircuitOptions).Name}.{nameof(CircuitOptions.DetailedErrors)}'";
|
|
||||||
|
|
||||||
await NotifyClientError(circuitHost.Client, message);
|
|
||||||
}
|
|
||||||
|
|
||||||
// We generally can't abort the connection here since this is an async
|
|
||||||
// callback. The Hub has already been torn down. We'll rely on the
|
|
||||||
// client to abort the connection if we successfully transmit an error.
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
else if (circuitHost == null)
|
||||||
{
|
{
|
||||||
Log.FailedToTransmitException(_logger, circuitId, ex);
|
// This can occur when a circuit host does not exist anymore due to an unhandled exception.
|
||||||
|
// We can reject this and terminate the connection.
|
||||||
|
Log.CircuitHostNotInitialized(_logger, callSite);
|
||||||
|
await NotifyClientError(Clients.Caller, "Circuit not initialized.");
|
||||||
|
Context.Abort();
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return circuitHost;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Task NotifyClientError(IClientProxy client, string error) =>
|
private CircuitHost GetCircuit()
|
||||||
client.SendAsync("JS.Error", error);
|
{
|
||||||
|
return ((CircuitHandle)Context.Items[CircuitKey])?.CircuitHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetCircuit(CircuitHost circuitHost)
|
||||||
|
{
|
||||||
|
Context.Items[CircuitKey] = circuitHost?.Handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Task NotifyClientError(IClientProxy client, string error) => client.SendAsync("JS.Error", error);
|
||||||
|
|
||||||
private static class Log
|
private static class Log
|
||||||
{
|
{
|
||||||
|
|
@ -274,14 +272,14 @@ namespace Microsoft.AspNetCore.Components.Server
|
||||||
private static readonly Action<ILogger, string, Exception> _unhandledExceptionInCircuit =
|
private static readonly Action<ILogger, string, Exception> _unhandledExceptionInCircuit =
|
||||||
LoggerMessage.Define<string>(LogLevel.Warning, new EventId(3, "UnhandledExceptionInCircuit"), "Unhandled exception in circuit {CircuitId}");
|
LoggerMessage.Define<string>(LogLevel.Warning, new EventId(3, "UnhandledExceptionInCircuit"), "Unhandled exception in circuit {CircuitId}");
|
||||||
|
|
||||||
private static readonly Action<ILogger, string, Exception> _failedToTransmitException =
|
|
||||||
LoggerMessage.Define<string>(LogLevel.Debug, new EventId(4, "FailedToTransmitException"), "Failed to transmit exception to client in circuit {CircuitId}");
|
|
||||||
|
|
||||||
private static readonly Action<ILogger, string, Exception> _circuitAlreadyInitialized =
|
private static readonly Action<ILogger, string, Exception> _circuitAlreadyInitialized =
|
||||||
LoggerMessage.Define<string>(LogLevel.Debug, new EventId(5, "CircuitAlreadyInitialized"), "The circuit host '{CircuitId}' has already been initialized");
|
LoggerMessage.Define<string>(LogLevel.Debug, new EventId(4, "CircuitAlreadyInitialized"), "The circuit host '{CircuitId}' has already been initialized");
|
||||||
|
|
||||||
private static readonly Action<ILogger, string, Exception> _circuitHostNotInitialized =
|
private static readonly Action<ILogger, string, Exception> _circuitHostNotInitialized =
|
||||||
LoggerMessage.Define<string>(LogLevel.Debug, new EventId(6, "CircuitHostNotInitialized"), "Call to '{CallSite}' received before the circuit host initialization");
|
LoggerMessage.Define<string>(LogLevel.Debug, new EventId(5, "CircuitHostNotInitialized"), "Call to '{CallSite}' received before the circuit host initialization");
|
||||||
|
|
||||||
|
private static readonly Action<ILogger, string, Exception> _circuitHostShutdown =
|
||||||
|
LoggerMessage.Define<string>(LogLevel.Debug, new EventId(6, "CircuitHostShutdown"), "Call to '{CallSite}' received after the circuit was shut down");
|
||||||
|
|
||||||
private static readonly Action<ILogger, string, Exception> _circuitTerminatedGracefully =
|
private static readonly Action<ILogger, string, Exception> _circuitTerminatedGracefully =
|
||||||
LoggerMessage.Define<string>(LogLevel.Debug, new EventId(7, "CircuitTerminatedGracefully"), "Circuit '{CircuitId}' terminated gracefully");
|
LoggerMessage.Define<string>(LogLevel.Debug, new EventId(7, "CircuitTerminatedGracefully"), "Circuit '{CircuitId}' terminated gracefully");
|
||||||
|
|
@ -307,15 +305,12 @@ namespace Microsoft.AspNetCore.Components.Server
|
||||||
_unhandledExceptionInCircuit(logger, circuitId, exception);
|
_unhandledExceptionInCircuit(logger, circuitId, exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void FailedToTransmitException(ILogger logger, string circuitId, Exception transmissionException)
|
|
||||||
{
|
|
||||||
_failedToTransmitException(logger, circuitId, transmissionException);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void CircuitAlreadyInitialized(ILogger logger, string circuitId) => _circuitAlreadyInitialized(logger, circuitId, null);
|
public static void CircuitAlreadyInitialized(ILogger logger, string circuitId) => _circuitAlreadyInitialized(logger, circuitId, null);
|
||||||
|
|
||||||
public static void CircuitHostNotInitialized(ILogger logger, [CallerMemberName] string callSite = "") => _circuitHostNotInitialized(logger, callSite, null);
|
public static void CircuitHostNotInitialized(ILogger logger, [CallerMemberName] string callSite = "") => _circuitHostNotInitialized(logger, callSite, null);
|
||||||
|
|
||||||
|
public static void CircuitHostShutdown(ILogger logger, [CallerMemberName] string callSite = "") => _circuitHostShutdown(logger, callSite, null);
|
||||||
|
|
||||||
public static void CircuitTerminatedGracefully(ILogger logger, string circuitId) => _circuitTerminatedGracefully(logger, circuitId, null);
|
public static void CircuitTerminatedGracefully(ILogger logger, string circuitId) => _circuitTerminatedGracefully(logger, circuitId, null);
|
||||||
|
|
||||||
public static void InvalidInputData(ILogger logger, [CallerMemberName] string callSite = "") => _invalidInputData(logger, callSite, null);
|
public static void InvalidInputData(ILogger logger, [CallerMemberName] string callSite = "") => _invalidInputData(logger, callSite, null);
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
using System;
|
using System;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.AspNetCore.Components.Authorization;
|
||||||
using Microsoft.AspNetCore.Components.Routing;
|
using Microsoft.AspNetCore.Components.Routing;
|
||||||
using Microsoft.AspNetCore.Components.Server;
|
using Microsoft.AspNetCore.Components.Server;
|
||||||
using Microsoft.AspNetCore.Components.Server.BlazorPack;
|
using Microsoft.AspNetCore.Components.Server.BlazorPack;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netcoreapp3.0</TargetFramework>
|
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||||
|
|
@ -12,6 +12,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="Microsoft.AspNetCore.Components.Authorization" />
|
||||||
<Reference Include="Microsoft.AspNetCore.Components.Web" />
|
<Reference Include="Microsoft.AspNetCore.Components.Web" />
|
||||||
<Reference Include="Microsoft.AspNetCore.DataProtection" />
|
<Reference Include="Microsoft.AspNetCore.DataProtection" />
|
||||||
<Reference Include="Microsoft.AspNetCore.SignalR" />
|
<Reference Include="Microsoft.AspNetCore.SignalR" />
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,8 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text.Encodings.Web;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Components.Web;
|
|
||||||
using Microsoft.AspNetCore.Components.Web.Rendering;
|
using Microsoft.AspNetCore.Components.Web.Rendering;
|
||||||
using Microsoft.AspNetCore.SignalR;
|
using Microsoft.AspNetCore.SignalR;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
@ -38,10 +36,11 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
// Assert
|
// Assert
|
||||||
serviceScope.Verify(s => s.Dispose(), Times.Once());
|
serviceScope.Verify(s => s.Dispose(), Times.Once());
|
||||||
Assert.True(remoteRenderer.Disposed);
|
Assert.True(remoteRenderer.Disposed);
|
||||||
|
Assert.Null(circuitHost.Handle.CircuitHost);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task DisposeAsync_DisposesResourcesEvenIfCircuitHandlerOrComponentThrows()
|
public async Task DisposeAsync_DisposesResourcesAndSilencesException()
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var serviceScope = new Mock<IServiceScope>();
|
var serviceScope = new Mock<IServiceScope>();
|
||||||
|
|
@ -60,10 +59,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
circuitHost.Renderer.AssignRootComponentId(throwOnDisposeComponent);
|
circuitHost.Renderer.AssignRootComponentId(throwOnDisposeComponent);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
await Assert.ThrowsAsync<InvalidTimeZoneException>(async () =>
|
await circuitHost.DisposeAsync(); // Does not throw
|
||||||
{
|
|
||||||
await circuitHost.DisposeAsync();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.True(throwOnDisposeComponent.DidCallDispose);
|
Assert.True(throwOnDisposeComponent.DidCallDispose);
|
||||||
|
|
@ -181,7 +177,8 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
await initializeAsyncTask;
|
await initializeAsyncTask;
|
||||||
|
|
||||||
// Assert: The async exception was reported via the side-channel
|
// Assert: The async exception was reported via the side-channel
|
||||||
Assert.Same(ex, reportedErrors.Single().ExceptionObject);
|
var aex = Assert.IsType<AggregateException>(reportedErrors.Single().ExceptionObject);
|
||||||
|
Assert.Same(ex, aex.InnerExceptions.Single());
|
||||||
Assert.False(reportedErrors.Single().IsTerminating);
|
Assert.False(reportedErrors.Single().IsTerminating);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -239,7 +236,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
|
||||||
private class TestRemoteRenderer : RemoteRenderer
|
private class TestRemoteRenderer : RemoteRenderer
|
||||||
{
|
{
|
||||||
public TestRemoteRenderer(IServiceProvider serviceProvider, IJSRuntime jsRuntime, IClientProxy client)
|
public TestRemoteRenderer(IServiceProvider serviceProvider, IJSRuntime jsRuntime, IClientProxy client)
|
||||||
: base(serviceProvider, NullLoggerFactory.Instance, new CircuitOptions(), jsRuntime, new CircuitClientProxy(client, "connection"), HtmlEncoder.Default, NullLogger.Instance)
|
: base(serviceProvider, NullLoggerFactory.Instance, new CircuitOptions(), jsRuntime, new CircuitClientProxy(client, "connection"), NullLogger.Instance)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue