Visual Studio · .NET 8/10 · Docker

Projekt-opsætning

Opret en Blazor Web App, forstå filstrukturen, konfigurer Program.cs til OpgaverAPI, og gør projektet Docker-klar til Dokploy.

Læringsmål

Hvornår Docker tidligt? Før første deploy til Dokploy — så I opdager forkert port, manglende env og hardcoded localhost før censor-demo.

Tjek dig selv før du går videre

  • Du kan pege på Program.cs som composition root.
  • Du ved hvor @page-sider og MainLayout ligger.
  • Du har klikket i filtræ-lab og læst mindst tre filer.

Sørg for at Visual Studio har workloaden ASP.NET and web development (inkl. Docker-support). Brug .NET 8 eller .NET 10 — undervisningsmaterialet følger Blazor Web App-skabelonen, ikke legacy Blazor Server-only templates.

Visual Studio workload ASP.NET
Installer ASP.NET-workloaden.

Opret projektet med skabelonen Blazor Web App. Vælg HTTPS, «Configure for HTTPS», og interactivity: typisk Interactive Server globalt.

Vælg Blazor Web App template
Vælg Blazor Web App.
Navngiv projektet
Giv projektet et klart navn (fx PokemonDex).
Framework og interactivity-indstillinger
Framework, HTTPS, interactivity.

Filstruktur — interaktivt træ

Klik en fil

Få en kort forklaring på rollen i et OpgaverAPI-venligt projekt.

Vælg en fil ovenfor.

Blazor Web App filstruktur
Oversigt fra Visual Studio.

Hvornår ny fil? Ny @page → Components/Pages. Genbrugeligt kort → Components/Shared. HTTP mod OpgaverAPI → Services/ + interface — ikke alt i Pages.

Program.cs forklaret

Program.cs er indgangen: DI-container, middleware pipeline, endpoint mapping.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

// Senere: HttpClient til OpgaverAPI
builder.Services.AddHttpClient("opgaver", c =>
{
    c.BaseAddress = new Uri(builder.Configuration["OpgaverApi:BaseUrl"]!);
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.Run();

MapRazorComponents<App> kobler routing til jeres komponenter. Antiforgery beskytter forms. Static assets serverer CSS fra wwwroot.

Checkliste før første API-kald: OpgaverApi:BaseUrl i config → AddHttpClient → breakpoint i service → F5 → Network viser korrekt host.

appsettings og secrets

{
  "OpgaverApi": {
    "BaseUrl": "https://api-opgaver.mercantec.tech"
  }
}

API-nøgler og OAuth secrets hører ikke i appsettings der committes — brug user secrets lokalt og env vars i Docker/Dokploy.

Elev-fejl → symptom → fix: Nøgle i appsettings.json committet — symptom: alle kan bruge elevens LoL-kvota. Fix: roter nøgle, flyt til sessionStorage + user secrets pattern.

Docker

Højreklik projekt → Add → Docker Support. Dockerfile multi-stage build: restore, publish, runtime image. I Dokploy deployes typisk med docker compose up -d --build — samme mønster som APIer-repoet (web offentlig, api/db intern).

Enable Docker tidligt. Det tvinger jer til at tænke porte, miljøvariabler og at appen ikke afhænger af «kun min maskine».

Typiske fejl ved første run

Hvornår user secrets? Lokal udvikling på Windows — dotnet user-secrets set "OpgaverApi:DevKey" "...". Dokploy: samme nøgler som env på compose-service, aldrig i image layers.

Faldgrube: At lægge Components/Pages udenfor namespace eller uden @page — siden vises ikke i routing. Tjek Routes.razor og at filen ligger under scannet assembly.

Quiz 1

Hvor registrerer I HttpClient og render modes?

Quiz 2

Hvor ligger statiske CSS-filer og favicon?

Hvorfor det betyder noget: Uden styr på Program.cs og env ender Pokémon-base URL som localhost i Docker på Dokploy.

Sådan fejler det i praksis: Hardcodet API-URL i komponent — virker lokalt, 404 i prod. Én config-kilde i Program.cs.

Mini-opgave

Tilføj OpgaverApi:BaseUrl i appsettings.Development.json og læs værdien i Program.cs. Breakpoint i build — bekræft korrekt base URL.

Quiz 3

Hvor registrerer I HttpClient til OpgaverAPI?

Læs hos Microsoft

Prøv med API

16475 #816475 #12

Baseret på MAGS Blazor-wiki og Microsoft Learn — Blazor.