Archiboard

Sheet 00 · Cover

Drawings and notes on building web applications in .NET.

I am Bernard, a .NET architect in Brussels. I draw systems before I build them, and since 2010 I have kept the drawings here with the notes that go with them. Every sheet carries two dates: the day it was first drawn and the day I last revised it. Some have been redrawn three times, because the answer changed. That is the point of keeping them.

Subject
Web applications on .NET and Azure
Drawn by
Bernard Cortesi
Sheets
33, in 6 sets
Drawings
36
Last revision
20 August 2026
Scale
Not to scale

01Drawing sets

02Recently revised

K-05 Craft & Judgment

Fourteen years of .NET web applications: what changed, what did not

From ASP.NET MVC 2 and Entity Framework 4 to .NET 10. Hosting, configuration, resilience and telemetry became somebody else's problem. Tenancy, migrations, cost, saying no and naming things are still mine.

Drawn Oct 2024·Revised Aug 2026·7 min

R-05 Resilience & Scale

Load testing a tenant-shaped system

Five hundred identical virtual users prove nothing. Your tenants are three big ones and forty small ones, and only that shape finds the noisy neighbour.

Drawn Mar 2024·Revised Aug 2026·6 min

C-05 Cloud & Operations

The cost sheet: what a tenant actually costs you

Cost per tenant is an allocation, not a measurement. The rules of the allocation are a product decision, and finance will treat the first number you give them as the truth.

Drawn Nov 2023·Revised Jul 2026·7 min

B-05 Services & Boundaries

Idempotent consumers and the duplicate message you will receive

At-least-once means twice, eventually. Make the operation naturally repeatable, or let a unique constraint on an inbox table settle the argument.

Drawn Jan 2022·Revised Jun 2026·6 min

I-05 Identity & Access

Entra ID multi-tenant applications and the admin consent dance

One app registration, any customer directory. The consent flow is well documented. What to trust when the music stops is not.

Drawn Feb 2023·Revised May 2026·7 min

Index of all 33 sheets

03From the margins

A scar

Put TenantId first in every clustered index from the first migration. In 2019 we added it as the last column on a 60 million row invoices table, and the rebuild took the product offline for six hours on a Saturday. Column order is free on day one and very expensive on day four hundred.

What I tell juniors

Write the key format on the whiteboard before you write the caching code, and treat a key without a tenant segment as a review blocker, the same way you would treat a raw SQL string built by concatenation. The cost of getting it right is one helper class. The cost of getting it wrong is a phone call in which you explain to a customer that another customer saw their numbers.

From the drafting table

Send the welcome mail last, and only after the catalog row says Online. A mail that arrives before the login works produces a support ticket and a first impression you do not get back. A mail that arrives ten minutes late produces nothing at all.

04The 2010 sheets

The first drawings on this board, made against ASP.NET MVC 2 and Entity Framework 4, on a version of .NET that no longer ships. All of them have been revised since, none of them thrown away.