Использовать сервер Core gRP C в клиенте Do tnet Framework 4.8? - PullRequest
1 голос
/ 24 апреля 2020

Я создал сервер Do tNet Core 3.1 gRP C.

Возможно ли использовать этот сервер в клиенте Do tNet Frametwork 4.8?

I ссылались на эти пакеты:

  • Google.Protobuf
  • Grp c .Core
  • Grp c .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 в приведенном выше коде.

Это вообще возможно сделать?

ОБНОВЛЕНИЕ .......

Мне удалось поместить Protos в библиотеку. Net Standard 2.0 с такими нюгетами:

  • Grp c
  • Grp c .Core
  • Grp c .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 Базовое клиентское приложение выдает мне эту ошибку:

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

1 Ответ

0 голосов
/ 29 апреля 2020

Да, клиент может быть написан на. NET Framework 4.8 и сервер на. NET Core 3.1. Возможно, что клиент и сервер будут написаны на разных языках программирования, поэтому нет причин, по которым ваш вариант использования был бы невозможен. Однако невозможно ссылаться на сборку ядра. NET из сборки сборки. NET.

Поскольку gRP C не требует ссылки от сборки клиента на сборку сервера, ваш Случай использования вполне подходит.

Причина, по которой вы не можете найти класс Greeter в своем коде, может быть одной из следующих:

  1. Вам не хватает пакета NuGet, который автоматически генерирует C# код из файлов прото. Убедитесь, что в вашем проекте установлены пакеты Grp c, Grp c .Tools и Google.Protobuf NuGet.
  2. Вы забыли добавить ссылку на файл прото в файл проекта.
  <ItemGroup>
    <Protobuf Include="<directory_path>/greet.proto" />
  </ItemGroup>

Кроме того, я бы предложил вам отдельный. NET Стандартный проект, в котором вы будете хранить файлы .proto, общие для клиента и сервера. Таким образом, вам не нужно копировать файлы .proto и проверять их синхронизацию.

Кстати, нужно использовать один прием для включения всех файлов .proto в ваш проект без явного указания их имен. регулярное выражение:

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