dotnet-web-backend

Installation
SKILL.md

.NET Web / HTTP Service Conventions

This is the web hub - the first skill to load for any HTTP service, the place the cross-cutting concerns every ASP.NET Core app shares are decided once. It is deliberately architecture-neutral: it tells you how the HTTP client, validation, resilience, observability, and caching layers behave, and it sends you to a focused companion for endpoint mechanics, errors, OpenAPI, and auth. It mandates no particular architecture - that is a separate, deliberate choice covered below. Floor is .NET 8 / C# 12; anything that needs a later runtime is flagged.

On .NET Framework 4.8 the classic pipeline (MVC 5 / Web API 2 / Web Forms) differs materially - the single-threaded request context, no IHttpClientFactory, the OWIN pipeline - see references/net-framework-48.md.

Architecture - pick exactly one, here

This is the single home of the architecture rule, and it has one job: stop two patterns living side by side in one repo.

  • In an established codebase, the existing architecture wins. Match its structure exactly; do not introduce a second pattern alongside the one already there, even a 'better' one. A repo with two architectures has neither.
  • For greenfield work the architecture is a deliberate decision - load dotnet-architecture and follow its pick-one rule (one internal style per codebase, plus the topology and DDD-additive axes). The decision layer and each style's depth live in that hub; do not restate it here.
  • Everything below this section - HTTP, validation, resilience, API design, observability, caching - applies unchanged whichever architecture you picked. These are pipeline concerns; they sit underneath the architecture, not inside it.

HTTP and packages

Reach for IHttpClientFactory and never new HttpClient(). A factory-managed client pools and rotates its handlers, so it picks up DNS changes and avoids the socket exhaustion a long-lived raw client causes. Prefer a typed client (AddHttpClient<TClient>()) so the call surface is an injected, testable interface rather than a stringly-keyed lookup, and so the resilience handler below has one obvious place to attach.

Use Directory.Packages.props (central package management) wherever the project supports it, so every project resolves one version of each dependency. Pin exact versions for anything security-sensitive rather than floating a range.

Installs
8
GitHub Stars
1
First Seen
Jun 21, 2026
dotnet-web-backend — envoydev/claude-stack