Клиентский поток¶
Клиент инициирует удалённый вызов процедуры с помощью указания имени метода и метаданных. Затем клиент отправляет поток сообщений. Однако, сервер может отправить код статуса и метаданные до отправки всех клиентских сообщений.
Диаграмма¶
sequenceDiagram
participant C as gRPC Client
participant S as gRPC Server
C->>S: Имя метода + метаданные
C->>S: Сообщение 1
C->>S: Сообщение 2
C->>S: Сообщение 3
S->>C: Сообщение ответа (response message) + gRPC-статус + метаданные
Protobuf¶
Реализация на сервере¶
public override async Task<OutputMessage> ClientStreamingFunction(IAsyncStreamReader<InputMessage> requestStream, ServerCallContext context)
{
// итерируемся по входящим сообщениям
await foreach (var idRequest in requestStream.ReadAllAsync())
{
// реализация обработки входящих сообщений
}
return new OutputMessage {/*заполняем поля*/};
}
Использование на клиенте¶
// создаём объект запроса
using var clientStreamingCall = client.Delete();
// Итерируемся по IEnumerable<InputMessage>, или по IAsyncEnumerable<InputMessage>
foreach (var request in InputMessageEnumerable)
{
// отправляем очередное сообщение на сервер
await clientStreamingCall.RequestStream.WriteAsync(request);
}
// Сообщаем серверу о завершении передачи
await clientStreamingCall.RequestStream.CompleteAsync();
// Завершаем запрос получением ответа
OutputMessage result = await clientStreamingCall.ResponseAsync;
Ссылки¶
Диаграммы всех видов взаимодействия
примеры Protobuf
Примеры реализаций на сервере
Пример клиента
Последнее обновление :
23 апреля 2023 г.
Дата создания : 23 апреля 2023 г.
Дата создания : 23 апреля 2023 г.