C# 如何在protobuf-net.grpc中的消息中使用IAsyncEnumerable?

C# 如何在protobuf-net.grpc中的消息中使用IAsyncEnumerable?,c#,grpc,protobuf-net,C#,Grpc,Protobuf Net,因此,最近我学习了如何在IAsyncEnumerable的帮助下使用protobuf-net.grpc进行流式处理。这一切都很好,但我现在面临一个小问题 对于我的一些调用,我希望使用一些元数据以及流作为参数进行调用 例如: [OperationContract] Task<bool> UploadPicture(ProfilePictureQuery query); 同样的结果,因为我显然只允许提供一个参数(与grpc对一个消息参数和一个响应输出的定义相同) 那么,我该怎么做呢?这

因此,最近我学习了如何在
IAsyncEnumerable
的帮助下使用protobuf-net.grpc进行流式处理。这一切都很好,但我现在面临一个小问题

对于我的一些调用,我希望使用一些元数据以及流作为参数进行调用

例如:

[OperationContract]
Task<bool> UploadPicture(ProfilePictureQuery query);
同样的结果,因为我显然只允许提供一个参数(与grpc对一个消息参数和一个响应输出的定义相同)


那么,我该怎么做呢?

这里有两个不同的概念:

  • gRPC允许通过
    IAsyncEnumerable
    (而不是单个消息的
    任务
    )发送消息流
  • 但是,每个单独的信息必须完整且独立;封送拆收器(每个消息序列化器)仅是同步的
因此:您可以将
iasyncunerable
用作服务方法的参数或返回,但不能用作消息上的字段

如果需要提供流和其他元数据,可以使用以下几种选项:

  • 使用http头(通过
    CallContext
    作为第二个参数)
  • 有两个服务调用—一个用于启动并获取元数据,另一个用于返回流
  • 在消息中具有一些可选字段的流,并且只填充第一条或最后一条消息中的可选字段

感谢您的快速回复-您有没有关于CallContext的文档?除此之外,我刚刚尝试过,效果很好,谢谢lot@Sossenbinder这里提到一些:
[ProtoContract]
public class ProfilePictureQuery
{
    [ProtoMember(1)]
    public IAsyncEnumerable<byte[]> RawDataStream { get; set; }

    [ProtoMember(2)]
    public string FileExtension { get; set; }
}
[OperationContract]
Task<bool> UploadPicture(IAsyncEnumerable<byte[]> rawDataStream, string fileExtension);