DotNet Core 3.1 gRPCサーバーを作成しました。
このサーバーをDotNet Frametwork 4.8クライアントで使用することはできますか?
私はこれらのパッケージを参照しました:
テストコードは次のようになります。
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をコピーしました...
しかし、上記のコードではGreeterを見つけることができません。
それはまったく可能ですか?
更新.......
私はこれらのナゲットを使って.Net Standard 2.0ライブラリにプロトを入れることに成功しました:
次の問題...
アプリを実行すると、.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.")'
はい。クライアントを.NET Framework 4.8で記述し、サーバーを.NET Core 3.1で記述できます。クライアントとサーバーを異なるプログラミング言語で作成することも可能であるため、ユースケースが不可能な理由はありません。ただし、.NET Frameworkアセンブリから.NET Coreアセンブリを参照することはできません。
GRPCはクライアントアセンブリからサーバーアセンブリへの参照を必要としないため、ユースケースは完全に適切です。
コード内にGreeterクラスが見つからない理由は、次のいずれかである可能性があります。
<ItemGroup>
<Protobuf Include="<directory_path>/greet.proto" />
</ItemGroup>
また、クライアントとサーバーに共通の.protoファイルを保持する別の.NET標準プロジェクトを用意することをお勧めします。この方法では、.protoファイルをコピーして、その内容が同期されていることを確認する必要はありません。
ところで、名前を明示的に指定せずにすべての.protoファイルをプロジェクトに含める1つのトリックは、正規表現を使用することです。
<ItemGroup>
<Protobuf Include="**/*.proto" />
</ItemGroup>