En el post pasado vimos cómo crear un sencillo proyecto tipo cliente-servidor con .Net y gRPC.
Continuando con el tema vamos a recordar un poco.
- gRPC es una tecnología moderna ideal para microservicios de alto rendimiento, escalables y seguros.
- Protobuff es el mecanismo de serialización que usa gRPC.
- HTTP/2 como protocolo de comunicación, el cual prioriza solicitudes, permite la comprensión de encabezados, multiplexación (múltiples llamadas simultáneas) y tiene mayor seguridad.
Creando un proyecto cliente-servidor en .Net (C#)
Crearemos un proyecto cliente-servidor en el cual el cliente mandará un número entero y el servidor evaluará si es mayor o no a 100.
1. Creamos nuestro proyecto servidor:
$ dotnet new grpc -o GrpcServer
2. Entramos al directorio creado y agregamos los siguientes Nuget:
Por línea de comandos:
$ dotnet add package Grpc.AspNetCore $ dotnet add package Google.Protobuf $ dotnet add package Grpc.Tools
Desde el archivo ``GrpcServer.csproj``:
<ItemGroup> <PackageReference Include="Grpc.AspNetCore" Version="2.60.0" /> <PackageReference Include="Google.Protobuf" Version="3.25.0" /> <PackageReference Include="Grpc.Tools" Version="2.60.0" PrivateAssets="All" /> </ItemGroup>
Ejecutar esto para descargar paquetes:
$ dotnet restore
3. Crearemos un archivo *.proto, el cual tendrá el un servicio llamado Validar y un método llamado EsMayorQue100 que recibirá un NumeroRequest y devolverá un NumeroResponse.
Protos\validar.proto
syntax = "proto3"; option csharp_namespace = "GrpcDemo"; package validar; service Validar { rpc EsMayorQue100 (NumeroRequest) returns (NumeroResponse); } message NumeroRequest { int32 valor = 1; } message NumeroResponse { bool es_mayor = 1; }
4. Editamos el archivo ``GrpcServer.csproj`` para agregar el archivo *.proto:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net10.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <ItemGroup> <!--<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />--> <Protobuf Include="Protos\validar.proto" GrpcServices="Server" /> </ItemGroup> <ItemGroup> <PackageReference Include="Google.Protobuf" Version="3.34.1" /> <PackageReference Include="Grpc.AspNetCore" Version="2.76.0" /> <PackageReference Include="Grpc.Tools" Version="2.78.0"> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <PrivateAssets>all</PrivateAssets> </PackageReference> </ItemGroup> </Project>
5. Creamos el servicio:
ValidarService.cs
using GrpcDemo; using Grpc.Core; public class ValidarService : Validar.ValidarBase { public override Task<NumeroResponse> EsMayorQue100(NumeroRequest request, ServerCallContext context) { bool resultado = request.Valor > 100; return Task.FromResult(new NumeroResponse { EsMayor = resultado }); } }
6. El programa principal del servidor será el siguiente:
Program.cs
var builder = WebApplication.CreateBuilder(args); builder.Services.AddGrpc(); var app = builder.Build(); app.MapGrpcService<ValidarService>(); app.Run();
Ahora vamos por el proyecto cliente.
7. Creamos el proyecto:
$ dotnet new console -o GrpcClient
8. Nos ubicamos en el directorio creado. Y configuramos el archivo ``GrpcClient.csproj``:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net10.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <Protobuf Include="..\GrpcServer\Protos\validar.proto" GrpcServices="Client" /> </ItemGroup> <ItemGroup> <PackageReference Include="Grpc.Net.Client" Version="2.60.0" /> <PackageReference Include="Google.Protobuf" Version="3.34.1" /> <PackageReference Include="Grpc.Tools" Version="2.78.0" PrivateAssets="All" /> </ItemGroup> </Project>
Ejecutar esto para descargar paquetes:
$ dotnet restore
9. El programa principal del cliente será este:
Program.cs
using Grpc.Net.Client; using GrpcDemo; class Program { static async Task Main(string[] args) { using var channel = GrpcChannel.ForAddress("http://localhost:5203"); var client = new Validar.ValidarClient(channel); Console.Write("Ingrese un número: "); int numero = int.Parse(Console.ReadLine()); var response = await client.EsMayorQue100Async(new NumeroRequest { Valor = numero }); Console.WriteLine($"¿Es mayor a 100? {response.EsMayor}"); } }
10. Ejecutamos el servidor:
$ dotnet run --project GrpcServer
11. Ejecutamos el cliente:
$ dotnet run --project GrpcClient
Si todo va bien veremos esto en el servidor:
info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5203 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development info: Microsoft.Hosting.Lifetime[0]
Del lado del cliente:
Ingrese un número: 23 ¿Es mayor a 100? False
Podemos modificar el programa cliente de tal manera que solicite salir o continuar.
using Grpc.Net.Client; using GrpcDemo; class Program { static async Task Main(string[] args) { using var channel = GrpcChannel.ForAddress("http://localhost:5203"); var client = new Validar.ValidarClient(channel); string continuar; do { Console.Write("Ingrese un número: "); int numero = int.Parse(Console.ReadLine()); var response = await client.EsMayorQue100Async(new NumeroRequest { Valor = numero }); Console.WriteLine($"¿Es mayor a 100? {response.EsMayor}"); Console.WriteLine(); Console.Write("¿Desea continuar [s-n]? "); continuar = Console.ReadLine()?.Trim().ToLower(); Console.WriteLine(); } while (continuar == "s"); Console.WriteLine("Adios"); } }
Salida:
Ingrese un número: 23 ¿Es mayor a 100? False ¿Desea continuar [s-n]? s Ingrese un número: 200 ¿Es mayor a 100? True ¿Desea continuar [s-n]? n Adios
¡Hemos creado un proyecto cliente-servidor con gRPC y .NET!
Continuaremos con este tema en próximas entregas.
Enlaces:
https://codemonkeyjunior.blogspot.com/2026/02/grpc-una-alternativa-para-servicios-de.htmlhttps://alquimistadecodigo.blogspot.com/2026/03/grpc-con-go.html
https://alquimistadecodigo.blogspot.com/2026/03/grpc-con-python.html







