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
- 有两个服务调用—一个用于启动并获取元数据,另一个用于返回流
- 在消息中具有一些可选字段的流,并且只填充第一条或最后一条消息中的可选字段
[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);