Pipeline Essentials
Middleware in Action
Crafting Custom Middleware
Middleware Best Practices
DI Refresher & Lifetimes
Advanced DI Scenarios
Custom Service Factories
Third-Party DI Containers
DI for Testability
Configuration Deep Dive
The Options Pattern
Validating Options
Auth Basics Refresher
JWT Authentication Deep Dive
OAuth 2.0 & OpenID Connect
Client Credentials Flow
Refresh Tokens & Revocation
Policy-Based Authorization
Custom Auth Requirements
Resource-Based Auth
Role & Claim-Based Auth
Input Validation & Sanitization
Rate Limiting & Throttling
CORS Configuration
HTTPS & HSTS
Logging & Monitoring Security
Common Vulnerabilities
Async/Await Deep Dive
Task Parallel Library
Configuring Async Context
In-Memory Caching
Distributed Caching Basics
Redis for Distributed Cache
Response Caching
Cache Invalidation Patterns
Pagination Techniques
Filtering & Sorting
Data Projection
Batching & Bulk Operations
Streaming Large Responses
Why Version APIs?
URL-Based Versioning
Query String Versioning
Header-Based Versioning
Media Type Versioning
Choosing a Strategy
Intro to OpenAPI & Swagger
Integrating Swashbuckle
Customizing Swagger Docs
Documenting API Versions
Advanced Swagger Features
RESTful Design Principles
Resource Modeling
HATEOAS in APIs
Consistent Error Handling
Unit Test Fundamentals
Testing Controllers
Testing Services & Logic
Testing Custom Middleware
Integration Test Basics
Testing API Endpoints
Testing Data Persistence
Advanced Test Fixtures
Docker Fundamentals
Containerizing Your API
Managing API Dependencies
Environment & Configuration
Container Orchestration Intro
Minimal API Essentials
Routing & Endpoints
Dependency Injection
Input & Output
Validation & Error Handling
Filters & Middleware
Authentication & AuthZ
Grouping & Versioning
gRPC: The Basics
Protocol Buffers
Building gRPC Services
gRPC Client Dev
Streaming gRPC
Error Handling in gRPC
gRPC in Microservices