Junior 4 min · March 06, 2026

gRPC ASP.NET Core — Silent Leak from Missing Deadline

Without a deadline, gRPC calls hold connections indefinitely, exhausting the client pool after a few hours — leading to DEADLINE_EXCEEDED errors..

N
Naren Founder & Principal Engineer

20+ years shipping production .NET services in enterprise systems. Drawn from code that ran under real load.

Follow
Production
production tested
May 24, 2026
last updated
1,554
articles · all by Naren
 ● Production Incident 🔎 Debug Guide ⚙ Triage Commands
Quick Answer
  • gRPC uses Protocol Buffers for binary, strongly-typed contracts
  • ASP.NET Core adds first-class gRPC support via Grpc.AspNetCore
  • Unary, server-streaming, client-streaming, and bidirectional streaming are the four RPC types
  • Interceptors act like middleware — they inspect and modify calls at the server or client
  • Production traps: deadlines not set, load balancers that don't support HTTP/2, and browser limitations
  • Performance: Protobuf serialization is 3–10x faster and 3–10x smaller than JSON
✦ Definition~90s read
What is gRPC with ASP.NET Core?

gRPC is a high-performance RPC framework by Google that uses Protocol Buffers for serialization and HTTP/2 for transport. ASP.NET Core provides built-in support via the Grpc.AspNetCore package, which integrates with Kestrel's HTTP/2 pipeline. Unlike REST, where you craft endpoints manually, gRPC generates client and server stubs from a shared .proto contract.

Imagine two chefs in different restaurants trying to share a recipe.

This means both sides speak the same typed language — no guessing field names, no parsing JSON strings for every call. ASP.NET Core adds dependency injection, logging, and middleware (interceptors) out of the box, making it a natural home for gRPC in the .NET ecosystem.

Plain-English First

Imagine two chefs in different restaurants trying to share a recipe. Instead of texting paragraphs back and forth (REST/JSON), they agree on a printed recipe card template upfront — every blank is numbered, every measurement is exact, no ambiguity. gRPC is that pre-agreed recipe card. Both sides know exactly what goes where before a single byte travels the wire, so communication is lightning-fast and impossible to misinterpret. The recipe card format is called a .proto file, and it's the contract both sides sign before the conversation even starts.

Microservices are eating the enterprise, and with that comes a brutal problem: how do dozens of services talk to each other efficiently, reliably, and without turning into a web of hand-rolled HTTP clients? REST and JSON got us far, but they carry hidden costs — verbose payloads, no enforced contracts, no built-in streaming, and type information that evaporates at the boundary. At scale, these costs compound. A single inter-service call that serializes a 50-field object as JSON a million times a day quietly burns CPU, bandwidth, and developer sanity.

gRPC was built by Google to solve exactly this. It puts a strongly-typed contract — the .proto file — at the center of every conversation, uses Protocol Buffers for binary serialization that's 3–10x smaller than equivalent JSON, and rides HTTP/2 so you get multiplexing, header compression, and real bidirectional streaming for free. ASP.NET Core embraced gRPC as a first-class citizen starting with .NET 3.0, meaning you get Kestrel's raw performance, the full DI ecosystem, middleware, and health checks all wired up without ceremony.

By the end of this article you'll know how Protobuf encodes data on the wire, how to build all four gRPC communication patterns in ASP.NET Core (unary, server-streaming, client-streaming, and bidirectional), how to write interceptors that behave like middleware, and exactly which production traps — deadlines, load balancing, browser compatibility — will catch you off-guard if you don't know they're there.

What is gRPC and Why ASP.NET Core?

gRPC is a high-performance RPC framework by Google that uses Protocol Buffers for serialization and HTTP/2 for transport. ASP.NET Core provides built-in support via the Grpc.AspNetCore package, which integrates with Kestrel's HTTP/2 pipeline. Unlike REST, where you craft endpoints manually, gRPC generates client and server stubs from a shared .proto contract. This means both sides speak the same typed language — no guessing field names, no parsing JSON strings for every call. ASP.NET Core adds dependency injection, logging, and middleware (interceptors) out of the box, making it a natural home for gRPC in the .NET ecosystem.

greet.protoPROTOBUF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
syntax = "proto3";

option csharp_namespace = "io.thecodeforge.Greet";

package greet;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}
Analogies for gRPC vs REST
  • REST: each request carries its own schema (JSON). The server parses and validates every time.
  • gRPC: the schema (proto) is agreed before the first call. Serialization is a binary protocol — fast and deterministic.
  • This difference matters when you have 1000+ services exchanging billions of messages per day.
Production Insight
In one production incident, a team switched from REST to gRPC for their internal inventory service. Latency dropped by 45% and CPU utilization by 30% because they eliminated JSON serialisation overhead. The catch: they had to retrain the deployment team to handle HTTP/2 load balancers.
Rule: measure the serialization cost before migrating — if your messages are small and rare, gRPC may not be worth the complexity.
Key Takeaway
gRPC enforces a typed contract; ASP.NET Core makes it a first-class citizen.
If you need performance and type safety across service boundaries, start with gRPC.
gRPC ASP.NET Core Silent Leak from Missing Deadline THECODEFORGE.IO gRPC ASP.NET Core Silent Leak from Missing Deadline Flow from Protobuf generation to production pitfalls Protobuf & Code Generation Define .proto, generate C# stubs ASP.NET Core gRPC Service Implement 4 streaming patterns Interceptors (Middleware) Add cross-cutting logic Client Setup via NuGet Configure channel and client Deadline Propagation Set timeout on client call Production Gotchas Load balancing, deadline leaks ⚠ Missing deadline causes silent resource leak Always set Deadline on gRPC calls THECODEFORGE.IO
thecodeforge.io
gRPC ASP.NET Core Silent Leak from Missing Deadline
Grpc Aspnet Core

Protobuf Wire Format and Code Generation

Protocol Buffers (Protobuf) are the serialization engine of gRPC. Messages are defined in .proto files, then compiled into C# classes by the protoc compiler or the Grpc.Tools NuGet package. The on-the-wire format is a compact binary representation: field tags, wire types, and values. Varint encoding keeps small integers small, and fields can be omitted entirely if not set. This results in payloads often 3–10x smaller than equivalent JSON.

The code generator produces both the message classes (with Equals/GetHashCode overrides, ToString, and Clone) and the service stubs (client proxy and server base). In ASP.NET Core, you reference the generated files from your .csproj and implement the server base class. The generated client handles serialization, HTTP/2 framing, and connection pooling.

GreeterService.csC#
1
2
3
4
5
6
7
8
9
10
11
12
13
using Grpc.Core;
using io.thecodeforge.Greet;

namespace io.thecodeforge.Services;

public class GreeterService : Greeter.GreeterBase
{
    private readonly ILogger<GreeterService> _logger;
    public GreeterService(ILogger<GreeterService> logger) => _logger = logger;

    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
    {\n        _logger.LogInformation(\"Saying hello to {Name}\", request.Name);\n        return Task.FromResult(new HelloReply\n        {\n            Message = $\"Hello {request.Name}\"\n        });\n    }\n}"
      }

Building All Four gRPC Streaming Patterns in ASP.NET Core

gRPC defines four RPC types: unary (one request, one response), server-streaming (one request, multiple responses), client-streaming (multiple requests, one response), and bidirectional streaming (multiple requests, multiple responses). ASP.NET Core supports all four with simple async method signatures.

Unary is the most common; streaming is where gRPC shines for real-time data. Server-streaming is ideal for watch operations (e.g., monitoring stream). Client-streaming is useful for uploads or batch processing. Bidirectional streaming enables chat, live collaboration, or game state sync.

Here's a server-streaming example: a service that returns stock price updates.

StockService.csC#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using Grpc.Core;
using io.thecodeforge.Stock;

namespace io.thecodeforge.Services;

public class StockService : Stock.StockBase
{
    public override async Task StreamStockPrices(
        StockRequest request,
        IServerStreamWriter<StockPrice> responseStream,
        ServerCallContext context)
    {\n        while (!context.CancellationToken.IsCancellationRequested)\n        {\n            var price = await GetCurrentPriceAsync(request.Symbol);\n            await responseStream.WriteAsync(price);\n            await Task.Delay(1000, context.CancellationToken);\n        }
    }

    private async Task<StockPrice> GetCurrentPriceAsync(string symbol)
    {
        // Simulate price fetch
        await Task.Delay(100);
        return new StockPrice
        {
            Symbol = symbol,
            Price = Random.Shared.NextDouble() * 1000,
            Timestamp = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow)
        };
    }
}
Streaming and Cancellation
CancellationToken is your safety net. If the client disconnects, the token is cancelled. The server should throw an RpcException with StatusCode.Cancelled when cancelled. Not respecting cancellation leads to resource leaks.
Production Insight
The most common streaming bug: server not checking cancellation between writes. If the client disconnects, the server continues writing to a broken stream, eventually causing an ObjectDisposedException. Always WriteAsync with CancellationToken and check it inside loops.
Rule: always pass cancellation token to WriteAsync and loop conditions.
Key Takeaway
Choose streaming patterns based on data flow, not comfort.
Always check cancellation — it's the number one streaming bug in production.
Choosing the Right RPC Type
IfSingle request, single response
UseUnary — simplest, fastest.
IfSingle request, stream of responses
UseServer-streaming — e.g., monitoring, logs.
IfStream of requests, single response
UseClient-streaming — e.g., file upload, batch query.
IfStream of requests, stream of responses
UseBidirectional streaming — e.g., chat, real-time collaboration.

Interceptors — gRPC Middleware in ASP.NET Core

Interceptors are the gRPC analogue of ASP.NET Core middleware. They run before and after each RPC call on both the server and client side. Use them for cross-cutting concerns like logging, authentication, rate limiting, and metrics.

Server-side interceptors implement Interceptor and override UnaryServerHandler, ServerStreamingServerHandler, etc. Client-side interceptors work similarly. They are registered via DI and can be ordered.

A common pattern is a server interceptor that validates the JWT token from the metadata and sets a user identity for the handler.

AuthInterceptor.csC#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using Grpc.Core;
using Grpc.Core.Interceptors;

namespace io.thecodeforge.Interceptors;

public class AuthInterceptor : Interceptor
{
    private readonly ILogger<AuthInterceptor> _logger;

    public AuthInterceptor(ILogger<AuthInterceptor> logger) => _logger = logger;

    public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(\n        TRequest request,\n        ServerCallContext context,\n        UnaryServerMethod<TRequest, TResponse> continuation)
    {
        var authHeader = context.RequestHeaders.GetValue("authorization");
        if (string.IsNullOrEmpty(authHeader))
        {
            _logger.LogWarning("Missing authorization header");
            throw new RpcException(new Status(StatusCode.Unauthenticated, "Missing auth token"));
        }

        // Validate token — omitted for brevity
        // var user = await ValidateTokenAsync(authHeader);
        // context.UserState["User"] = user;

        return await continuation(request, context);
    }
}
Interceptors vs Middleware
  • Middleware: can modify raw HTTP/2 frames, authentication, compression. Use for global HTTP concerns.
  • Interceptors: have access to the deserialized request/response objects and metadata headers. Use for gRPC-specific logic.
  • Recommendation: use middleware for authentication and rate limiting; use interceptors for business context enrichment and logging.
Production Insight
A team once put a heavy authentication interceptor on every call. It validated the token against an external service, which added 50ms per call. That's fine for unary, but for bidirectional streaming, that interceptor runs only once at the start — but the external call still blocks the stream setup. If the external auth service is down, no streaming at all. The fix: use a health check endpoint for streaming and authenticate each message internally with a lightweight key.
Rule: keep interceptors lightweight for streaming; offload heavy validation to startup handshake.
Key Takeaway
Interceptors = middleware for gRPC.
Don't block streaming calls with heavyweight interceptors — validate once, then use context.

Production Gotchas: Deadlines, Load Balancing, and Browser Compatibility

gRPC relies on HTTP/2, which brings several production pitfalls.

  1. Deadlines: gRPC calls can hang forever if no deadline is set. Always set a client-side deadline (Deadline) and respect CancellationToken on the server.
  2. Load Balancing: L7 load balancers need to support HTTP/2 connection multiplexing. Many legacy balancers (e.g., AWS Classic LB) don't — they break gRPC. Use Envoy, Nginx with HTTP/2, or a gRPC-aware balancer. Also, gRPC connections are typically long-lived; round-robin load balancing across connections may not evenly distribute requests. Use client-side load balancing or a service mesh.
  3. Browser Compatibility: gRPC-Web or gRPC JSON transcoding needed for browser clients. ASP.NET Core supports gRPC-Web via app.UseGrpcWeb().
  4. Health Checks: Built-in gRPC health check protocol (grpc.health.v1.Health) enables liveness and readiness probes without custom endpoints.
Program.csC#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
builder.Services.AddGrpcHealthChecks();

var app = builder.Build();

app.MapGrpcHealthChecksService();

// Enable gRPC-Web for browser clients
app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true });

app.MapGrpcService<io.thecodeforge.Services.GreeterService>();

app.Run();
gRPC-Web Not Enabled
If you host a Blazor WASM or React app that calls gRPC directly, the browser does not support full HTTP/2. You must enable gRPC-Web on the server. Without it, you get CORS errors or protocol violations.
Production Insight
A team deployed a gRPC service behind an AWS Classic Load Balancer. Calls succeeded in dev (direct) but failed in prod with UNAVAILABLE. Root cause: Classic LB does not support HTTP/2. They switched to an Application Load Balancer with HTTPS listener and the issue resolved. Then they discovered that ALB's idle timeout (60s) was causing long-running streaming calls to disconnect. They set the idle timeout to 400s and added keepalive pings.
Rule: use gRPC-aware load balancers (Envoy, ALB, Nginx with http2) and align idle timeouts with your streaming duration.
Key Takeaway
Deadlines, load balancer HTTP/2 support, and browser compatibility are the top three production gotchas.
Test behind your actual infrastructure before going live.
Production Checklist
IfClient is a browser
UseEnable gRPC-Web or use JSON transcoding.
IfBehind a load balancer
UseEnsure LB supports HTTP/2 and configure idle timeout > streaming max duration.
IfNeed to monitor service health
UseImplement gRPC health checks and probe them from orchestrator.

gRPC Client Setup: Don't Let NuGet Eat Your Weekend

You've built the server. Now the client needs to talk to it without dying at 2 AM. The official templates hide the wiring, but production doesn't forgive magic. You need the right packages, the right proto reference, and zero assumptions about network topology. The client is where most timeouts and serialization bugs surface. Here's the blueprint for a console client that won't betray you. Start with Grpc.Net.Client for the core, Google.Protobuf for message deserialization, and Grpc.Tools for code generation. Never use the full framework unless you need gRPC-Web or special auth. The proto file must be copied and linked — not just referenced — or your builds will fail silently when the contract changes. Set the channel address from configuration, not a string literal. In production, that address changes faster than your sprint goals.

GrpcGreeterClient.csprojXML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Grpc.Net.Client" Version="2.62.0" />
    <PackageReference Include="Google.Protobuf" Version="3.27.0" />
    <PackageReference Include="Grpc.Tools" Version="2.62.0">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
  </ItemGroup>

  <ItemGroup>
    <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
  </ItemGroup>

</Project>
Output
dotnet build // No errors means protobuf compiled successfully
Production Trap:
If you reference the proto file from the server project, your client build breaks every time the server proto changes. Copy the proto. Own your contract.
Key Takeaway
Always set GrpcServices="Client" in your protobuf item group. A missing attribute compiles server-side code into your client, bloating it and risking runtime crashes.

The Greeter Client: One Call, One Shot, No Second Chances

Now you have the packages. Now you write the code that actually calls the service. This is where theory meets the debugger. The Greeter service expects a HelloRequest with a name. Your client sends it and expects a HelloReply. Straightforward? Yes, until the channel is dead or the deadline expired. Create a GrpcChannel pointing at your server's HTTPS endpoint. Use insecure only in dev, and never on a shared network. Build the GreeterClient from that channel. Wrap the call in a try-catch for RpcException. gRPC throws on network failures, not nulls. The async call awaits the response. A successful reply returns the Message field. Anything else is a failure you log, then fix. Never swallow exceptions in production — your on-call phone will ring.

Program.csCSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// io.thecodeforge
using Grpc.Net.Client;
using GrpcGreeterClient;

var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);

try
{
    var reply = await client.SayHelloAsync(
        new HelloRequest { Name = "Production" });
    Console.WriteLine($"Greeting: {reply.Message}");
}
catch (RpcException ex)
{
    Console.Error.WriteLine($"gRPC error {ex.StatusCode}: {ex.Message}");
    // Alert: PagerDuty goes here in real life
}

Console.WriteLine("Press any key to exit...");
Console.ReadKey();
Output
Greeting: Hello Production
Why synchronous doesn't exist:
gRPC client calls are async-only. You block at your own peril — the channel uses non-blocking I/O. Use await or Task.Wait with a timeout. But seriously, just await.
Key Takeaway
GrpcChannel is expensive to create. Build once, reuse across the app. A new channel per request kills performance and blows up socket counts.
● Production incidentPOST-MORTEMseverity: high

Deadline Not Propagated — The Silent Connection Leak

Symptom
gRPC calls started failing with DEADLINE_EXCEEDED after a few hours. The server had plenty of CPU/memory, but client-side connection pool was exhausted.
Assumption
The new streaming endpoint was causing more load. Adding more server replicas would fix it.
Root cause
The client had not set a deadline on the gRPC call. The server's default deadline was infinite, so long-running calls held connections open indefinitely. The client code did var call = client.SomeMethod(request); without a cancellation token or deadline.
Fix
Always set a deadline on every gRPC call: var call = client.SomeMethod(request, deadline: DateTime.UtcNow.AddSeconds(5)); Use CancellationToken for cancellation. On the server side, enforce a maximum deadline via CallContext.Deadline or middleware.
Key lesson
  • Always set a deadline on every gRPC call, even local ones.
  • Test connection recovery by killing the server and observing client behaviour.
  • Monitor gRPC metrics: pending calls, call duration, and connection count.
Production debug guideCommon symptoms and their root causes when gRPC calls fail in ASP.NET Core4 entries
Symptom · 01
Call returns DEADLINE_EXCEEDED after a few seconds
Fix
Check if the client set a deadline. Server might be slow — profile the server-side method. Use grpc.invoke.latency metrics.
Symptom · 02
UNAVAILABLE — No healthy upstream
Fix
Load balancer may not support HTTP/2. Check that your reverse proxy (nginx, Envoy) is configured for HTTP/2. Verify the gRPC health check endpoint is responding.
Symptom · 03
INTERNAL error: StatusCode.Unknown
Fix
Enable gRPC detailed error logging: app.UseGrpcWeb(); or set GrpcChannelOptions.ThrowOperationCanceledOnCancellation = true. Check server-side exception logs.
Symptom · 04
Call hangs for over a minute then times out
Fix
Likely no deadline set or too long. Check GrpcChannel.MaxRetryBufferSize and ensure deadlines are propagated. Use CallContext.Deadline to enforce server-side timeout.
★ gRPC Debugging CommandsQuick commands to diagnose gRPC issues in ASP.NET Core production environments
Deadline exceeded errors
Immediate action
Check if client set deadline and server has cancellation token
Commands
dotnet-counters monitor --process-id $(pid) Grpc.AspNetCore.Server.TotalCalls
kubectl logs -l app=my-grpc-service --tail=100 | grep -i deadline
Fix now
Add deadline to client call: new GrpcCallOptions { Deadline = DateTime.UtcNow.AddSeconds(5) }
Connection refused / UNAVAILABLE+
Immediate action
Test if the port is listening and HTTP/2 is enabled
Commands
curl -v --http2-prior-knowledge http://localhost:5001/grpc.health.v1.Health/Check 2>&1 | grep -i 'HTTP/2|error'
kubectl exec -it pod-name -- wget -qO- http://localhost:5001/grpc.health.v1.Health/Check
Fix now
Ensure Kestrel is configured for HTTP/2: builder.WebHost.ConfigureKestrel(options => options.ListenAnyIP(5001, o => o.Protocols = HttpProtocols.Http2));
Streaming call hangs indefinitely+
Immediate action
Check if the stream is being written or read correctly on both sides
Commands
dotnet-dump collect --process-id $(pid) && dotnet-dump analyze dump.dmp > threads.txt
grep -c 'Grpc.Core.AsyncClientStreamingCall\|WriteAsync\|MoveNext' threads.txt
Fix now
Ensure server writes complete the stream and client loops on MoveNext until cancelled.
gRPC vs REST vs SignalR in ASP.NET Core
FeaturegRPCREST/JSONSignalR
Contract enforcementStrong (via .proto file)Weak (openAPI optional)Weak (hub method signatures)
Payload sizeBinary, 3-10x smaller than JSONVerbose JSONJSON (configurable)
StreamingNative bidirectionalNot built-inBidirectional via WebSocket
PerformanceHighest (binary + HTTP/2)Moderate (HTTP/1.1 or 2)High (WebSocket persistent)
Browser supportgRPC-Web requiredNativeNative via JS client
Tooling & ecosystem.NET, Go, Java, Python, etc.Universal.NET first-class

Key takeaways

1
gRPC is a high-performance RPC framework with strong contracts and binary serialization.
2
ASP.NET Core offers first-class support for gRPC including DI, interceptors, and health checks.
3
Always set deadlines and use cancellation tokens to prevent resource leaks.
4
Streaming requires careful cancellation handling to avoid disposal exceptions.
5
Production deployment must account for HTTP/2 load balancing and browser gRPC-Web.
6
Interceptors are powerful but can become blocking bottlenecks
keep them lightweight for streaming.

Common mistakes to avoid

4 patterns
×

Not setting a deadline on gRPC calls

Symptom
Calls hang indefinitely, connections leak, and the service becomes unresponsive after enough idle calls accumulate.
Fix
Always set Deadline (e.g., DateTime.UtcNow.AddSeconds(5)) on each call. Use CancellationToken for cancellation.
×

Using stream without cancellation

Symptom
Server continues writing after client disconnects, causing ObjectDisposedException and log noise.
Fix
Check context.CancellationToken in streaming loops and pass it to WriteAsync. Throw RpcException on cancellation.
×

Deploying behind an HTTP/1.1 load balancer

Symptom
UNAVAILABLE status code, clients cannot connect. The LB terminates HTTP/2 and the gRPC protocol fails.
Fix
Use an L7 LB that supports HTTP/2 (AWS ALB, Nginx with http2, Envoy). Configure HttpProtocols.Http2 in Kestrel.
×

Ignoring gRPC-Web for browser clients

Symptom
CORS errors or protocol violations when calling gRPC from JavaScript.
Fix
Enable app.UseGrpcWeb() and annotate services with .EnableGrpcWeb(). Use the grpc-web JavaScript client.
INTERVIEW PREP · PRACTICE MODE

Interview Questions on This Topic

Q01SENIOR
Explain the difference between gRPC unary and streaming calls. When woul...
Q02SENIOR
How does gRPC handle load balancing? Why is it different from REST load ...
Q03SENIOR
What are interceptors in gRPC and how do you implement them in ASP.NET C...
Q04JUNIOR
How do you handle deadlines and cancellation in gRPC?
Q01 of 04SENIOR

Explain the difference between gRPC unary and streaming calls. When would you use each?

ANSWER
Unary: one request, one response. Use for standard query/response (e.g., GetUser). Server-streaming: one request, multiple responses (e.g., watch updates). Client-streaming: multiple requests, one response (e.g., batch upload). Bidirectional: both streams (e.g., chat). Choose based on the data flow pattern.
FAQ · 4 QUESTIONS

Frequently Asked Questions

01
What is gRPC with ASP.NET Core in simple terms?
02
Do I need a separate proto compiler?
03
Can I call gRPC from a browser?
04
Why is my gRPC call failing with UNAVAILABLE?
N
Naren Founder & Principal Engineer

20+ years shipping production .NET services in enterprise systems. Drawn from code that ran under real load.

Follow
Verified
production tested
May 24, 2026
last updated
1,554
articles · all by Naren
🔥

That's ASP.NET. Mark it forged?

4 min read · try the examples if you haven't

Previous
Minimal APIs in ASP.NET Core
10 / 14 · ASP.NET
Next
Health Checks in ASP.NET Core