Migrating a .NET Core 3.1 project to .NET 8 might seem challenging, but the process becomes much smoother with the right guide. Here’s a step-by-step guide:
Why Upgrade to .NET 8?
Before starting, let’s ask ourselves: why migrate to .NET 8? Here are some key reasons:
- Better performance: more optimization and lower memory consumption.
- Long-Term Support (LTS): .NET 8 will be supported until at least 2026.
-
Improved JSON Serialization with
System.Text.Json
. - New features in minimal APIs and Blazor, making web development easier.
- Enhanced security in authentication and authorization.
1. Review Your Dependencies
Before migrating, it’s essential to check whether your dependencies and external libraries are compatible with .NET 8.
- Check your current project version using:
dotnet --version
If you see something like 3.1.x
, you're still on .NET Core 3.1.
-
Analyze your dependencies:
- Open the
.csproj
file and review the NuGet packages you're using. - Use this command to check which packages need updating:
dotnet list package --outdated
- Open the
-
Tools that can help:
- Use
dotnet upgrade-assistant
to simplify the migration:
dotnet tool install -g upgrade-assistant upgrade-assistant upgrade <projectPatch>
- Use
This will provide a list of suggested changes and help automate parts of the upgrade process.
- Check the official documentation for each package to confirm compatibility with .NET 8.
2. Update the SDK to .NET 8
Download and install the .NET 8 SDK from the official Microsoft page:
Download .NET 8Verify the installation:
dotnet --version
If everything is fine, you should see something like 8.X.X
.
3. Update the .csproj
File
Open the .csproj
file and change the Target Framework version:
Before (in .NET Core 3.1):
<TargetFramework>netcoreapp3.1</TargetFramework>
After (in .NET 8):
<TargetFramework>net8.0</TargetFramework>
If you have multiple projects, repeat this step for each one.
4. Update NuGet Dependencies
Run the following commands to clear the cache and update packages:
dotnet nuget locals all --clear
dotnet restore
To update all dependencies to the latest compatible version:
dotnet outdated --upgrade
(If you don’t have dotnet outdated
, install it using dotnet tool install --global dotnet-outdated-tool
)
5. Code Adjustments
.NET 8 introduces several important changes. Here are some of the most relevant ones:
5.1. Changes in Startup.cs
and Program.cs
In .NET Core 3.1, Startup.cs
handled configuration. Now, in .NET 8, everything moves to Program.cs
.
Before (3.1 with Startup.cs
)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
After (8.0 with Program.cs
)
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthorization();
app.MapControllers();
app.Run();
5.4. Changes in Authentication and Authorization
If your project uses authentication with JWT or IdentityServer4, you may need some adjustments:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://your-authentication-server";
options.Audience = "api";
});
5.5. JSON Serialization Optimization
If you previously used Newtonsoft.Json
, you can now take advantage of System.Text.Json
with optimized configuration:
builder.Services.Configure<JsonOptions>(options =>
{
options.SerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
options.SerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
});
6. Test Your Application
- Build and run the application:
dotnet build
dotnet run
- Check for any errors or warnings.
- Run unit tests:
dotnet test
7. Final Steps Before Deployment
If you use Docker or Azure, check the following:
- If using Docker, update the base image in
Dockerfile
:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
- On Azure App Services, verify that the Azure runtime supports .NET 8.
Top comments (0)