< Previous Challenge — Home — Next Challenge >
The eShopOnWeb application is a multi-project ASP.NET Core 8.0 reference application. Unlike the radical .NET Framework 4.8 migrations you may have seen before, this is an in-place runtime upgrade — but it still involves real breaking changes that the automated tools can partially resolve and that GitHub Copilot Chat can help you finish.
The five projects in the solution each need attention:
| Project | Type | Key concern |
|---|---|---|
ApplicationCore |
Class library | Package version bumps |
Infrastructure |
Class library | EF Core 10 breaking changes |
Web |
ASP.NET Core MVC | Target Framework Moniker bump, Identity changes, package cascade |
PublicApi |
ASP.NET Core Web API | Swashbuckle removal → OpenAPI replacement |
BlazorAdmin |
Blazor WebAssembly | Target Framework Moniker bump, WASM package versions |
The most visible breaking change in this migration is the removal of Swashbuckle in favour of the new built-in Microsoft.AspNetCore.OpenApi package introduced in .NET 9. Every team hits this; it is intentional.
The target state for this challenge is:
- All five projects target
net10.0 global.jsonpins the .NET 10 SDKDirectory.Packages.propsupdated with .NET 10-compatible package versions- Swashbuckle replaced with
Microsoft.AspNetCore.OpenApi+ Scalar UI inPublicApi dotnet buildsucceeds with no errors across the entire solutiondotnet runstarts bothWebandPublicApiwithout runtime errors
Note: Azure cloud service integrations (Service Bus, Blob Storage) are covered in Challenge 03. Focus here on the runtime upgrade only.
Modernize the eShopOnWeb solution to .NET 10:
Use the GitHub Copilot Modernization tool to generate and execute a migration plan. Craft a clear goal describing the upgrade objectives (TFM bump, package updates, Swashbuckle replacement) and review the generated plan before executing it.
After modernize plan execute, resolve remaining issues:
global.json: change"version": "8.0.x"→"10.0.x"(with"rollForward": "latestFeature")Directory.Packages.props: change<TargetFramework>net8.0</TargetFramework>→net10.0and update all8.0.xpackage versions to their .NET 10 equivalentsPublicApi/Program.cs: removeUseSwagger()/UseSwaggerUI(), addMapOpenApi(), wire up Scalar for the UIPublicApi/PublicApi.csproj: removeSwashbuckle.AspNetCore, addMicrosoft.AspNetCore.OpenApiandScalar.AspNetCore- EF Core 10: fix any compilation errors from updated conventions in
Infrastructure - BlazorAdmin: verify
Microsoft.AspNetCore.Components.WebAssemblyand related packages are at10.0.x System.Text.Json: fix any serialization issues from stricter null handling in .NET 10
Build the solution and start both Web and PublicApi to confirm the migration succeeded. The store home page and the OpenAPI (Scalar) endpoint should both be accessible.
To complete this challenge successfully, demonstrate:
- The solution builds successfully with zero errors targeting
net10.0 - The
Webproject starts and the store home page loads - The
PublicApiproject starts and the OpenAPI/Scalar endpoint is accessible (not Swagger UI) global.jsonshows"version": "10.0.x"Directory.Packages.propsshows<TargetFramework>net10.0</TargetFramework>and no8.0.xversions remain- No
Swashbucklereferences exist anywhere in the solution - (Stretch) The
BlazorAdminapp loads in the browser athttps://localhost:5001/admin— if WASM package versions are blocking progress, move on and revisit at the end - Explain to your coach — why was Swashbuckle removed from ASP.NET Core default templates in .NET 9, and what does
MapOpenApi()do differently from the oldUseSwagger()middleware? - Explain to your coach — what does
ManagePackageVersionsCentrallyinDirectory.Packages.propsmean, and why does it make the .NET 10 upgrade both convenient and risky?
- Migrate from ASP.NET Core 8.0 to 9.0
- Migrate from ASP.NET Core 9.0 to 10.0
- OpenAPI in ASP.NET Core 9+
- Scalar.AspNetCore — .NET integration
- EF Core 10 breaking changes
- .NET Central Package Management
- Start with
global.jsonandDirectory.Packages.props— these two files control everything. Update both before touching any individual.csproj. - Build incrementally: build the solution after the Target Framework Moniker change to get the full error list before attempting fixes.
- The Swashbuckle error is not subtle — ask GitHub Copilot Chat to help replace Swashbuckle with
Microsoft.AspNetCore.OpenApiand Scalar inProgram.cs. - BlazorAdmin uses
Microsoft.AspNetCore.Components.WebAssembly.Authentication— verify the WASM auth flow still works by logging into the admin panel after the package bump. System.Text.Jsonstricter nulls: if you seeJsonExceptionat runtime, check DTO constructors for null property defaults in .NET 10.