gRP C код из файла без Razor на стороне клиента Blazor никогда не завершается - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть клиент Blazor, размещенный в ASP. Net Core. В проекте Server у меня есть служба gRP C. Прототипы хранятся в общем проекте (на который ссылаются как Сервер, так и Клиент).

Это успешно работает, если я вызываю его из файла .razor. Я настраиваю клиента при запуске. 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);
        });

Вставить его в страницу бритвы -

@inject Abilities.AbilitiesClient AbilitiesClient

И загрузить коллекцию в init -

private IList<Ability> abilities;

protected override async Task OnInitializedAsync()
{
    abilities = (await AbilitiesClient.GetAbilitiesAsync(new Empty())).Abilities;
}

Работает без проблем! Но я не хочу втискивать все эти логи c в представление, поскольку у меня более десятка различных сервисов, поэтому я переместил их в класс помощников. Теперь вместо добавления клиента к сервисам при запуске я добавляю помощника -

services.AddSingleton(services =>
{
    return new Helpers.gRPCHelper(services.GetRequiredService<NavigationManager>().BaseUri);
});

В конструкторе помощника я добавляю базовый URI в приватную переменную, чтобы я мог раскрутить канал по требованию , В функции, которая вызывает службу gRP C, у меня есть следующее -

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");

В консоли браузера я вижу «Calling gRP C», но «Call Complete» никогда не бывает журнал. Браузер просто сидит, ждет, я сдался через 5 минут.

На стороне сервера я вижу вызываемый метод gRP C, я даже могу достичь точки останова в нем и убедиться, что он успешно завершается с результатами.

Я не вижу трафик c на вкладке сети веб-браузера (ни 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" />

Завершить вывод -

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

Обжал это немного больше прошлой ночью, и я вижу еще одну странность. Как только клиент делает вызов gRP C, браузер начинает загружать процессор, 25-35%. Edge в итоге выдаст ошибку «долго выполняющийся скрипт». Chrome эффективно зависает и должен быть принудительно закрыт. Я начинаю думать, что проект может быть потерян, я постараюсь создать упрощенную реализацию fre sh, чтобы посмотреть, смогу ли я заставить ее работать в уменьшенной кодовой базе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...