You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:15:38