gRPC:将消息原型转换为列表<message> (C# .Net6)

gRPC: Turn a message proto into a List<message> (C# .Net6)

我想将协议缓冲区中的 messageResponse 转换为 IEnumerable<messageResponse> 所以在服务中 return 我 IEnumerable<messageResponse>

原型我有:

syntax = "proto3";

option csharp_namespace = "ProjectName.Protos";

package Banana;

service Banana {
   rpc GetAllBananas (MessageRequest) returns (ListBananasResponse);
}

//How to Turn this to IEnumerable<> ?
message ListBananasResponse{
    string bananaName = 1;
    string bananaInfo = 2;
}

message MessageRequest{
    string message = 1;
}

这是我的 BananaService.cs

using Grpc.Core;
using ProjectName.Protos;

namespace ProjectName.Services
{

    public class BananaService : Banana.BananaBase
    {
      //The Method should return a IEnumerable list of bananas 
         //want to do Task<IEnumerable<ListBananasResponse>>
      public override Task<ListBananasResponse> GetAllBananas(MessageRequest request, 
      ServerCallContext context)
        {
            var lstbananas = new IEnumerable<ListBananasResponse>();
            return lstbananas;
        }
    }

有没有办法做到这一点,如果有,怎么做? (我正在使用 C# .Net6)

欢迎任何回答:)

无法指定 protobuf RPC return 是一次响应列表。这里有两个选项:

  • 添加具有重复字段的消息,并且 return 来自 RPC
  • 使用流式 RPC

除非您实际上需要流式传输,否则我强烈建议您使用前一种方法。所以你的 .proto 文件将包含这样的部分:

service Banana {
   rpc GetAllBananas (MessageRequest) returns (ListBananasResponse);
}

message Banana {
    string name = 1;
    string info = 2;
}

message ListBananasResponse {
    repeated Banana bananas = 1;
}

然后您将使用类似以下内容实现 RPC:

public override Task<ListBananasResponse> GetAllBananas(MessageRequest request, 
    ServerCallContext context)
{
    var banana1 = new Banana { Name = "name1", Info = "info1" };
    var banana2 = new Banana { Name = "name2", Info = "info2" };
    var response = new ListBananasResponse
    {
        Bananas = { banana1, banana2 }
    };
    return Task.FromResult(response);
}