GRPC:将消息proto变成列表< message> (c#.net6)

发布于 2025-02-02 02:57:48 字数 1202 浏览 2 评论 0原文

我想将一个从协议缓冲区的MessagerSponse变成一个 iEnumerable< messageresponse> 因此,在服务中,我将返回我一个iEnumerable< messageresponse>

proto我拥有:

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)

任何答案都受到欢迎:)

I want to turn a messageResponse from a protocol buffer into a
IEnumerable<messageResponse>
so in the service will return me an IEnumerable<messageResponse>

Proto I have:

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;
}

And this is my the 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;
        }
    }

Is there any way to do this and if so, how to do it? (I'm Using C# .Net6)

Any answer is welcome :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

还给你自由 2025-02-09 02:57:48

没有办法指定Protobuf RPC一次返回响应列表。这里有两个选项:

  • 添加一个具有重复字段的消息,然后从RPC中返回
  • 请使用流rpc。

除非您实际需要流式流,否则 前者的方法。因此

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

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

message ListBananasResponse {
    repeated Banana bananas = 1;
}

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);
}

There's no way of specifying that a protobuf RPC returns a list of responses in one go. There are two options here:

  • Add a message that has a repeated field, and return that from the RPC
  • Use a streaming RPC

Unless you actually need streaming, I'd strongly advise the former approach. So your .proto file would include a section like this:

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

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

message ListBananasResponse {
    repeated Banana bananas = 1;
}

You'd then implement the RPC with something like:

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文