この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 59053|答える: 9

[.NET Core] 実戦:ASP.NET コアはgRPC通信を使用しています

[リンクをコピー]
掲載地 2019/11/11 10:55:26 | | | |
grpc(ハイパーリンクのログインが見えます。)は、Googleがリリースしたオープンソースの高性能汎用RPC(リモートプロシージャコール)フレームワークで、HTTP/2プロトコルを使用し、多重化をサポートし、ProtoBufをシリアライズツールとして用いて言語間およびプラットフォーム間のサポートを提供しています。
gRPCは言語に依存しない高性能なリモートプロシージャコール(RPC)フレームワークです。

gRPCの主な利点は以下の通りです:

  • 現代的で高性能、軽量なRPCフレームワーク。
  • 契約優先のAPI開発で、デフォルトでプロトコルバッファを使用し、言語に依存しない実装を可能にします。
  • 強型サーバーやクライアントを生成するための複数言語のツール。
  • クライアント、サーバー、双方向ストリーミング通話をサポートします。
  • Protobufバイナリシリアライズによるネットワーク利用を減らしましょう。


この記事は から始まります。 Net Coreはクライアント側およびサーバー側の通信にgRPCプロトコルを使用しています。

gRPCサーバーを作成する

Visual Studioを起動し、「新しいプロジェクトを作成」を選択します。 または、Visual Studioのファイルメニューから「新しい>プロジェクト」を選択します。

「新しいプロジェクトを作成」ダイアログボックスで、gRPCサービスを選択し、「次へ」を選択します。




作成が完了した後、以下の図に示されています:




gRPCクライアントを作成する

Visual Studioの2つ目のインスタンスを開き、「新しいプロジェクトを作成」を選択します。
「新しいプロジェクトを作成」ダイアログボックスで「コンソールアプリ(.NET Core)」を選択し、「次へ」を選択してください。
名前のテキストボックスに gRPC-Client を入力し、その後「Create」を選択してください。


必要なパッケージを追加してください

gRPCクライアントプロジェクトには以下のパッケージが必要です:
Grpc.Net.Clientで、.NET Coreクライアントを含んでいます。
Google.ProtobufにはC#用のProtobufメッセージが含まれています。
Grpc.ToolsにはProtobufファイル用のC#ツールサポートが含まれています。 このツールキットは実行時に必須ではないため、依存関係はPrivateAssets="All"としてマークされています。




greet.protoを追加

gRPCクライアントプロジェクト内にProtosフォルダを作成します。
gRPCグリーターサービスからProtos\greet.protoファイルをgRPCクライアントプロジェクトにコピーします。

gRPC-Client.csprojプロジェクトファイルを編集し、greet.protoファイルを参照する要素を含むアイテムグループを追加します<Protobuf>:





グリータークライアントを作成する

gRPCクライアントのProgram.csファイルを以下のコードで更新してください:





grpcChannelをインスタンス化し、gRPCサービスへの接続を作成するために使われた情報が格納されます。
GrpcChannelを使ってグリータークライアントを構築します。
グリータークライアントはSayHelloメソッドを呼び出します。 SayHello通話の結果が表示されます。




自分だけの.protoファイル通信を作成しましょう

サーブのProtosフォルダの下に新しいuserinfo.protoファイルを作成し、次のように定義します:


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" version="2.23.1" />
  </ItemGroup>

</Project>


Servicesフォルダの下に新しいUserInfoService.csファイルを作成します。コードは以下の通りです:

以下のコードでStartup.csのUserInfoServiceサービスを登録してください:

もちろんクライアントは除いて、userinfo.protoファイルをコピーする必要があります。コードは以下の通りです:

リターンバリュー:

ハローワールド!
返信:こんにちは itsvse.com
{ "id": "1", "name": "architect", "age" : 5, "isVip": true }
{ "id": "2", "name": "itsvse.com", "age": 5 }
未処理例外。 Grpc.Core.RpcException: Status(StatusCode=Cancelled, Detail="メソッドからのメッセージが戻りません.")
   at Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request)
   Grpc.Core.Interceptors.InterceptingCallInvokerで。 <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest rerequest, ClientInterceptorContext'2 ctx)
   at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext'2 コンテキスト、BlockingUnaryCallContinuation'2 continuation)
   at 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行目
   at UserInfo.UserInfoClient.GetUserInfo(GetUserInfoRequest request, Metadata headers, Nullable'1 deadline, CancellationToken cancellationToken) in C: \Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\UserinfoGrpc.cs:line 58
   at gRPC_Client.Program.Main(String[] args) in C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\Program.cs:line 20
続行するにはどのキーでもお願いします...


返却値がnullの場合、クライアントは例外を投げます。


フィドラー、バッグを取って

Fiddlerでパケットをキャプチャしようとするには、まずクライアント上でプロキシを次のように設定してください(実際には設定できず、Fiddlerを直接開くだけです):

サーバー側のエラー:

fail: Microsoft.AspNetCore.Server.Kestrel[0]
      HTTP/2 over TLSはHTTP/2専用エンドポイントでは交渉されていません。
クライアントエラー:

未処理例外。 Grpc.Core.RpcException: Status(StatusCode=Internal, detail="Bad gRPC response. レスポンスプロトコルがHTTP/1.1にダウングレードされました。」)
   at Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request)
   Grpc.Core.Interceptors.InterceptingCallInvokerで。 <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest rerequest, ClientInterceptorContext'2 ctx)
   at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext'2 コンテキスト、BlockingUnaryCallContinuation'2 continuation)
   at 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行目
   at UserInfo.UserInfoClient.GetUserInfo(GetUserInfoRequest request, Metadata headers, Nullable'1 deadline, CancellationToken cancellationToken) in C: \Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\UserinfoGrpc.cs:line 58
   at gRPC_Client.Program.Main(String[] args) in 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ロスレスポットミュージック
掲載地 2019/11/11 17:46:30 |
ASP.NET CoreはgRPC通信を使用しています
掲載地 2019/11/28 15:14:53 |
ASP.NET CoreはgRPC通信を使用しています
掲載地 2019/11/28 15:15:25 |
ASP.NET CoreはgRPC通信を使用しています
掲載地 2020/12/02 15:52:18 |
この最後の失敗はどうやって解決しましたか?
掲載地 2020/12/07 20:37:56 |
Grpc.Core を使用し、
Microsoft.Extensions.Loggingを使い、
Systemを使い、
System.Collections.Genericを使い、
System.Linqを使い、
System.Threading.Tasksを使い、

名前空間 GrpcService1
{
    public class UserInfoService : UserInfo.UserInfoBase
    {
        プライベート読み取り専用ILogger<UserInfoService> _logger;
        プライベート静的リスト<UserInfoReply> ユーザーInfoReplys = 新しいリスト<UserInfoReply>();
        静的ユーザー情報サービス()
        {
            userInfoReplies.Add(新しいUserInfoReply()
            {
                Id=1、
                名前 = 「建築家」
                年齢=5歳、
                IsVip = 真
            });
            userInfoReplies.Add(新しいUserInfoReply()
            {
                id = 2,
                名前 = 「itsvse.com」
                年齢=5歳、
                IsVip = false
            });
            userInfoReplies.Add(新しいUserInfoReply()
            {
                id = 3,
                名前=「リトル・クズ」、
                年齢 = 1,
                IsVip = false
            });
        }
        public UserInfoService(ILogger<UserInfoService> logger)
        {
            _logger = ロガー;
        }

        パブリックオーバーライド<UserInfoReply> タスク GetUserInfo(GetUserInfoRequest request, ServerCallContext コンテキスト)
        {
            Task.Run(() =>
            {
                return userInfoRereplyes.SingleOrDefault(x => x.Id == request. 同上);
            });
        }
    }
}
掲載地 2020/12/07 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)
   Grpc.Core.Interceptors.InterceptingCallInvokerで。 <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest rerequest, ClientInterceptorContext'2 ctx)
   at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext'2 コンテキスト、BlockingUnaryCallContinuation'2 continuation)
   at grpc.core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 メソッド、String host、CallOptions options、TRequest request)
掲載地 2021/05/25 11:37:34 |
本当によく書かれています。称賛と称賛を送ります
掲載地 2021/06/05 11:45:21 |
ASP.NET CoreはgRPC通信を使用しています
 地主| 掲載地 2025/08/13 15:25:35 |
Postmanを使ってgRPCサービスをテスト(デバッグ)します
https://www.itsvse.com/thread-11053-1-1.html
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com