ASP. NET Core | Как сделать пул клиентов локальной сети gRP C - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь создать систему, состоящую из 1 главного сервера и как минимум 2 служб gRP C (размещенных с использованием HTTP.Sys), которые могут быть как клиентами основного сервера, так и принимать подключения от основного сервера, которые упоминаются ниже. в качестве "Рабочие" . Каждый элемент системы находится внутри локальной сети. Однажды запущенный работник подключается к главному серверу, и главный сервер должен добавить соединение в пул, где к клиентскому работнику можно будет обратиться позже, чтобы сделать вызов gRP C. Пример того, как я ожидаю, что это будет работать ниже

public class MainServer : MainServer.MainServerGrpcBase
{
    public List<GrpcChannel> ChannelPool { get; set; }
    public MainServer()
    {
        ChannelPool = new List<GrpcChannel>();
    }

    public override async Task<Confirmation> Connect(ConnectionRequest request, ServerCallContext context)
    {
        ChannelPool.Add(context.Channel);
        return new Confirmation { Success = true; }
    }

    // Having a channel pool allows me using methods like this.
    public void BroadcastMessage(string message)
    {
        foreach(var channel in ChannelPool)
        {
            var client = new Worker.WorkerClient(channel);
            client.SendMessage(message);
        }
    }
}

Что я пробовал:

  • Определение рабочего IP на стороне клиента и отправка его на главный сервер, затем создав канал с использованием GrpcChannel.FromAddress(...), в результате я обнаружил, что не могу получить соответствующий рабочий адрес для создания канала.
  • При создании канала из ServerCallContext.Peer это свойство возвращает странное значение IPv6-адрес не подходит для создания канала.

TLDR; Мне нужен сервер gRP C, способный хранить клиентские службы gRP C для дальнейшего использования, такие как широковещательные сообщения ,

1 Ответ

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

Если я правильно понял вашу проблему, вы пытались отправить сообщения с сервера на клиент после того, как запрос от клиента на сервер уже был обработан. Это невозможно, потому что HTTP позволяет отправлять запросы от клиента на сервер, а не наоборот. Поскольку gRP C использует HTTP / 2, вам нужно использовать другой подход для решения вашей проблемы.

Рассмотрите возможность создания службы подписки. Это серверная потоковая служба, где вы можете отправить одно сообщение от клиента на сервер, а затем сервер может при необходимости отправить поток ответных сообщений. Проверьте это сообщение для получения дополнительной информации: { ссылка }

...