【问题标题】:Use Core gRPC Server in Dotnet Framework 4.8 client?在 Dotnet Framework 4.8 客户端中使用 Core gRPC 服务器?
【发布时间】:2020-08-07 22:40:06
【问题描述】:

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

是否可以在 DotNet Framework 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...

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

真的可以吗?

更新.......

我设法用这些 nuget 将 Protos 放入 .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.")'

【问题讨论】:

    标签: c# grpc


    【解决方案1】:

    是的,可以使用 .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>
    

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

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

      <ItemGroup>
        <Protobuf Include="**/*.proto" />
      </ItemGroup>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2017-03-30
    • 2019-07-01
    • 2021-04-10
    • 2016-01-27
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多