grpc处理空消息

空消息既可以作为请求参数,也能作为返回参数。下面将分别针对这两种情况进行介绍。

请求参数为空消息

syntax = "proto3";

option csharp_namespace = "GrpcService_Server";

import "google/protobuf/empty.proto";
package demo;

service DemoGreeter {
  //空请求参数
  rpc GetRandomNum (google.protobuf.Empty) returns (RandomNumResponse);
}

message RandomNumResponse {
  string message = 1;
}

public class DemoService : GrpcService_Server.DemoGreeter.DemoGreeterBase
{
      public override Task<RandomNumResponse> GetRandomNum(Empty request, ServerCallContext context)
  {
      return Task.FromResult(new RandomNumResponse()
      {
         Message = new Random().Next(1,10).ToString()
      });
  }
}
public async Task TestgRPCService()
{
    using (var channel = GrpcChannel.ForAddress("http://localhost:5200"))
    {
        DemoGreeterClient client = new DemoGreeterClient(channel);

        Console.WriteLine("-----------------空请求参数-----------------");
        var randomResult = await client.GetRandomNumAsync(new Google.Protobuf.WellKnownTypes.Empty());
        Console.WriteLine($"获取服务端生成的随机数:{randomResult.Message}");
    }
}

返回参数为空消息

syntax = "proto3";

option csharp_namespace = "GrpcService_Server";

import "google/protobuf/empty.proto";
package demo;

service DemoGreeter {
  //空返回参数
  rpc GetClientSendMessage (ClientMessageRequest) returns (google.protobuf.Empty);
}

message ClientMessageRequest {
  string message = 1;
}
using Google.Protobuf.WellKnownTypes;
using Grpc.Core;

namespace GrpcService_Server.Services
{
    public class DemoService : GrpcService_Server.DemoGreeter.DemoGreeterBase
    {
        public override Task<Empty> GetClientSendMessage(ClientMessageRequest request, ServerCallContext context)
        {
            Console.WriteLine($"Server Received Client Message: {request.Message}");
            return Task.FromResult(new Empty());
        }
    }
}
public async Task TestgRPCService()
{
    using (var channel = GrpcChannel.ForAddress("http://localhost:5200"))
    {
        DemoGreeterClient client = new DemoGreeterClient(channel);

         Console.WriteLine("-----------------空返回参数-----------------");
         var request = new ClientMessageRequest { Message = "这是客户端发送的消息" };
         await client.GetClientSendMessageAsync(request);
    }
}

总结

  • .proto 文件里,借助 google.protobuf.Empty 来表示空消息。
  • 服务端和客户端都要引用 Google.Protobuf.WellKnownTypes 命名空间,以使用 Empty 类型。
  • 服务端方法返回 Task<Empty> 来表示返回空消息。
posted @ 2025-03-27 14:57  相遇就是有缘  阅读(72)  评论(0)    收藏  举报