Skip to content

HTTP chain detail page

The HTTP chain detail page is what you land on when you click a Wolverine row in the HTTP tab. It shows what Wolverine actually generated for one route — the C# class your handler runs through, and the OpenAPI shape consumers will see.

Route: /service/:serviceId/http/:chainId

Each chain id is a stable hash of (HTTP method + route + handler) so bookmarking the URL stays valid across redeploys until the route or the handler method moves.

Hero bar

The top of the page packs everything you need to recognise the endpoint at a glance:

  • HTTP method badge(s) — color-coded GET / POST / PUT / DELETE / PATCH
  • The full route pattern, e.g. /orders/{id}
  • The handler — Type.Method
  • Chips:
    • Authorize — when the chain has any [Authorize] attribute
    • Transactional — when [Transactional] is applied (or a runtime policy made it transactional)
    • Outbox — when the chain depends on IMessageBus / MessageContext (Wolverine wraps it in the outbox)
    • vN — one chip per declared API version (collapsed multi-version chains)
    • Deprecated — when the chain is deprecated for the current version

If the chain has an OpenAPI summary, it appears under the chips.

Tabs

Overview

Plain operator-friendly summary of the endpoint:

  • Operation id
  • Description (from XML doc / EndpointDescription)
  • Method signature
  • Request type (when present)
  • Resource type (response payload type)
  • Tenancy mode + content-negotiation mode

If the chain emits cascading messages (events, follow-up commands), they appear as chips you can click to jump to the per-message-type page. Service dependencies the chain resolves at runtime are listed too — handy for spotting unexpected DI graph reach.

Generated Code

Empty until clicked — Wolverine's source-code round-trip fires the first time you open the tab. CritterWatch sends a RequestHttpChainSourceCode message keyed by the stable chain id; the running service materializes the C# class Wolverine emits, replies with HttpChainSourceCodeReported, and the tab swaps the spinner for a syntax-highlighted preview with Copy and Refresh buttons.

The result is cached per (service, chain id) until the service version rolls or you hit Refresh — repeat openings of the tab don't refetch.

This is the actual code Wolverine compiles and runs against the request. Reading it is the easiest way to understand exactly what middleware ran, in what order, and what data the handler saw.

Precompiled-mode caveat. If the host runs Wolverine in precompiled (static) codegen mode, the runtime never materializes per-chain source code — the preview can't be reconstructed and the tab shows a yellow alert asking you to switch to runtime codegen mode. Other tabs are unaffected. Hosts opt in to the round-trip by adding services.AddCritterWatchHttp() from the Wolverine.CritterWatch.Http package; pure-Wolverine workers without ASP.NET Core skip the dependency entirely.

OpenAPI

Three sub-panels mirror the OpenAPI document layout:

  • Request — parameters table (path / query / header) plus a request-body schema tree
  • Responses — one card per status code with one schema tree per media type
  • Security — auth schemes, scopes, OAuth2 flow data when available

Schema trees expand on click. Deep cycles or types deeper than three levels show as a $ref chip — click to keep reading on a separate detail (planned), today it surfaces the full type name so you know what's underneath.

Pipeline

Ordered visual of what runs around your handler:

  • Middleware steps in apply order
  • Your handler call
  • Postprocessor steps in apply order

Each step shows its kind (Middleware / Postprocessor / Validation / Audit) and a description sourced from the chain's compiled metadata. If you've layered policies on top — fluent validation, request-id tagging, antiforgery, tenant detection — they all show up here in their applied order.

When fields are empty

  • If Wolverine.Http isn't on the host or no chain matched, the chain id you bookmarked may have changed across a deploy that touched the route or method name. The page renders a "not currently known" message.
  • If AddEndpointsApiExplorer() wasn't called on the host, the OpenAPI tab will be empty even though the page itself renders. Add it on the host to populate.

Released under the MIT License.