Skip to main content

Why middleware matters

Middleware lets you run logic before or after an endpoint without putting that logic inside every controller action. Typical uses:
  • CORS
  • Request logging
  • Route-aware auditing
  • Short-circuiting blocked requests
  • Adding data to Context.Items

Prefix middleware

Use RegisterMiddleware(...) to attach middleware to a route path or path prefix.
If the middleware writes the response and returns early, the endpoint is never called. Do not call Next(Context) after short-circuiting.

A practical CORS pattern

Pipeline stages

Use the overload with MiddlewareStage when a middleware depends on data only available later:
  1. Infrastructure
  2. Routing
  3. PreAuthorization
  4. Authorization
  5. PostAuthorization
  6. PreHandler
  7. Handler
  8. PostHandler
  • Route parameters are available from Routing and later
  • Authorization state is available from Authorization and later
  • Handler is reserved for the endpoint itself
You cannot register middleware in the Handler stage. That stage is reserved for the endpoint implementation.

Attribute-based middleware

Attach middleware directly to controllers and methods with [Middleware].
Middleware types declared through [Middleware] are constructed through Router.ServiceProvider, so constructor injection works for middleware classes too.

Default middleware behavior

  • RegisterMiddleware("/path", Middleware) defaults to PreHandler for all supported verbs
  • RegisterMiddleware(HttpMethodType.Get, "/path", Middleware) defaults to PreHandler for the exact method and path
  • Controller-level [Middleware] defaults to PreHandler
  • Method-level [Middleware] defaults to PreHandler
  • Controller-level middleware runs before method-level middleware
If you need middleware to run before routing, before authorization, or after the handler, choose an explicit MiddlewareStage instead of relying on the default.
Middleware types declared in [Middleware] must inherit MiddlewareBase.
Authorization builds directly on the middleware model and shows how protected endpoints are declared.