Guard Clauses in C#: Cleaner Validation and Fail-Fast Code

Discover how guard clauses in C# simplify validation and error handling. Learn to write fail-fast code, avoid nested conditionals, and keep business logic clean with modern language features and reusable helpers.

July 6, 2025 · 4 min

Recommended Middleware Order in ASP.NET Core for Secure, Fast, and Correct Pipelines

Discover the optimal middleware order for ASP.NET Core. See why each step matters, how to avoid common pitfalls, and use a proven pipeline template for secure, fast, and maintainable web APIs.

July 3, 2025 · Last modified: July 9, 2025 · 3 min

ASP.NET Core HTTP Logging Middleware: 13 Practical Micro Tips

TL;DR - Practical Tips for ASP.NET Core HTTP Logging Middleware Use EnableBuffering() to safely log request bodies and reset stream position after reading. Capture response bodies by swapping HttpResponse.Body with a MemoryStream and restoring after logging. Always filter or redact sensitive data before logging HTTP bodies. Set size limits and skip large or binary payloads to avoid performance issues. Filter logs by endpoint, HTTP method, or custom attributes for clarity. Built-in HttpLogging is simple; custom middleware offers full control and advanced filtering. Use structured logging and external services for production monitoring. Wrap middleware in extension methods for clean, configurable registration. Leverage PipeReader and System.IO.Pipelines for more efficient memory usage. Use Span<T> and ArrayPool<T> for zero-allocation processing of large payloads. Consider implementing request sampling in production to reduce log volume. Use a complete middleware implementation that combines all best practices. 1. How does EnableBuffering help you log request bodies in ASP.NET Core? EnableBuffering allows you to read request bodies multiple times without breaking the pipeline. ...

July 2, 2025 · Last modified: July 9, 2025 · 15 min

C#: Abstract Class or Interface? 10 Questions to Ask

Quick Reference Table Feature Abstract Class Interface When to Use Inheritance Single only Multiple allowed Abstract: shared logic; Interface: contracts Implementation Can provide Contract only Abstract: code reuse; Interface: flexibility Constructors Supported Not allowed Abstract: initialization; Interface: pure contracts State/Fields Yes No Abstract: data sharing; Interface: behavior only Performance Slightly faster Virtual dispatch Abstract: hot paths; Interface: most scenarios Testing Can be difficult Easy with mocks Abstract: integration tests; Interface: unit tests Common Pitfalls: ...

July 1, 2025 · Last modified: August 15, 2025 · 11 min
×