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>来表示返回空消息。
人生如逆旅
我亦是行人

浙公网安备 33010602011771号