First page of Microsoft's 100,000-partner directory, sorted by responsiveness Microsoft Solutions Partner — Security, Modern Work, Infrastructure, App Innovation Microsoft partner since 2006 1,100+ organizations under management
Home/Blog/.NET 8 Reaches End of Support on 10 November 202…

.NET 8 Reaches End of Support on 10 November 2026: The Upgrade Path to .NET 10 on Azure

2026-09-06·IT PartnerNewAzureLifecycleApplication ModernizationDeveloper

Two Microsoft runtimes retire on the same Tuesday. If a line-of-business application of yours runs on .NET 8 or .NET 9, in Azure App Service, in Azure Functions or in a container, 10 November 2026 is the day the platform underneath it stops being patched. Nothing switches off. That is exactly the problem.

What actually happens on 10 November 2026

.NET 8, the long-term support release that shipped in November 2023, reaches end of support on 10 November 2026. So does .NET 9. The second one surprises people: .NET 9 was originally scheduled to end on 12 May 2026, but during its service window Microsoft extended standard-term support releases to 24 months starting with .NET 9, which moved its end date onto the same day as .NET 8's.

Both releases are already in what Microsoft's release policy calls the maintenance phase, the last six months of support, where improvements are limited to security fixes. After 10 November there are none. No patches, no security fixes, no Microsoft technical support for those versions. The date is a Patch Tuesday, and Microsoft's stated practice is that a version gets its final patch on that day if a critical issue exists, and nothing after.

From today, 6 September 2026, that is 65 days. Just over nine weeks.

The destination is .NET 10. It is the current long-term support release, it shipped on 11 November 2025, and it is supported until 14 November 2028. .NET 11 is in preview and is a standard-term release. Under the current policy, LTS releases get three years and STS releases get two, which is why a line-of-business app should normally land on 10 rather than wait for the next version.

Azure will not switch your app off, and that is the trap

Azure App Service follows the community support timeline for each runtime. Microsoft's language runtime support policy is explicit about what happens next: after a language reaches end of support, applications that use it continue to run unchanged, but App Service cannot provide security patches or related customer support for that runtime version past its end-of-support date. The policy adds one sentence that matters more than the rest: if your app uses an unsupported language version, you must upgrade it to a supported version before it can get App Service support.

Read that as an incident scenario rather than a compliance footnote. The app runs fine until the day it doesn't, and the first thing that happens when you open a support case is that you are asked to upgrade before anyone will look at it.

Azure Functions is stricter. Function apps on a retired language version can still be created and deployed and keep running, but they aren't eligible for new features, security patches or performance optimizations, and Microsoft's policy reserves the right to limit the number of instances allocated to those apps, including limiting scaling to a single instance. For a queue processor or a nightly integration job, that is a production incident with a scheduled date.

Containers age the same way, quietly. The floating .NET image tags are updated only for the supported life of the release, so an image built from the 8.0 tag stops picking up runtime fixes after 10 November regardless of how often your pipeline rebuilds it.

One practical detail: App Service sends the reminder emails to account administrators, service administrators and co-administrators. Contributors and readers, which is what most engineers actually hold, receive nothing unless somebody has configured Service Health alerts. If your notifications go to a mailbox nobody reads, ongoing Azure monitoring and maintenance is the cheapest fix on this page.

Two Azure Functions deadlines land on the same day

If any of your C# function apps use the in-process model, you have a second retirement on 10 November 2026: the in-process model itself. It supports only .NET 8, so there is no version of this where you retarget to .NET 10 and carry on. Microsoft's guidance is to migrate to the isolated worker model, and that is a code change rather than a configuration switch. The host builder, dependency injection, logging and several binding types all move.

The second trap is the hosting plan. .NET 9 is the last .NET version supported for function apps on a Linux Consumption plan, and newer versions are not being added to it. So a .NET 10 upgrade for those apps is also a plan migration, to Flex Consumption. The Linux Consumption plan is itself retiring on 30 September 2028, so the work is not wasted, but it needs to be in the same change window as the runtime move and it needs a real test of scaling, networking and cold-start behaviour.

While you are in there: PowerShell 7.4 function apps also reach end of support on 10 November 2026.

What the upgrade actually involves

For most ASP.NET Core line-of-business apps on App Service, the runtime move is small and the risk sits elsewhere.

The mechanics are: change the target framework from net8.0 to net10.0, move NuGet packages to supported versions, build on a supported SDK, run the test suite, then set the App Service runtime stack to .NET 10 (LTS), which is available on both Windows and Linux. Microsoft's own support requirements are the checklist here, because a supported app means a supported SDK, a supported target framework and supported packages, all three.

The .NET Upgrade Assistant does the mechanical part. It is built into Visual Studio and available as a command-line tool, it scans projects and dependencies, produces a report before it changes anything, and supports the previous-version-to-latest path as well as .NET Framework and Functions v1 to v3 upgrades.

What actually breaks, in our experience, is the layer around the runtime: an unmaintained NuGet package with no .NET 10 build, a native dependency, an old authentication library, a serializer whose behaviour changed, an integration test that was never run against anything but .NET 8. That is why the useful sequencing is to upgrade in a branch, let the CI/CD pipeline build and test it, and deploy to a staging slot before anything swaps into production.

There is also a slow-burning cost to staying put. The month after a version goes out of support, Visual Studio marks it optional and out of support. Six months later, in-support SDKs start emitting the NETSDK1138 warning when you target it. Your build does not fail on 10 November; it just becomes a little more awkward every quarter.

Pick the path per app, not per estate

The table below is the decision most teams need to make once per application. Two notes on the edges of it.

If the app is genuinely retiring within a year, say so in writing, put a date on it and reduce its exposure in the meantime: off the public internet, tightened access, and a security assessment if it handles anything sensitive. An undated "we'll replace it eventually" is how an unpatched runtime survives three more budget cycles.

If you cannot move in time, paid third-party extended support for out-of-support .NET versions exists and is listed in Microsoft's own .NET support documentation, from vendors including HeroDevs and TuxCare. Microsoft does not sell Extended Security Updates for .NET the way it does for Windows Server or SQL Server. Those vendor fees are yours, they buy time rather than a fix, and the upgrade still has to happen.

At the other end, some apps should not be retargeted at all. If the thing is a Web Forms application, a desktop app pretending to be a service, or a codebase nobody has compiled in two years, the honest options are modernization, containerization as a holding pattern, or a rebuild. Retargeting a codebase you cannot test is not an upgrade; it is a deployment with a fuse on it.

An order of work that fits in nine weeks

Week one is inventory, and it is the step people skip. List every App Service, function app and container image and record the runtime version each one actually runs, not the version in the repo. The Azure CLI gives you this in an afternoon across subscriptions. Include the build agents and the base images, and note which apps have a working test suite and which do not.

Week two is triage. Sort each app into one of the paths in the table, and get the in-process function apps and the Linux Consumption apps to the top of the list, because those are the only two that need more than a retarget.

Weeks three to six are the upgrades themselves, in branches, smallest and best-tested apps first, so that the pipeline and the rollback path are proven on something low-risk before you take on the app that runs invoicing.

Weeks seven and eight are staging slots, swaps and verification under real load. Week nine is the buffer you will need, because one app will surprise you.

If your team can carry the code but not the Azure side, or the other way round, hourly cloud engineering fills the gap without a project wrapper. If the apps are still on a web server that never moved, migration to Azure App Service and the runtime upgrade are one piece of work, not two.

Where this sits on the rest of your 2026 list

This deadline rarely arrives alone. The same line-of-business app usually sits on a Windows Server and a SQL Server with lifecycles of their own, and two of those dates are already in the same quarter: Extended Security Updates for Windows Server 2012 and 2012 R2 end on 13 October 2026, and SQL Server 2016 left extended support on 14 July 2026. An app upgraded to .NET 10 on an unsupported server underneath has moved the problem, not solved it.

We keep a running list of the Microsoft dates that affect customers on this site, with what each one changes and what the options are, at Microsoft deadlines. If .NET is your only item on it this autumn, you are in better shape than most.

Where the app runs today Path before 10 November 2026 What it takes What happens if you don't
ASP.NET Core 8 or 9 on App Service (Windows or Linux) Retarget to net10.0 and set the stack to .NET 10 (LTS) Package updates, a test pass, staging slot, swap It keeps running, unpatched, and you must upgrade before App Service will support an incident
C# function app on the in-process model Migrate to the isolated worker model, then to .NET 10 Code change: host builder, DI, logging and bindings The model retires the same day and only ever supports .NET 8
Function app on a Linux Consumption plan Move to Flex Consumption, then to .NET 10 New plan, redeploy, retest scale and networking .NET 9 is the last .NET version added to Linux Consumption
.NET 8 in containers (App Service, Container Apps, AKS) Rebuild on the 10.0 base image tags Tag change, pipeline rebuild, image scan The 8.0 tags stop receiving runtime fixes even as you rebuild
.NET 8 app on Azure or on-premises VMs Upgrade the app, then check the Windows Server and SQL Server dates under it Runtime install, retarget, regression test Two or three lifecycles expire under one application
App you are genuinely retiring within a year Freeze scope, restrict exposure, write down the retirement date Compensating controls and a dated decision Undated risk that outlives the next two budget cycles
Cannot move before the date Paid third-party extended support for .NET, at your cost Contract and written confirmation of what is covered An unpatched runtime with no support from anyone

Key takeaways

  • .NET 8 and .NET 9 both reach end of support on 10 November 2026, just over nine weeks away; .NET 10 is the long-term support target and is supported until 14 November 2028.
  • Azure App Service and Azure Functions keep running out-of-support runtimes, but Microsoft stops shipping security patches and requires an upgrade before it will support the app.
  • Azure Functions goes further than App Service: apps on retired language versions can be limited, including having their scaling capped at a single instance.
  • C# function apps on the in-process model face a second retirement on the same day, and the move to .NET 10 means migrating to the isolated worker model first.
  • For most App Service apps the upgrade is a target-framework change, package updates and a test pass; the risk lives in unmaintained packages, Functions bindings and hosting plans, not in the runtime swap.
  • Check the server and database lifecycles under the app at the same time: Windows Server 2012 and 2012 R2 ESU end on 13 October 2026 and SQL Server 2016 left extended support on 14 July 2026.

Not sure which of your apps are on .NET 8 or .NET 9, or what each one needs before 10 November? Start with a free 30-minute consulting session, and where an app needs more than a retarget we run it through Legacy Application Modernization to Azure: assessment, a per-application plan you approve, then a fixed price quoted in writing before the work begins. Book 30 minutes →

Questions this article didn’t answer?

Thirty minutes with Mike — our CEO, not a sales rep. Bring the hard version of the question.