В Blazor WebAssembly в КПГР-Web

Для приложений, не более одной страницы, КПГРЫ-Web JSON-над-HTTP является удобной, высокоэффективной альтернативой.

Если вы уже знаете все о КПГРАХ и КПГРЫ-Web, вы можете перейти, чтобы добавить услугу КПГР в Blazor WebAssembly приложения. Если вы просто хотите, чтобы некоторые простой Blazor WebAssembly + КПГРЫ-веб-приложения, см склада https://github.com/SteveSandersonMS/BlazorGrpcSamples.

статус-кво

Со всеми технологиями другой браузер на основе одной страницы приложения (SPA), как и в Blazor WebAssembly, наиболее распространенный способ обмена данными и запуска серверных операций JSON-над-HTTP. Он очень прост: клиент, используя метод HTTP ранее согласованный запрос HTTP к предварительно согласованным URL, а затем сервер выполняет операцию, используя заранее согласованный код состояния HTTP и формат данных, заранее определенное с помощью JSON реагировать.

Этот метод, как правило, очень эффективен, так что люди, как правило, живут полноценной жизнью. Тем не менее, он также имеет два очевидных недостатков:

  • JSON это очень утомительно формат данных, он не оптимизирует пропускную способность.

  • Там нет никакого механизма, чтобы гарантировать, что все эту предварительно согласованную URL, HTTP методы, код состояния, и поэтому детали практически идентичны между сервером и клиентом.

Что такое КПГР?

КПГР является удаленный вызов процедур (RPC) механизм, первоначально разработанный Google. Для SPA, можно рассматривать как JSON-над-HTTP альтернатив. Она непосредственно фиксирует две уязвимости, перечисленные выше:

  • Он оптимизирован для минимизации сетевого трафика, эффективно передают двоичную последовательность сообщения

  • Вы можете гарантировать существование серверных и клиентских конечных точек во время компиляции, он согласился передавать и получать данные в форме, без указания каких-либо URL, коды состояния, и так далее.

Это как это сделать?

Для того, чтобы написать службу КПГР, вам необходимо написать .protoфайл, который представляет собой набор данных , независимый от языка , описывающих службу RPC и его форму. Отсюда, вы можете использовать любой язык для создания сильного типа серверных и клиентских классов , чтобы обеспечить соответствие Вашего согласия во время компиляции. Затем во время выполнения, процесс КПГР данных (транс) последовательность и допустимый формат ( по умолчанию Protobuf) переданных / принятых сообщений.

Другим большим преимуществом является то, что это не REST, так что вы не часто спорят со своими коллегами и метод, который HTTP код состояния в сцене является самым счастливым и удачливым. Это просто RPC, в наши истинные чувства, когда он был ребенком, хочет.

Почему не каждый, используя их КПГР в SPA?

Традиционно, КПГРЫ из приложения на основе браузера невозможно, так как КПГРЫ нужны HTTP / 2, и браузер не раскрывает какие-либо API, так что JS, WASM кода непосредственно контролировать 2 запрос HTTP /.

Но теперь есть решение! КПГР КПГРЫ-Web является расширением, которое позволяет КПГРЫ совместимого кода на основе браузера (Технически это через HTTP / 1.1 представляет собой запрос для выполнения способа КПГР). КПГР-Web не прижился, потому что до сих пор нет большого количества серверов или рамочный клиента, чтобы обеспечить поддержку.

ASP.NET Ядро версии 3.0 обеспечивает мощную поддержку КПГР. Теперь, на этой основе, мы предоставим предварительный просмотр поддержки КПГР-веб - сервер и клиент. Если вы хотите узнать более подробную информацию, вы можете просмотреть все Осознайте (в хорошем запросе тянуть от Джеймса Ньютона-короля https://github.com/grpc/grpc-dotnet/pull/695 ).

Добавить приложение службы КПГР к Blazor WebAssembly

Там нет шаблона проекта в этой области, поэтому поддержка КПГР добавлены к применению Blazor WebAssembly требует много шагов, эта статья подробно описана. Но хорошая новость заключается в том, что вам нужно сделать только один из этих параметров. Когда вы закончите с началом и работает, добавить больше конечных точек КПГР и называть их очень просто. Во- первых, так как КПГР-Web пакет еще не выпущен NuGet.org, теперь вам нужно добавить два временный источник управления пакетами для получения ночной просмотра. Вы можете добавить в корневом каталоге вашего решение NuGet.configфайлов. Я надеюсь , что через месяц или два не является необходимым.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <!--To inherit the global NuGet package sources remove the <clear/> line below -->
    <clear />
    <add key="nuget" value="https://api.nuget.org/v3/index.json" />
    <add key="gRPC-nightly" value="https://grpc.jfrog.io/grpc/api/nuget/v3/grpc-nuget-dev" />
    <add key="blazor-nightly" value="https://dotnetfeed.blob.core.windows.net/aspnet-blazor/index.json" />
  </packageSources>
</configuration>

Добавить услуги КПГР в управляемом приложении развернутого Blazor WebAssembly

Если вы уже хозяйничает приложение Blazor WebAssembly на сервере ASP.NET ядра, по умолчанию, у вас есть три проекта: клиент, сервер и общие проекты. Я нашел определение сервиса КПГР является наиболее удобным местом в общем проекте, так как он генерирует класс сервера и клиента доступны. Во- первых, редактировать ваши общие элементы , .csprojчтобы добавить необходимые ссылки пакет КПГР:

  <ItemGroup>
    <PackageReference Include="Google.Protobuf" Version="3.11.2" />
    <PackageReference Include="Grpc.Net.Client" Version="2.27.0-dev202001100801" />
    <PackageReference Include="Grpc.Tools" Version="2.27.0-dev202001081219">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>

Если эти пакеты не могут быть восстановлены должным образом, не забудьте добавить ночной источник.

Теперь вы можете создать .protoфайл , чтобы определить службу. Например, добавив именованные общий проект greet.protoфайлы. Она включает в себя следующее:

syntax = "proto3";
option csharp_namespace = "GrpcGreeter";
package greet;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Для КПГР инструмента здесь , чтобы сгенерировать серверные и клиентские классы, идут в общий проект .csprojи добавить следующее:

  <ItemGroup>
    <Protobuf Include="greet.proto" />
  </ItemGroup>

В этот момент раствор должен иметь возможность компилировать без ошибок.

Государственная служба из КПГР сервера

В своем проекте сервера, создайте файл с именем GreeterServiceнового класса содержит следующее:

using Grpc.Core;
using GrpcGreeter;

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
    {
        var reply = new HelloReply { Message = $"Hello from gRPC, {request.Name}!" };
        return Task.FromResult(reply);
    }
}

Этот класс наследует Greeter.GreeterBase, то из .protoавтоматически сгенерированного файла. Таким образом, при добавлении новой точки останова , чтобы .protoкогда вы будете иметь новый метод можно переписать здесь , чтобы обеспечить конкретную реализацию.

Последняя часть сервера является использование нового API , чтобы выставить его в качестве gRPC-Webслужбы. Для этого вам нужно ссылаться на пакет, так что ваш проект сервера .csproj, добавить ссылки на следующий пакет:

<PackageReference Include="Grpc.AspNetCore" Version="2.27.0-dev202001100801" />
<PackageReference Include="Grpc.AspNetCore.Web" Version="2.27.0-dev202001100801" />

Теперь в вашем сервере Startup.csфайл, изменить , ConfigureServicesчтобы добавить следующую строку:

  services.AddGrpc();

Примечание: Если вы только собираетесь открыть сервис КПГР, вы можете больше не нужен контроллер MVC, в этом случае, вы можете удалить его снизу services.AddMvc()и endpoints.MapDefaultControllerRoute().

Просто app.AddRouting();добавьте следующую строку в дальнейшем он будет обрабатывать запрос отображения входящего КПГРА-веб - сервер , чтобы сделать его похожим на просьбу КПГР:

  app.UseGrpcWeb();

И, наконец, app.UseEndpointsзарегистрировать блок операторов класса обслуживания КПГР-Web, и использовать следующую строку кода в верхней части формы блока:

  endpoints.MapGrpcService<GreeterService>().EnableGrpcWeb();

Таким образом, ваш КПГР-веб-сервер готов!

Использование услуг КПГР в клиенте

В клиентском проекте .csproj, необходимо добавить следующие две ночные ссылки пакета:

<PackageReference Include="Grpc.Net.Client.Web" Version="2.27.0-dev202001100801" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.Mono" Version="3.2.0-preview1.20052.1" />

Последнее представляет собой временное решение для устранения проблемы в Blazor WebAssembly, проблема будет решена в течение ближайших нескольких недель после первого просмотра. Если эти пакеты не могут вернуться к нормальной жизни, не забудьте добавить ночной источник.

Теперь установить систему инжекции зависимостей клиентского приложения , чтобы быть в состоянии предоставить GreeterClientпримеры. Это позволит вам звонить КПГР службы в любом месте в клиентском приложении. В клиентском проекте Startup.csв 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 Greeter.GreeterClient(channel);
});

Обратите внимание , что Greeter.GreeterClientиз .proto fileвашего созданного файла кода. Вам не придется вручную реализовать его! Но вы также должны добавить следующее заявление в использовании, так что код компилируется:

using GrpcGreeter;
using Grpc.Net.Client;
using Grpc.Net.Client.Web;
using Microsoft.AspNetCore.Components;
using System.Net.Http;

Мы почти закончили! Теперь есть рабочий сервер, и надеюсь иметь рабочий клиент. Нам просто нужно вызывать некоторые КПГРЫ от службы UI. Например, в вашем Index.razorфайле, замените следующее:

@page "/"
@using GrpcGreeter
@inject Greeter.GreeterClient GreeterClient

<h1>Invoke gRPC service</h1>

<p>
    <input @bind="yourName" placeholder="Type your name" />
    <button @οnclick="GetGreeting" class="btn btn-primary">Call gRPC service</button>
</p>

Server response: <strong>@serverResponse</strong>

@code {
    string yourName = "Bert";
    string serverResponse;

    async Task GetGreeting()
    {
        var request = new HelloRequest { Name = yourName };
        var reply = await GreeterClient.SayHelloAsync(request);
        serverResponse = reply.Message;
    }
}

Теперь попробуйте это в вашем браузере. Пользовательский интерфейс выглядит следующим образом:

Если вы захотите, чтобы просмотреть вкладку инструментов для разработчиков браузера сети, вы увидите его в передающем и принимающем двоичном сообщении Protobuf:

Резюме и примеры

Теперь у вас есть фундамент, если вы хотите, вы можете дополнительно использовать КПГРЫ над всеми данными обмениваемых между сервером и клиентом. КПГР инструмент будет генерировать все ваши передачи данных класса, чтобы повысить эффективность сетевого трафика, а также HTTP-над-JSON устранения неполадок URL, HTTP метод, последовательность кодов состояний и тому подобное.

Существует более подробный пример ( https://github.com/SteveSandersonMS/BlazorGrpcSamples/tree/master/Hosted ), это полный Blazor WebAssembly управляемого приложения, использование КПГР получить данные «прогноз погоды». Если вы заинтересованы в конкретных шагах , необходимых для КПГР-Web на основе решений от решений JSon основой по умолчанию для обновления см это точно отображать различия в отличии изменить то , что я сделал ( HTTPS: // GitHub. COM / SteveSandersonMS / BlazorGrpcSamples / фиксации / 72544c54085a35cd89aae20030d7f91d75317a2f ).

Добавить услугу КПГР в отдельное развертывание приложений Blazor WebAssembly

Если вы создаете чистый автономный Blazor WebAssembly приложения, а не размещаться в ASP.NET Ядра, то мы не можем иметь то , что вы бы делать какие - либо предположения сервера (что означает , что вы только разработать клиент, а сервер сценарии , разработанные другими). Мы можем только предположить , что вы хотите вызвать некоторую совместимость с КПГРАМИ-веб - службой конечной точкой, они могут быть выставлены на ASP.NET Core Services на других хостах, или вокруг друг друг КПГР посланника КПГР-веб - службах оберткой ( https://blog.envoyproxy.io/envoy-and-grpc-web-a-fresh-new-alternative-to-rest-6504ce7eb880 ). Здесь мы только забота настроить приложение Blazor WebAssembly , чтобы использовать его. Установите клиентское приложение и большинство вышеупомянутых шагов «удалось развертывание» такой же ситуации. Тем не менее, в некотором смысле, это немного сложнее, потому что мы не можем полагаться на некоторые предположения , которые мы сделали в «опеке» состоянии. Различия заключаются в следующем:

  • Доступ и использование .proto файла

    Предполагая , что ваши внешние службы сопровождающих КПГР могут предоставить эту услугу вы определили .protoфайл. Вы можете скопировать его на ваш клиентский проект и .csprojдобавьте ссылку на него в <Proto>записи. Для того , чтобы инструмент для работы, вам также необходимо добавить ссылку пакет , как это:

      <!-- Needed temporarily until the next Blazor WebAssembly preview release -->
      <PackageReference Include="Microsoft.AspNetCore.Blazor.Mono" Version="3.2.0-preview1.20052.1" />
    
      <!-- gRPC-Web packages -->
      <PackageReference Include="Google.Protobuf" Version="3.11.2" />
      <PackageReference Include="Grpc.Net.Client" Version="2.27.0-dev202001100801" />
      <PackageReference Include="Grpc.Net.Client.Web" Version="2.27.0-dev202001100801" />
      <PackageReference Include="Grpc.Tools" Version="2.27.0-dev202001081219">
        <PrivateAssets>all</PrivateAssets>
        <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      </PackageReference>
    
  • DI Настройка службы клиента

    И «управляемый хостинг» Похожая ситуация, вы будете добавлять код, чтобы добавить Startup.cs КПГР-клиент веб-сервис. Главное отличие в том, что вы должны знать, какой URL базы для доступа к внешним службам, потому что мы больше не можем предположить, что это то же самое с Base URL Базового URL хостинга для вашей стороны клиента службы приложения. Таким образом, ваша регистрационная служба DI может выглядеть так:

    services.AddSingleton(services =>
    {
    #if DEBUG
        var backendUrl = "https://localhost:5001"; // Local debug URL
    #else
        var backendUrl = "https://some.external.url:12345"; // Production URL
    #endif
    
        // Now we can instantiate gRPC clients for this channel
        var httpClient = new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWeb, new HttpClientHandler()));
        var channel = GrpcChannel.ForAddress(backendUrl, new GrpcChannelOptions { HttpClient = httpClient });
        return new Greeter.GreeterClient(channel);
    });
    

    Этот URL-адрес будет меняться в зависимости от того, вы строите в режиме отладки.

Резюме и примеры

Вот так! Теперь Blazor WebAssembly приложение , которое можно использовать для развертывания независимых внешних КПГР-веб - служб. Для полного запуска образца, следующий пример независимого приложения ( https://github.com/SteveSandersonMS/BlazorGrpcSamples/tree/master/Standalone), он вызывает КПГРЫ-веб - службу на внешнем URL. Этот пример взят с практической КПГР-веб - сервер для тестирования, но вы можете рассмотреть его отдельно. Если вы хотите , чтобы увидеть именно то , что я изменился, вот разница с выходом шаблона проекта по умолчанию ( https://github.com/SteveSandersonMS/BlazorGrpcSamples/commit/d6ec609f2b7e6591958d38e4a207c9b4f52f0feb).

Ваш запрос обратной связи

Если вы хотите узнать больше о КПГРАХ, пожалуйста, обратитесь к документу ASP.NET Основные КПГР. Задать нам предложить вам КПГРЫ-Web мнение и отзывы опыта, так как это поможет нам выбрать, как и будет ли КПГРЫ-Web в качестве стандартной функции в будущих версиях ASP.NET манипуляции Core. Вы можете оставить комментарий здесь или выпустить вопрос с названием «обратной связи» на GitHub.

Перевод с оригинала: https: //blog.stevensanderson.com/2020/01/15/2020-01-15-grpc-web-in-blazor-webassembly

Статьи по теме:

В последнее время, наблюдение и анализ платформы .NET SkyWalking автоматического зонда (SkyAPM-DotNet) поддерживали связь сбор трассировки КПГРЫ-DotNet удаленные вызовов могут использовать! Если вам это нравится, пожалуйста, дайте звезду!

Проект по адресу: https: //github.com/SkyAPM/SkyAPM-dotnet

Освобожденные 1535 оригинальные статьи · вона похвала 586 · Просмотров 2,37 млн +

рекомендация

отblog.csdn.net/sD7O95O/article/details/104079137
рекомендация