在 Dotnet Framework 4.8 客户端中使用 Core gRPC 服务器?

Moj*_*oDK 6 c# grpc

我创建了一个 DotNet Core 3.1 gRPC 服务器。

是否可以在 DotNet Frametwork 4.8 客户端中使用此服务器?

我参考了这些包:

  • 谷歌Protobuf
  • 内核
  • 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);           
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经从服务器复制了greet.proto...

在此处输入图片说明

但是在上面的代码中找不到Greeter。

有可能做到吗?

更新.......

我设法使用这些 nuget 将 Protos 放入 .Net Standard 2.0 库中:

  • 玻璃钢
  • 内核
  • Grpc.工具

下一个问题...

当我运行应用程序时,我的 .Net Frmawork 4.8 应用程序给了我这个错误:

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

从谷歌我了解到服务器中的这段代码会修复它......

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

好吧 - 现在我的 .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.")'
Run Code Online (Sandbox Code Playgroud)

Iva*_*vić 5

是的,可以使用 .NET Framework 4.8 编写客户端,使用 .NET Core 3.1 编写服务器。也可以使用不同的编程语言编写客户端和服务器,因此您的用例没有理由不可行。但是,无法从 .NET Framework 程序集引用 .NET Core 程序集。

由于 gRPC 不需要从客户端程序集到服务器程序集的引用,因此您的用例非常好。

在代码中找不到 Greeter 类的原因可能是以下之一:

  1. 您缺少一个 NuGet 包,它可以从 proto 文件中自动生成 C# 代码。确保在项目中安装了 Grpc、Grpc.Tools 和 Google.Protobuf NuGet 包。
  2. 您忘记在项目文件中添加对 proto 文件的引用。
  <ItemGroup>
    <Protobuf Include="<directory_path>/greet.proto" />
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

此外,我建议您拥有一个单独的 .NET Standard 项目,您可以在其中保留客户端和服务器通用的 .proto 文件。这样你就不需要复制 .proto 文件并确保它们的内容是同步的。

顺便说一句,在您的项目中包含所有 .proto 文件而不明确指定它们的名称的一个技巧是使用正则表达式:

  <ItemGroup>
    <Protobuf Include="**/*.proto" />
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)