02Legacy .NET modernization

Legacy .NET modernization services.

Legacy .NET modernization for ASP.NET Web Forms and .NET Framework applications: moved to modern .NET incrementally and in production, one route at a time, without a code freeze and without a rewrite.

ASP.NET Web Forms and .NET Framework applications moved to modern .NET, incrementally and in production, without a code freeze.

Typical duration
3–9 months
Shape
Phased, fixed scope per phase
Starts with
Modernization assessment
Start a conversation

Modernization without the rewrite.

Most modernization projects fail on shape, not on skill. A full rewrite asks a business to run two systems, stop shipping features for a year, and stake everything on a cutover date. We do it the other way: the application is replaced one route at a time while it keeps serving traffic, and every release is small enough to roll back.

What this includes

  • Routing boundary so legacy and modern stacks serve one domain
  • Unified authentication and session across both stacks
  • Route-by-route migration, prioritised by risk and value
  • Business logic re-implemented from specification, parallel-run against the original
  • Data access modernised: stored procedures reviewed, indexed and instrumented
  • Structured logging and health alerting on everything moved

.NET Framework to .NET 10 migration

A .NET Framework application does not have to move to .NET 10 in a single release. Once the routing boundary is in place, the new ASP.NET Core application owns the domain and forwards anything it does not yet handle to the Framework application, so pages, business logic and data access move across in the order set by risk and value.

Each phase is scoped and priced separately, and the work starts from a modernization assessment that sequences it for your specific system.

04Method

How a live system gets replaced.

The migration pattern, in the order we use it. It is written out here in full because it is not a secret. The value is in having done it before, not in knowing that it exists.

Incremental migration behind a shared routing boundaryTraffic for one domain enters a routing layer, which sends migrated routes to a modern ASP.NET MVC application and the remaining routes to the original Web Forms application. Both share one session layer and one database, so routes can move across independently.ONE DOMAINROUTING BOUNDARYONE ROUTE TABLE · ONE CERTIFICATEASP.NET MVCMIGRATED ROUTESGROWS EACH RELEASEWEB FORMSEVERYTHING NOT YET MOVEDSTILL SERVING TRAFFICSHARED SESSION · SHARED DATABASEA USER CROSSING BETWEEN STACKS NOTICES NOTHING
Nothing is rewritten to reach this state. Once the boundary exists, a route moves by changing which application answers it, and moves back the same way.
  1. 01

    Draw the boundary

    The legacy application goes behind a single routing layer, so the old stack and the new one serve the same domain, the same cookies and the same users. Nothing has moved yet, but from here anything can, one path at a time.

  2. 02

    Unify the session

    Authentication is made to work identically across both stacks before a single page is migrated. A user clicking from a twenty-year-old screen into a new one should not be able to tell, and should never be asked to log in twice.

  3. 03

    Move route by route

    Pages are migrated in an order set by risk and value, not by what is convenient. Each release is small, independently deployable and reversible. If a migrated route misbehaves, it goes back, and the rest of the application never notices.

  4. 04

    Parallel-run the logic

    Where business rules are re-implemented from specification, both implementations run against the same real inputs and their outputs are diffed until they agree. Rules that have been in production for decades have edge cases nobody remembers; this is how you find them before a customer does.

  5. 05

    Retire, then delete

    The old page is removed only after the new one has carried real production traffic. Dead code that is still deployed is not migration. It is two systems to maintain instead of one.

05Comparison

Should you rewrite the system or migrate it?

Migrate it, in almost every case where the system still works. A rewrite concentrates all of the risk on one date and pays nothing back until that date arrives. A route-by-route migration returns value in weeks and lets you stop at any point with the work so far still in production.

Full rewrite compared with route-by-route migration, on the dimensions that decide whether the project survives contact with a business.
 Full rewriteRoute-by-route migration
Feature work during the projectFrozen, often for a yearContinues throughout
First value in productionAt the end, on cutover dayWeek three or four
If something is wrongThe whole release rolls backOne route rolls back
Systems running in parallelTwo, for the entire projectTwo, briefly, per route
Cutover riskConcentrated on one dateSpread across many small releases
Cost of being wrongThe projectOne route
When the business sees itAfter the money is spentWhile it is being spent

Further reading

Other services

  • Multi-tenant platform development

    Multi-tenant platforms built end to end, including the operational surface a business needs in order to actually run the thing.

  • Modernization assessment

    Two weeks, fixed price. A written migration plan for your legacy system that is useful whether or not you hire us to execute it.

  • ASP.NET Web Forms migration

    ASP.NET Web Forms applications moved to ASP.NET Core and .NET 10 in production, one route at a time, with one login across both stacks and no code freeze.

02Start

Two weeks and a fixed number is a small way to find out.