C# gRPC双向流服务重写CreateStreaming方法报错
gRPC双向流方法重写报错问题排查
你的实现存在3处明确错误,是导致编译器报“未找到适合重写的方法”的直接原因:
- 方法名拼写错误:你编写的方法名为
CreateStreming,proto定义和基类生成的方法名为CreateStreaming,拼写不匹配无法对应到基类虚方法 - 返回值类型不匹配:双向流RPC的基类方法返回值为非泛型
Task,你写的方法返回值是Task<MessageReply>,类型不满足重写要求 - 参数列表完全不匹配:双向流RPC的基类方法需要3个参数,分别是用来读取客户端流请求的
IAsyncStreamReader<MessageRequest>、用来向客户端写入流响应的IServerStreamWriter<MessageReply>、服务调用上下文ServerCallContext。你编写的方法仅传入单个MessageRequest对象和上下文,这是一元RPC的方法签名格式,和双向流的方法定义完全不符。
正确的双向流方法实现参考
双向流场景下不需要直接返回MessageReply对象,所有响应内容都通过IServerStreamWriter写入流即可,参考实现如下:
public class MessagingService : Messaging.MessagingBase { public override async Task CreateStreaming( grpc::IAsyncStreamReader<MessageRequest> requestStream, grpc::IServerStreamWriter<MessageReply> responseStream, grpc::ServerCallContext context) { // 持续读取客户端通过流发来的所有消息 await foreach (var request in requestStream.ReadAllAsync(context.CancellationToken)) { // 自定义业务处理逻辑 var replyContent = $"Hello {request.Message}"; // 将响应写入流,发送给客户端 await responseStream.WriteAsync(new MessageReply { Message = replyContent }); } } }
不同类型gRPC服务的方法签名规则不要混淆:
- 一元RPC:
Task<Reply> MethodName(Request request, ServerCallContext context)- 客户端流RPC:
Task<Reply> MethodName(IAsyncStreamReader<Request> requestStream, ServerCallContext context)- 服务端流RPC:
Task MethodName(Request request, IServerStreamWriter<Reply> responseStream, ServerCallContext context)- 双向流RPC:
Task MethodName(IAsyncStreamReader<Request> requestStream, IServerStreamWriter<Reply> responseStream, ServerCallContext context)
内容的提问来源于stack exchange,提问作者Syed Affan
相关产品推荐
相关产品推荐

