Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 59053|Відповідь: 9

[.NET Core] Практичний бій: ASP.NET Core використовує комунікацію через gRPC

[Копіювати посилання]
Опубліковано 11.11.2019 10:55:26 | | | |
grpc(Вхід за гіперпосиланням видно.) — це відкритий, високопродуктивний, універсальний фреймворк RPC (Remote Procedure Call), випущений Google, що використовує протокол HTTP/2, підтримує мультиплексування та використовує ProtoBuf як інструмент серіалізації для забезпечення крос-мовної та кросплатформної підтримки.
gRPC — це високопродуктивний фреймворк віддаленого виклику процедур (RPC), який не залежить від мови.

Основні переваги gRPC такі:

  • Сучасний, високопродуктивний, легкий фреймворк RPC.
  • Розробка API, орієнтована на контракт, яка за замовчуванням використовує буфери протоколів, що дозволяє реалізувати, незалежні від мови.
  • Інструменти, доступні кількома мовами для генерації сильно типізованих серверів і клієнтів.
  • Підтримує клієнтські, серверні та двосторонні потокові дзвінки.
  • Зменшити використання мережі за допомогою бінарної серіалізації Протобуфа.


Ця стаття починається з . Net Core використовує протокол gRPC для зв'язку на стороні клієнта та сервера.

Створити gRPC-сервер

Запустіть Visual Studio і виберіть Створити новий проєкт. Або ж виберіть New > Project у меню Visual Studio File.

У діалоговому вікні «Створити новий проєкт» виберіть gRPC Service, а потім «Далі»:




Після завершення створення, як показано на наступному рисунку:




Створіть клієнт gRPC

Відкрийте другий екземпляр Visual Studio і виберіть Створити новий проєкт.
У діалоговому вікні «Створити новий проєкт» виберіть «Консольний додаток» (.NET Core), а потім «Далі».
У тексті Ім'я введіть gRPC-Client, а потім виберіть Create.


Додайте необхідний пакет

Клієнтський проєкт gRPC потребує наступних пакетів:
Grpc.Net.Client, який містить клієнт .NET Core.
Google.Protobuf містить повідомлення Protobuf для C#.
Grpc.Tools включає підтримку інструментів C# для файлів Protobuf. Інструментарій не потрібен під час виконання, тому залежності позначені як PrivateAssets="All".




Додайте greet.proto

Створіть папку Protos у вашому клієнтському проєкті gRPC.
Скопіюйте файл Protos\greet.proto зі служби gRPC Greeter у клієнтський проєкт gRPC.

Відредагуйте файл проєкту gRPC-Client.csproj, додайте групу елементів з елементом, що посилається на файл <Protobuf> greet.proto:





Створіть клієнта Greeter

Оновіть Program.cs файл клієнта gRPC наступним кодом:





Створіть GrpcChannel так, щоб він містив інформацію, що використовується для з'єднання з сервісом gRPC.
Створіть клієнт Greeter за допомогою GrpcChannel.
Клієнт Greeter викликає метод SayHello. Відображається результат дзвінка SayHello.




Створіть власне .proto файл комунікації

Створіть новий файл userinfo.proto у папці Protos сервісу, визначений таким чином:


gRPC використовує підхід «контракт наперед» для розробки API. Визначте сервіси та повідомлення у файлі *.proto.

Відредагуйте файл проєкту GrpcService1.csproj, додайте <Protobuf> групу елементів з елементом, що посилається на файл userinfo.proto:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
    <Protobuf Include="Protos\userinfo.proto" GrpcServices="Server" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference include="Grpc.AspNetCore" версія="2.23.1" />
  </ItemGroup>

</Project>


Створіть новий UserInfoService.cs-файл у папці Services, код виглядає так:

Зареєструйте сервіс UserInfoService на Startup.cs з таким кодом:

Відкинувши клієнта, звісно, потрібно скопіювати файл userinfo.proto past, і код виглядає так:

Повернене значення:

Привіт, народ!
Відповідь: Привіт, itsvse.com
{ "id": "1", "name": "architect", "age": 5, "isVip": true }
{ "id": "2", "name": "itsvse.com", "age": 5 }
Невирішений виняток. Grpc.Core.RpcException: Status(StatusCode=Скасовано, Detail="Повідомлення не повернуто від методу.")
   на Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](метод'2 метод, String host, CallOptions options, TRequest request)
   на Grpc.Core.Interceptors.InterceptingCallInvoker. <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest req, ClientInterceptorContext'2 ctx)
   at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext'2 контекст, продовження BlockingUnaryCallContinuation'2)
   на Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](метод Method'2, String host, CallOptions options, TRequest request)
   на UserInfo.UserInfoClient.GetUserInfo(GetUserInfoRequest request, CallOptions options) у C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\ UserinfoGrpc.cs:рядок 62
   на UserInfo.UserInfoClient.GetUserInfo(GetUserInfoRequest request, Metadata headers, Nullable'1 deadline, CancellationToken cancellationToken) на C: \Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\UserinfoGrpc.cs:line 58
   за адресою gRPC_Client.Program.Main(String[] args) у C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\Program.cs:line 20
Будь ласка, натисніть будь-яку клавішу, щоб продовжити...


Коли повернене значення дорівнює нулю, клієнт кидає виняток.


Скрипаль, бери сумку

Щоб спробувати використовувати Fiddler для захоплення пакетів, спочатку налаштуйте проксі на клієнті наступним чином (насправді його не можна налаштувати, просто відкрийте Fiddler безпосередньо):

Помилка на стороні сервера:

fail: Microsoft.AspNetCore.Server.Kestrel[0]
      HTTP/2 через TLS не був узгоджений на HTTP/2-кінцевій точці.
Помилка клієнта:

Невирішений виняток. Grpc.Core.RpcException: Status(StatusCode=Internal, Detail="Погана відповідь gRPC. Протокол відповіді понижено до HTTP/1.1.")
   на Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](метод'2 метод, String host, CallOptions options, TRequest request)
   на Grpc.Core.Interceptors.InterceptingCallInvoker. <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest req, ClientInterceptorContext'2 ctx)
   at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext'2 контекст, продовження BlockingUnaryCallContinuation'2)
   на Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](метод Method'2, String host, CallOptions options, TRequest request)
   на UserInfo.UserInfoClient.GetUserInfo(GetUserInfoRequest request, CallOptions options) у C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\ UserinfoGrpc.cs:рядок 62
   на UserInfo.UserInfoClient.GetUserInfo(GetUserInfoRequest request, Metadata headers, Nullable'1 deadline, CancellationToken cancellationToken) на C: \Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\UserinfoGrpc.cs:line 58
   за адресою gRPC_Client.Program.Main(String[] args) у C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\Program.cs:line 23
Будь ласка, натисніть будь-яку клавішу, щоб продовжити...


ПОШТОВА АДРЕСА: https://localhost:5001/UserInfo/GetUserInfo

Зміст:

Host: localhost:5001
User-Agent: grpc-dotnet/2.25.0.0
TE: trailers
grpc-accept-encoding: identity,gzip
Content-Type: application/grpc
Content-Length: 7
Fiddler-Encoding: base64


Нарешті, додайте вихідний код:

Туристи, якщо ви хочете побачити прихований контент цього допису, будь ласкаВідповідь


(Кінець)




Попередній:Удосконалення програміста: від новачка до інженера Повний PDF
Наступний:100 lossless pot music
Опубліковано 11.11.2019 17:46:30 |
ASP.NET Core використовує gRPC-комунікацію
Опубліковано 28.11.2019 15:14:53 |
ASP.NET Core використовує gRPC-комунікацію
Опубліковано 28.11.2019 15:15:25 |
ASP.NET Core використовує gRPC-комунікацію
Опубліковано 02.12.2020 15:52:18 |
Як ви вирішили цю останню помилку?
Опубліковано 07.12.2020 20:37:56 |
використовуючи Grpc.Core;
використання Microsoft.Extensions.Logging;
використовуючи System;
з використанням System.Collections.Generic;
використовуючи System.Linq;
використовуючи System.Threading.Tasks;

Простір назв GrpcService1
{
    публічний клас UserInfoService : UserInfo.UserInfoBase
    {
        приватний readonly ILogger<UserInfoService> _logger;
        приватний статичний<UserInfoReply> List userInfoReplies = новий List<UserInfoReply>();
        статичний UserInfoService()
        {
            userInfoReplies.Add (новий UserInfoReply()
            {
                id = 1,
                Ім'я = «Архітектор»,
                Вік = 5,
                IsVip = правда
            });
            userInfoReplies.Add (новий UserInfoReply()
            {
                id = 2,
                Ім'я = «itsvse.com»,
                Вік = 5,
                IsVip = неправда
            });
            userInfoReplies.Add (новий UserInfoReply()
            {
                id = 3,
                Ім'я = «Маленький покидьок»,
                Вік = 1,
                IsVip = неправда
            });
        }
        public UserInfoService(<UserInfoService>ILogger logger)
        {
            _logger = лісоруб;
        }

        публічне перевизначення завдання<UserInfoReply> GetUserInfo(GetUserInfoRequest request, ServerCallContext context)
        {
            повернути Завдання.Run(() =>
            {
                повернути userInfoReplies.SingleOrDefault(x => x.Id == запит. Там само);
            });
        }
    }
}
Опубліковано 07.12.2020 21:06:17 |
на System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task Task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter'1.GetResult()
   на Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](метод'2 метод, String host, CallOptions options, TRequest request)
   на Grpc.Core.Interceptors.InterceptingCallInvoker. <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest req, ClientInterceptorContext'2 ctx)
   at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext'2 контекст, продовження BlockingUnaryCallContinuation'2)
   на Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](метод Method'2, String host, CallOptions options, TRequest request)
Опубліковано 25.05.2021 11:37:34 |
Він дуже добре написаний — і похвала, і похвала
Опубліковано 05.06.2021 11:45:21 |
ASP.NET Core використовує gRPC-комунікацію
 Орендодавець| Опубліковано 13.08.2025 15:25:35 |
Використовуйте Postman для тестування (налагодження) сервісу gRPC
https://www.itsvse.com/thread-11053-1-1.html
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com