Перейти к содержанию

Серверный поток

Клиент инициирует удалённый вызов процедуры с помощью указания имени метода, метаданных и сообщения запроса. Затем он получает поток от сервера. Сервер возвращает gRPC-cтатус только после того, как все запрошенные данные переданы. Вот как это выглядит на диаграмме.

Диаграмма

sequenceDiagram
participant C as gRPC Client
participant S as gRPC Server
C->>S: Имя метода + сообщение запроса (request message) + метаданные
S->>C: Сообщение 1
S->>C: Сообщение 2
S->>C: Сообщение 3 
S->>C: gRPC-статус + метаданные 

Protobuf

rpc ServerStreamingFunction (InputMessage) returns (stream OutputMessage) {}

Реализация на сервере

public override async Task ServerStreamingFunction(InputMessage request, IServerStreamWriter<OutputMessage> responseStream, ServerCallContext context)
{
    // итерируемся по IEnumerable<OutputMessage> или IAsyncEnumerable<OutputMessage>
    foreach (var outputMessage in outputMessageEnumerable)
    {
        await responseStream.WriteAsync(outputMessage);
    }
}

Использование на клиенте

using var serverStreamingCall = client.ServerStreamingFunction(new InputMessage {/*заполняем поля*/});
//Итерируемся по IAsyncEnumerable до тех пор, пока сервер не закончит передачу
await foreach (OutputMessage response in serverStreamingCall.ResponseStream.ReadAllAsync())
{
    // обработка сообщения
}

Ссылки

Диаграммы всех видов взаимодействия
примеры Protobuf
Примеры реализаций на сервере
Пример клиента


Последнее обновление : 23 апреля 2023 г.
Дата создания : 23 апреля 2023 г.

Комментарии

Комментарии