Как использовать IAsyncEnumerable в сообщении в protobuf- net .grp c? - PullRequest
1 голос
/ 01 февраля 2020

Итак, недавно я узнал о том, как делать потоковую передачу с protobuf- net .grp c с помощью IAsyncEnumerable<T>. Все это прекрасно работает, но сейчас я сталкиваюсь с некоторой проблемой.

Для некоторых моих вызовов я хотел бы вызывать как некоторые метаданные, так и поток в качестве параметра.

Например:

[OperationContract]
Task<bool> UploadPicture(ProfilePictureQuery query);

Со следующей подписью:

[ProtoContract]
public class ProfilePictureQuery
{
    [ProtoMember(1)]
    public IAsyncEnumerable<byte[]> RawDataStream { get; set; }

    [ProtoMember(2)]
    public string FileExtension { get; set; }
}

Однако, при попытке вызвать это, я получаю исключение типа 'Status(StatusCode=Unimplemented, Detail="Method is unimplemented.") , Я знаю, что ответы о состоянии немного крипти c, поэтому я понял, что это на самом деле просто проблема с параметром.

Как мне тогда это сделать?

Я также пытался сделать это со следующей подписью:

[OperationContract]
Task<bool> UploadPicture(IAsyncEnumerable<byte[]> rawDataStream, string fileExtension);

С тем же результатом, поскольку мне, видимо, разрешено предоставлять только один параметр (верно для определения grp c одного параметра сообщения и одного ответа вывод).

ооочень, как мне тогда это сделать?

1 Ответ

1 голос
/ 01 февраля 2020

Здесь есть два отдельных понятия:

  • gRP C разрешает поток сообщений через IAsyncEnumerable<T> (вместо Task<T> для одного сообщения)
  • однако каждое отдельное сообщение должно быть полным и самодостаточным; маршаллер (сериализатор на сообщение) является синхронным только

Итак: вы можете использовать IAsyncEnunerable<T> в качестве параметра или возврата метода службы, но не в качестве поля в сообщении.

Если вам нужно предоставить поток и дополнительные метаданные, существует несколько вариантов:

  • использовать заголовки http (через CallContext в качестве второго параметра)
  • имеет два служебных вызова - тот, который инициирует вещи и получает метаданные, тот, который возвращает поток
  • , имеет поток с некоторыми необязательными полями в сообщении и только заполняет необязательные поля в первом или последнем сообщении
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...