Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core Blazor客户端中非Razor文件中的gRPC代码永远不会完成_Asp.net Core_Grpc_Blazor_Blazor Client Side - Fatal编程技术网

Asp.net core Blazor客户端中非Razor文件中的gRPC代码永远不会完成

Asp.net core Blazor客户端中非Razor文件中的gRPC代码永远不会完成,asp.net-core,grpc,blazor,blazor-client-side,Asp.net Core,Grpc,Blazor,Blazor Client Side,我有一个Blazor客户端托管在ASP.NETCore中。在服务器项目中,我有一个gRPC服务。proto存储在共享项目中(由服务器和客户端引用) 如果我从.razor文件调用它,它将成功运行。我在startup.ConfigureServices中设置了客户端- services.AddSingleton(services => { // Create a gRPC-Web channel pointing to the backend serve

我有一个Blazor客户端托管在ASP.NETCore中。在服务器项目中,我有一个gRPC服务。proto存储在共享项目中(由服务器和客户端引用)

如果我从.razor文件调用它,它将成功运行。我在startup.ConfigureServices中设置了客户端-

services.AddSingleton(services =>
        {
            // Create a gRPC-Web channel pointing to the backend server
            var httpClient = new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWeb, new HttpClientHandler()));
            var baseUri = services.GetRequiredService<NavigationManager>().BaseUri;
            var channel = GrpcChannel.ForAddress(baseUri, new GrpcChannelOptions { HttpClient = httpClient });

            // Now we can instantiate gRPC clients for this channel
            return new Abilities.AbilitiesClient(channel);
        });
并在init上加载集合-

private IList<Ability> abilities;

protected override async Task OnInitializedAsync()
{
    abilities = (await AbilitiesClient.GetAbilitiesAsync(new Empty())).Abilities;
}
在浏览器控制台中,我看到了“调用gRPC”,但“调用完成”从未被记录。浏览器只是坐着等待,5分钟后我就放弃了

在服务器端,我可以看到正在调用gRPC方法,我甚至可以在其中找到一个断点,并验证它是否成功地完成了结果

我在网络浏览器的“网络”选项卡中看不到流量(Chrome和Edge都没有)

我试着把最后期限定为10秒,但始终没有成功

这是所有的预览版本。所以我不确定我是否遇到了当前的限制,或者我是否做错了什么-

<PackageReference Include="Grpc.Net.Client.Web" Version="2.27.0-dev202001100801" />
<PackageReference Include="Microsoft.AspNetCore.Blazor" Version="3.1.0-preview4.19579.2" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.Build" Version="3.1.0-preview4.19579.2" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.1.0-preview4.19579.2" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.DevServer" Version="3.1.0-preview4.19579.2" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.Mono" Version="3.2.0-preview1.20052.1" />

昨晚我又在这里闲逛了一会儿,我看到了另一个奇怪的现象。客户端一调用gRPC,浏览器就开始占用CPU,占25-35%。Edge最终将弹出“长时间运行脚本”错误。Chrome有效悬挂,必须强制关闭。我开始认为这个项目可能会失败,我将尝试构建一个新的简化实现,看看能否在精简的代码库中工作

更新了对3.2的参考。仍然看到相同的行为。在重构代码之前,为什么要在助手类中调用
GetAbilities
,并调用
getabilitesasync
?我想同步版本挂起,你应该换成异步版本。想法不错,但行为相同:(客户端上的日志非常奇怪,就像您尝试在客户端而不是服务器上调用gRPC方法一样。看起来这与异步调用有关。我制作了一个精简的示例(),可以通过在异步和同步gRPC调用之间切换来重新创建行为。
services.AddSingleton(services =>
{
    return new Helpers.gRPCHelper(services.GetRequiredService<NavigationManager>().BaseUri);
});
var httpClient = new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWeb, new HttpClientHandler()));
var channel = GrpcChannel.ForAddress(_BaseURI, new GrpcChannelOptions { HttpClient = httpClient });
var abilityClient = new Abilities.AbilitiesClient(channel);
Console.WriteLine("Calling gRPC");             
var abilities = abilityClient.GetAbilities(new Empty(), null).Abilities;
Console.WriteLine("Call Complete");
<PackageReference Include="Grpc.Net.Client.Web" Version="2.27.0-dev202001100801" />
<PackageReference Include="Microsoft.AspNetCore.Blazor" Version="3.1.0-preview4.19579.2" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.Build" Version="3.1.0-preview4.19579.2" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.1.0-preview4.19579.2" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.DevServer" Version="3.1.0-preview4.19579.2" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.Mono" Version="3.2.0-preview1.20052.1" />
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2.0 POST https://localhost:44340/Ability.Abilities/GetAbilities application/grpc-web 5
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'gRPC - /Ability.Abilities/GetAbilities'
********************************************************************
GetAbilities Called!
********************************************************************
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 3.1.1 initialized 'Context' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (143ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT [a].[AbilityID], [a].[Icon], [a].[LongText], [a].[ShortText], [a].[Source], [a].[Title]
      FROM [Abilities] AS [a]
      ORDER BY [a].[Title]
********************************************************************
GetAbilities Complete!
********************************************************************
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'gRPC - /Ability.Abilities/GetAbilities'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 3555.6284ms 200 application/grpc-web