web-dev-qa-db-ja.com

Dotnet Framework 4.8クライアントでコアgRPCサーバーを使用しますか?

DotNet Core 3.1 gRPCサーバーを作成しました。

このサーバーをDotNet Frametwork 4.8クライアントで使用することはできますか?

私はこれらのパッケージを参照しました:

  • Google.Protobuf
  • Grpc.Core
  • Grpc.Core.Api

テストコードは次のようになります。

using Grpc.Core;
using System;
using System.Windows.Forms;

namespace DotNetgRpcTest.ClientWinformC
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure);

            var client = new Greeter.GreeterClient(channel);
            String user = "John";

            var reply = client.SayHello(new HelloRequest { Name = user });
            Console.WriteLine("Greeting: " + reply.Message);           
        }
    }
}

サーバーからgreet.protoをコピーしました...

enter image description here

しかし、上記のコードではGreeterを見つけることができません。

それはまったく可能ですか?

更新.......

私はこれらのナゲットを使って.Net Standard 2.0ライブラリにプロトを入れることに成功しました:

  • GRPC
  • Grpc.Core
  • Grpc.Tools

次の問題...

アプリを実行すると、.Net Frmawork 4.8アプリで次のエラーが発生します。

Grpc.Core.RpcException: 'Status(StatusCode=Unavailable, Detail="failed to connect to all addresses")'

グーグルから私はサーバーのこのコードがそれを修正することを学びました...

webBuilder.ConfigureKestrel(options =>
{
    // This endpoint will use HTTP/2 and HTTPS on port 5001.
    options.Listen(IPAddress.Any, 5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http2;
    });
});

まあ、それができました-今私の.Net Framework 4.8アプリが動作します....しかし、今私の.Net Coreクライアントアプリは私にこのエラーを出します:

Grpc.Core.RpcException: 'Status(StatusCode=Internal, Detail="Error starting gRPC call: The SSL connection could not be established, see inner exception.")'
2
MojoDK

はい。クライアントを.NET Framework 4.8で記述し、サーバーを.NET Core 3.1で記述できます。クライアントとサーバーを異なるプログラミング言語で作成することも可能であるため、ユースケースが不可能な理由はありません。ただし、.NET Frameworkアセンブリから.NET Coreアセンブリを参照することはできません。

GRPCはクライアントアセンブリからサーバーアセンブリへの参照を必要としないため、ユースケースは完全に適切です。

コード内にGreeterクラスが見つからない理由は、次のいずれかである可能性があります。

  1. ProtoファイルからC#コードを自動的に生成するNuGetパッケージがありません。プロジェクトにGrpc、Grpc.Tools、Google.Protobuf NuGetパッケージがインストールされていることを確認してください。
  2. プロジェクトファイルにprotoファイルへの参照を追加するのを忘れました。
  <ItemGroup>
    <Protobuf Include="<directory_path>/greet.proto" />
  </ItemGroup>

また、クライアントとサーバーに共通の.protoファイルを保持する別の.NET標準プロジェクトを用意することをお勧めします。この方法では、.protoファイルをコピーして、その内容が同期されていることを確認する必要はありません。

ところで、名前を明示的に指定せずにすべての.protoファイルをプロジェクトに含める1つのトリックは、正規表現を使用することです。

  <ItemGroup>
    <Protobuf Include="**/*.proto" />
  </ItemGroup>
1
Ivan Ivković