gRPC 跟 HTTP 一樣也有狀態碼可以使用,提供 Server/Client 可以做對應的處理
gRPC Status 網址可以供參考
預設都會回傳 Success 的狀態碼(Status: 0)
如果有需要做一些處置供 Client 處理,可以拋回對應的狀態碼
public class GreeterService(ILogger<GreeterService> logger) : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
logger.LogInformation("The message is received from {Name}", request.Name);
if (string.IsNullOrEmpty(request.Name))
{
// 可拋對應的 StatusCode 供 Client 端處理
throw new RpcException(new Grpc.Core.Status(StatusCode.InvalidArgument, "Name 欄位必填"));
}
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
var channel = GrpcChannel.ForAddress("https://localhost:7204");
try
{
var greeterClient = new Greeter.GreeterClient(channel);
var helloRes = greeterClient.SayHello(new HelloRequest { Name = "" });
}
catch (RpcException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
有別於單純的 gRPC Status,對於錯誤處理 Google 也有提供一套很類似 HTTP 的錯誤處理
Grpc.StatusProto 有興趣的可以到官方文件參考