Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 59053|Odpowiedź: 9

[.NET Core] Praktyczna walka: ASP.NET Core wykorzystuje komunikację gRPC

[Skopiuj link]
Opublikowano 11.11.2019 10:55:26 | | | |
grpc(Logowanie do linku jest widoczne.) to otwartoźródłowy, wysokowydajny, uniwersalny framework RPC (Remote Procedure Call) wydany przez Google, wykorzystujący protokół HTTP/2, wspierający multipleksowanie oraz ProtoBuf jako narzędzie do serializacji, zapewniający wsparcie międzyjęzykowe i platformowe.
gRPC to wysokowydajny framework do zdalnych wywołań procedur (RPC), niezależny od języka.

Główne korzyści gRPC to:

  • Nowoczesny, wysokowydajny, lekki framework RPC.
  • Tworzenie API oparte na kontrakcie, które domyślnie korzysta z protokołu, umożliwiających implementacje niezależne od języka.
  • Narzędzia dostępne w wielu językach do generowania silnie typowanych serwerów i klientów.
  • Obsługuje połączenia klient, serwer oraz dwukierunkowe streamingi.
  • Ogranicz wykorzystanie sieci dzięki binarnej serializacji Protobuf.


Ten artykuł zaczyna się od . Net Core wykorzystuje protokół gRPC do komunikacji po stronie klienta i serwera.

Stwórz serwer gRPC

Uruchom Visual Studio i wybierz Utwórz nowy projekt. Alternatywnie, wybierz New > Project z menu plików Visual Studio.

W oknie dialogowym Utwórz nowy projekt wybierz usługę gRPC, a następnie wybierz Następny:




Po zakończeniu tworzenia, jak pokazano na poniższym rysunku:




Stwórz klienta gRPC

Otwórz drugą instancję Visual Studio i wybierz Create a new project.
W oknie dialogowym Utwórz nowy projekt wybierz Aplikację konsolową (.NET Core), a następnie wybierz Dalej.
W polu tekstowym Nazwa wpisz gRPC-Client, a następnie wybierz Create.


Dodaj wymagany pakiet

Projekt klienta gRPC wymaga następujących pakietów:
Grpc.Net.Client, który zawiera klienta .NET Core.
Google.Protobuf zawiera wiadomości Protobuf dla C#.
Grpc.Tools obsługuje narzędzia C# dla plików Protobuf. Zestaw narzędzi nie jest wymagany w czasie działania, więc zależności są oznaczane jako PrivateAssets="All".




Dodaj greet.proto

Stwórz folder Protos w swoim projekcie klienta gRPC.
Skopiuj plik Protos\greet.proto z usługi gRPC Greeter do projektu klienta gRPC.

Edytuj plik projektu gRPC-Client.csproj, dodaj grupę elementów z elementem odwołującym się do pliku greet.proto <Protobuf> :





Stwórz klienta Greeter

Zaktualizuj plik Program.cs klienta gRPC o następujący kod:





Instancja GrpcChannel tak, aby zawierał informacje użyte do nawiązania połączenia z usługą gRPC.
Zbuduj klienta Greeter za pomocą GrpcChannel.
Klient Powitania nazywa metodę SayHello. Wynik połączenia SayHello jest wyświetlany.




Stwórz własną komunikację plików .proto

Utwórz nowy plik userinfo.proto w folderze Protos serwisu, zdefiniowanym następująco:


gRPC stosuje podejście oparte na kontrakcie w rozwoju API. Zdefiniuj usługi i wiadomości w pliku *.proto.

Edytuj plik projektu GrpcService1.csproj, dodaj <Protobuf> grupę elementów z elementem odwołującym się do pliku 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" Version="2.23.1" />
  </ItemGroup>

</Project>


Utwórz nowy plik UserInfoService.cs w folderze Usługi, kod wygląda następująco:

Zarejestruj usługę UserInfoService na Startup.cs z następującym kodem:

Pomijając klienta, oczywiście musisz skopiować plik userinfo.proto, a kod wygląda następująco:

Wartość zwrotu:

Cześć ludzie!
Odpowiedź: Witaj itsvse.com
{ "id": "1", "name": "architect", "age": 5, "isVip": true }
{ "id": "2", "name": "itsvse.com", "age": 5 }
Wyjątek nieobsługiwany. Grpc.Core.RpcException: Status(StatusCode=Cancelled, Detail="Brak zwróconej wiadomości z metody.")
   at Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request)
   na 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 kontekst, kontynuacja BlockingUnaryCallContinuation'2)
   na Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request)
   at UserInfo.UserInfoClient.GetUserInfo(żądanie GetUserInfoRequest, opcje CallOptions) w C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\ UserinfoGrpc.cs:linia 62
   w UserInfo.UserInfoClient.GetUserInfo(żądanie GetUserInfoRequest, nagłówki metadanych, deadline Nullable'1, CancellationToken cancellationToken) w języku C: \Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\UserinfoGrpc.cs:line 58
   at gRPC_Client.Program.Main(String[] args) w C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\Program.cs:line 20
Proszę nacisnąć dowolny, aby kontynuować...


Gdy wartość zwrotu jest null, klient wyrzuca wyjątek.


Skrzypek, chwyć torbę

Aby spróbować użyć Fiddlera do przechwytywania pakietów, najpierw ustaw proxy na kliencie w następujący sposób (w rzeczywistości nie da się tego skonfigurować, wystarczy otworzyć Fiddlera bezpośrednio):

Błąd po stronie serwera:

fail: Microsoft.AspNetCore.Server.Kestrel[0]
      HTTP/2 przez TLS nie był negocjowany na punkcie końcowym tylko HTTP/2.
Błąd klienta:

Wyjątek nieobsługiwany. Grpc.Core.RpcException: Status(StatusCode=Internal, Detail="Zła odpowiedź gRPC. Protokół odpowiedzi został obniżony do HTTP/1.1.")
   at Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request)
   na 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 kontekst, kontynuacja BlockingUnaryCallContinuation'2)
   na Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request)
   at UserInfo.UserInfoClient.GetUserInfo(żądanie GetUserInfoRequest, opcje CallOptions) w C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\ UserinfoGrpc.cs:linia 62
   w UserInfo.UserInfoClient.GetUserInfo(żądanie GetUserInfoRequest, nagłówki metadanych, deadline Nullable'1, CancellationToken cancellationToken) w języku C: \Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\UserinfoGrpc.cs:line 58
   at gRPC_Client.Program.Main(String[] args) w C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\Program.cs:line 23
Proszę nacisnąć dowolny, aby kontynuować...


ADRES POST: https://localhost:5001/UserInfo/GetUserInfo

Treść:

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


Na koniec dołącz kod źródłowy:

Turyści, jeśli chcecie zobaczyć ukrytą zawartość tego wpisu, proszęOdpowiedź


(Koniec)




Poprzedni:Udoskonalenie programisty: Od początkującego do inżyniera Pełny PDF
Następny:100 bezstratna muzyka z marihuany
Opublikowano 11.11.2019 17:46:30 |
ASP.NET Core wykorzystuje komunikację gRPC
Opublikowano 28.11.2019 15:14:53 |
ASP.NET Core wykorzystuje komunikację gRPC
Opublikowano 28.11.2019 15:15:25 |
ASP.NET Core wykorzystuje komunikację gRPC
Opublikowano 02.12.2020 15:52:18 |
Jak rozwiązałeś ten ostatni błąd?
Opublikowano 07.12.2020 20:37:56 |
używając Grpc.Core;
używając Microsoft.Extensions.Logging;
z wykorzystaniem System;
używając System.Collections.Generic;
używając System.Linq;
używając System.Threading.Tasks;

przestrzeń nazw GrpcService1
{
    Publiczna klasa UserInfoService : UserInfo.UserInfoBase
    {
        prywatny ILogger<UserInfoService> _logger;
        prywatna statyczna lista<UserInfoReply> userInfoReplies = nowa List<UserInfoReply>();
        statyczny UserInfoService()
        {
            userInfoReplies.Add(new UserInfoReply()
            {
                id = 1,
                Imię = "Architekt",
                Wiek = 5,
                IsVip = prawdziwy
            });
            userInfoReplies.Add(new UserInfoReply()
            {
                id = 2,
                Imię = "itsvse.com",
                Wiek = 5,
                IsVip = fałszywe
            });
            userInfoReplies.Add(new UserInfoReply()
            {
                id = 3,
                Imię = "Mały",
                Wiek = 1,
                IsVip = fałszywe
            });
        }
        public UserInfoService (logger ILogger<UserInfoService>)
        {
            _logger = drwal;
        }

        publiczne nadpisanie<UserInfoReply> Zadania GetUserInfo(żądanie GetUserInfoRequest, kontekst SerwerCallContext)
        {
            return Task.Run(() =>
            {
                return userInfoReplies.SingleOrDefault(x => x.Id == request. tamże);
            });
        }
    }
}
Opublikowano 07.12.2020 21:06:17 |
at 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()
   at Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request)
   na 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 kontekst, kontynuacja BlockingUnaryCallContinuation'2)
   na Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request)
Opublikowano 25.05.2021 11:37:34 |
Jest naprawdę dobrze napisane, pochwały i pochwały
Opublikowano 05.06.2021 11:45:21 |
ASP.NET Core wykorzystuje komunikację gRPC
 Ziemianin| Opublikowano 13.08.2025 15:25:35 |
Użyj Postmana do testowania (debugowania) usługi gRPC
https://www.itsvse.com/thread-11053-1-1.html
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com