To migrate a legacy .NET app to Azure, you move your .NET Framework codebase to App Service, Azure SQL, and Key Vault using a strangler-fig pattern that routes traffic to new slices while the old app keeps running. No big-bang rewrite required.
Gather the following before writing a line of migration code. For related Azure migration patterns, see the QServices guides hub.
Review the official Microsoft .NET porting documentation for a framework-version compatibility checklist before your first session.
The right Azure compute target depends on whether you are replatforming an existing monolith or rebuilding into independent services. Use the table below as a starting point.
| Criteria | Azure App Service | Azure Container Apps |
|---|---|---|
| App type | Single app or simple multi-tier .NET site | Multiple independently deployable services |
| Windows dependency | Supported via Windows plan | Linux containers only |
| Scaling model | Scale out to N instances per app | KEDA-based autoscaling per container |
| Operations overhead | Lower: PaaS with no container runtime to manage | Higher: requires Docker images and a container registry |
| Best fit for | Rehost or replatform of a single monolith | Rebuilt microservices or strangler-fig slices |
If your app has Windows-only dependencies such as COM interop or IIS-bound Windows Authentication, start with App Service on a Windows plan. Containerizing those dependencies in the first migration pass adds weeks of unrelated work. You can move to Container Apps in a later phase once those dependencies are resolved.
The big-bang rewrite. Teams scope a full .NET 8 rewrite from the start, spend six months building it, and then face a risky single cutover with no fallback path. The strangler-fig approach keeps the legacy app live until each new slice has proven itself in production. If your team is debating a full rewrite, see our Legacy System Modernization page for an honest look at phased-versus-big-bang cost and risk differences.
Leaving data integrity rules behind. A schema migration moves tables and columns. It does not automatically move a trigger that enforces a uniqueness constraint or application code that validates a business rule before writing to the database. Those rules need to be explicitly identified during the inventory step, re-implemented in the new environment, and verified through parallel data comparison before any traffic is switched. You find out about missing rules through corrupted production data, not a failing test.
Underestimating the integration surface. Every system that touches your app is a potential cutover blocker. Legacy systems on fixed-IP whitelists, SFTP file drops, and synchronous batch jobs all need explicit migration plans. Systems that appear read-only often write back through obscure paths that only surface under load.
QServices has delivered .NET-to-Azure modernizations across manufacturing, wealth management, and enterprise software, including a VB.NET monolith-to-.NET 8 migration for a global EHS platform and a cloud migration for a stock analytics platform that replaced manual spreadsheets with an Azure-hosted dashboard delivering real-time financial metrics.
A standard engagement runs 16 to 52 weeks depending on integration complexity, with total cost typically between $60,000 and $500,000. We apply the strangler-fig approach by default. Every step that touches production data goes through a human review gate before cutover proceeds. This is a direct application of our Human-in-the-Loop governance model, where a human approves each high-stakes decision before it executes.
For a project-specific estimate, see our Legacy Modernization cost page or contact us directly.
Global Environmental Health and Safety software company
Improved scalability, maintainability, and global performance after rewriting a legacy VB.NET monolith
Streamlined Management of Change, Incidents and Events, Action Items, LMS training, and automated scheduling in a single platform
App Service is typically cheaper for a single migrated .NET application. The Basic and Standard tiers cost less than Container Apps at low traffic volumes, and you avoid the Docker build pipeline overhead. Container Apps becomes cost-competitive when you have multiple independently scalable services, where scaling idle services to zero while others stay warm reduces compute cost compared to keeping a full App Service plan reserved at all times.
Share your requirements with QServices. Our engineers will give you a straight answer on fit, timeline, and cost — no sales scripts.
Book a Free Consultation