У меня есть клиент 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, чтобы посмотреть, смогу ли я заставить ее работать в уменьшенной кодовой базе.