Lesson 18 of 40
Web Development
Advanced
45 min
gRPC & Protobuf Services
Build high-performance, strongly-typed microservice communication with gRPC in .NET 10 and VS 2026's proto tooling.
Part 1: Proto File Definition
// orders.proto
syntax = "proto3";
package orders;
service OrderService {
rpc GetOrder (GetOrderRequest) returns (OrderResponse);
rpc StreamOrders (StreamRequest) returns (stream OrderResponse);
}
syntax = "proto3";
package orders;
service OrderService {
rpc GetOrder (GetOrderRequest) returns (OrderResponse);
rpc StreamOrders (StreamRequest) returns (stream OrderResponse);
}
Part 2: Server Implementation
public class OrderGrpcService : OrderService.OrderServiceBase
{
public override async Task<OrderResponse> GetOrder(
GetOrderRequest request, ServerCallContext context)
{
var order = await _service.GetByIdAsync(request.Id);
return order.ToProto();
}
}
{
public override async Task<OrderResponse> GetOrder(
GetOrderRequest request, ServerCallContext context)
{
var order = await _service.GetByIdAsync(request.Id);
return order.ToProto();
}
}
Part 3: Client-Side Streaming
using var stream = client.StreamOrders(new StreamRequest());
await foreach (var order in stream.ResponseStream.ReadAllAsync())
{
Console.WriteLine($"Order: {order.Id} - {order.Status}");
}
await foreach (var order in stream.ResponseStream.ReadAllAsync())
{
Console.WriteLine($"Order: {order.Id} - {order.Status}");
}
Part 4: gRPC-Web for Browsers
gRPC-Web lets browsers call gRPC services via HTTP/1.1:
builder.Services.AddGrpcWeb(o => o.DefaultEnabled = true);
app.UseGrpcWeb();
// JS client uses @improbable-eng/grpc-web
app.UseGrpcWeb();
// JS client uses @improbable-eng/grpc-web