Real-Time Web Apps with SignalR
Most web apps follow a simple pattern: the client asks, the server answers. That works great for fetching a list of orders or loading a profile page. But what about a live dashboard, a chat app, or no...
Authentication and Authorization in ASP.NET Core
If you're building any real ASP.NET Core app, you'll hit this question quickly: "How do I lock this down without making everything painful?"
Authentication and authorization sound similar, b...
Using Json.NET in ASP.NET Core on .NET 10
ASP.NET Core has shipped System.Text.Json as its default serializer since .NET Core 3.0. It's fast, it's trim-safe, and it keeps getting better. But Json.NET (Newtonsoft.Json) is still everywhere — in...
Building gRPC Services in ASP.NET Core
If you've built microservices with REST you've probably hit a point where JSON over HTTP starts feeling a bit heavy — verbose payloads, no shared contract, no streaming. gRPC fixes most of that. It's ...
Beautiful .NET Consoles with Spectre.Console
If you've ever shipped a .NET command-line tool and felt embarrassed by its plain, colourless output, Spectre.Console is the library you've been waiting for. It brings Python's beloved Rich library to...
Feature Flags in .NET
Shipping code is one thing. Deciding who sees it, and when, is another. Feature flags let you decouple deployment from release — you push code to production, but the feature stays off until you're rea...
Resilience with Polly in .NET
Distributed systems fail. A downstream API goes slow, a database hiccups, a network packet gets lost. Your code can either pretend that doesn't happen (and get paged at 2am) or handle it gracefully. P...
Global Error Handling in ASP.NET Core
Every ASP.NET Core app will encounter unhandled exceptions. A database goes away, a downstream service times out, someone passes a value your code didn't anticipate. How you handle those exceptions — ...
Validation with FluentValidation
If you've been using data annotations to validate request models — [Required], [MaxLength], [Range] — you've probably hit the wall where they stop being enough. Conditional rules, cross-property valid...
Caching in ASP.NET Core
Caching is one of those things that looks simple on the surface — store a value, read it back later — but there's a surprising amount of nuance once you start applying it to real services. ASP.NET Cor...
HttpClient Factory in .NET
If you've ever written new HttpClient() inside a method call, congratulations — you've probably introduced a socket exhaustion bug. It's one of the most common mistakes in .NET, and it's subtle enough...
Rate Limiting in ASP.NET Core
Every public API is one viral moment away from being hammered into the ground. Rate limiting is the mechanism that stands between your service and the flood — it caps how many requests a client can ma...
Middleware in ASP.NET Core
Every HTTP request that hits an ASP.NET Core application passes through a pipeline before it ever reaches your endpoint. That pipeline is built from middleware — small pieces of code that each get a c...
The Options Pattern in .NET
Configuration is one of those things that looks simple until it isn't. You start by reading a connection string from appsettings.json, and before long you've got a sprawling mix of IConfiguration.GetS...
Minimal APIs in ASP.NET Core
When ASP.NET Core Minimal APIs landed in .NET 6, I'll be honest — I wasn't sure what to make of them. Controllers had worked fine for years. Why change things? Then I used them for a small internal to...