{"id":83014,"date":"2026-09-10T15:53:44","date_gmt":"2026-09-10T10:23:44","guid":{"rendered":"https:\/\/www.tothenew.com\/blog\/?p=83014"},"modified":"2026-09-15T10:37:39","modified_gmt":"2026-09-15T05:07:39","slug":"strangler-fig-pattern-for-legacy-net-apps","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/","title":{"rendered":"Strangler Fig Pattern for Legacy .NET Apps"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Someone in leadership says &#8220;we need to move to .NET 8&#8221; or &#8220;let&#8217;s get this thing into Azure.&#8221; Cool. But when you ask what that actually means \u2014 which apps, which order, what happens to production while you&#8217;re mid-migration \u2014 you often get a vague answer and a timeline that makes no sense.<\/p>\n<p>I&#8217;ve been in that room. The legacy app still pays the bills. You can&#8217;t freeze feature work for eighteen months while a rewrite catches up. And you definitely can&#8217;t risk a weekend cutover on a system nobody fully understands anymore.<\/p>\n<p>What usually helps \u2014 not always, but often \u2014 is the <strong>Strangler Fig pattern<\/strong>. You keep the old .NET app running. You peel off one piece at a time. New stuff gets built beside it, not instead of it. Traffic moves over when you&#8217;re ready, not when a project plan says you should.<\/p>\n<p>Here&#8217;s how I&#8217;ve seen .NET teams make that work \u2014 where to cut first, how YARP fits in, and what usually goes wrong.<\/p>\n<h2>Body<\/h2>\n<h3>The rewrite that never ships<\/h3>\n<p>I&#8217;ve seen this play out more than once.<\/p>\n<p>A team picks up a .NET Framework app \u2014 MVC, Web API, sometimes with a WCF layer everyone&#8217;s afraid to touch. Leadership wants .NET 8. Or cloud. Or both. Someone in a meeting says &#8220;let&#8217;s just rewrite it.&#8221; Everyone nods. Six months later the new codebase is maybe 40% done, production is still on the old system, and nobody brings up &#8220;migration&#8221; in meetings anymore.<\/p>\n<p>That&#8217;s not really a coding problem. It&#8217;s a planning problem. And honestly, Strangler Fig exists because full rewrites keep failing in exactly this way.<\/p>\n<h3>What the Strangler Fig pattern means<\/h3>\n<p>Okay, the name is weird. A strangler fig is a plant that grows around a tree and eventually takes its place. <a href=\"https:\/\/martinfowler.com\/bliki\/StranglerFigApplication.html\">Martin Fowler<\/a> used that image years ago to describe how you&#8217;d modernize software \u2014 not by swapping everything out on a deadline, but by slowly building around what&#8217;s already there.<\/p>\n<p>For .NET teams, the practical version is simpler: put YARP or a gateway in front, pull features into new ASP.NET Core services one at a time, and leave the monolith running until each slice is proven. No Saturday-night switch \u2014 just small moves you can roll back.<\/p>\n<h3>Why this works well for legacy .NET<\/h3>\n<p>Most old .NET Framework apps I&#8217;ve worked on look familiar: giant solution file, one SQL Server everyone shares, auth tangled into the web project, a Windows Service doing something important at 2 AM, and a DLL or two that hasn&#8217;t been touched since 2016.<\/p>\n<p>Trying to untangle all of that in one project is brutal. Strangler Fig gives you permission to fix <strong>one headache<\/strong> first \u2014 reporting, notifications, a customer API \u2014 while the rest of the app keeps chugging along. For a lot of teams, that&#8217;s the only approach that doesn&#8217;t get blocked by risk committees.<\/p>\n<h3>Step 1: Find a seam, not a layer<\/h3>\n<p>The mistake I see most often? Teams try to extract the &#8220;data layer&#8221; or &#8220;business layer&#8221; first because it looks clean on a whiteboard. In a codebase that&#8217;s 10+ years old, those layers are usually a mess \u2014 session state, stored procedures, business rules all mixed together.<\/p>\n<p>Look for a <strong>business feature<\/strong> with a small surface area instead:<\/p>\n<ul>\n<li>A read-heavy API your mobile app calls<\/li>\n<li>Reporting \u2014 lots of reads, not much writing<\/li>\n<li>User profiles or document uploads<\/li>\n<li>A brand-new feature \u2014 just build it outside the monolith from day one<\/li>\n<\/ul>\n<p>I&#8217;d stay away from core order processing, anything with distributed locks, or shared login\/session stuff unless you&#8217;ve thought through identity properly. One question helps: <em>if this breaks for a day, how bad is it?<\/em> Start where the answer is &#8220;annoying, not catastrophic.&#8221;<\/p>\n<h3>Step 2: Put a router in front<\/h3>\n<p>First thing we usually do once we&#8217;ve picked a slice: stop exposing legacy and new stuff on separate URLs. One entry point. One place to decide where traffic goes.<\/p>\n<p>If the team is mostly .NET, we reach for <strong>YARP<\/strong> a lot. Bigger setups might need a full API gateway; a BFF helps when clients need responses stitched from multiple backends.<\/p>\n<p>Here&#8217;s a simple YARP setup we use fairly often \u2014 anything under <code>\/api\/reports\/*<\/code> goes to the new service, everything else falls back to legacy:<\/p>\n<pre><code>{\r\n  \"ReverseProxy\": {\r\n    \"Routes\": {\r\n      \"reports-route\": {\r\n        \"ClusterId\": \"reports-cluster\",\r\n        \"Match\": { \"Path\": \"\/api\/reports\/{**catch-all}\" }\r\n      },\r\n      \"legacy-fallback\": {\r\n        \"ClusterId\": \"legacy-cluster\",\r\n        \"Match\": { \"Path\": \"{**catch-all}\" }\r\n      }\r\n    },\r\n    \"Clusters\": {\r\n      \"reports-cluster\": {\r\n        \"Destinations\": { \"reports-api\": { \"Address\": \"https:\/\/reports.internal\/\" } }\r\n      },\r\n      \"legacy-cluster\": {\r\n        \"Destinations\": { \"legacy-app\": { \"Address\": \"https:\/\/legacy.internal\/\" } }\r\n      }\r\n    }\r\n  }\r\n}<\/code><\/pre>\n<p>Host side is short \u2014 register reverse proxy, load config, map it:<\/p>\n<pre><code>var builder = WebApplication.CreateBuilder(args);\r\nbuilder.Services.AddReverseProxy()\r\n    .LoadFromConfig(builder.Configuration.GetSection(\"ReverseProxy\"));\r\n\r\nvar app = builder.Build();\r\napp.MapReverseProxy();\r\napp.Run();<\/code><\/pre>\n<p>What I like about this stage: once routing works, shifting a path from old to new is often just a config edit. You&#8217;re not redeploying the whole monolith to test one change.<\/p>\n<div class=\"mceTemp\"><\/div>\n<div id=\"attachment_83022\" style=\"width: 635px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-83022\" class=\"size-large wp-image-83022\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/09\/strangler-fig-diagram-1440x1000-1-1024x711.jpg\" alt=\"Diagram showing a legacy .NET monolith still running while YARP routes some traffic to new ASP.NET Core services like Reports API and Profile API\" width=\"625\" height=\"434\" srcset=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/09\/strangler-fig-diagram-1440x1000-1-1024x711.jpg 1024w, https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/09\/strangler-fig-diagram-1440x1000-1-300x208.jpg 300w, https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/09\/strangler-fig-diagram-1440x1000-1-768x533.jpg 768w, https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/09\/strangler-fig-diagram-1440x1000-1-624x433.jpg 624w, https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/09\/strangler-fig-diagram-1440x1000-1.jpg 1440w\" sizes=\"auto, (max-width: 625px) 100vw, 625px\" \/><p id=\"caption-attachment-83022\" class=\"wp-caption-text\">Pretty much how it works in real projects \u2014 legacy app stays up, YARP sits in the middle, and new services take over one route at a time.<\/p><\/div>\n<h3>Step 3: Build the new slice<\/h3>\n<p>Keep the first service boring. ASP.NET Core Web API, simple DTOs, logging, health checks. Don&#8217;t over-engineer it on day one.<\/p>\n<p>It&#8217;s fine if the new service still reads from the same SQL Server at first. Not ideal long term, but realistic. We&#8217;ve done that plenty of times.<\/p>\n<pre><code>app.MapGet(\"\/api\/reports\/summary\", async (\r\n    IReportService reports, CancellationToken ct) =&gt;\r\n{\r\n    var summary = await reports.GetSummaryAsync(ct);\r\n    return Results.Ok(summary);\r\n});<\/code><\/pre>\n<p>Version one isn&#8217;t about perfect architecture. It&#8217;s about proving you can send real traffic to new code and sleep through the night.<\/p>\n<h3>Step 4: Move traffic, then actually delete the old code<\/h3>\n<p>Big-bang cutovers are where things fall apart. Start with internal users. Then maybe 5% of production traffic. Then more. And know how to roll back before you flip anything \u2014 changing one route back to legacy should take minutes, not a war room.<\/p>\n<p>Also \u2014 and teams skip this all the time \u2014 <strong>delete the legacy path<\/strong> once the new one is stable. I&#8217;ve seen projects run two systems for a year because nobody wanted to remove the old code. That&#8217;s not modernization. That&#8217;s just double the maintenance.<\/p>\n<p>Before you call a slice &#8220;done,&#8221; I&#8217;d look for something like:<\/p>\n<ul>\n<li>New service has handled all traffic for that feature for at least 30 days<\/li>\n<li>Error rates look normal<\/li>\n<li>No open critical bugs tied to the migration<\/li>\n<li>Legacy code for that route is actually removed<\/li>\n<\/ul>\n<h3>Things that will bite you<\/h3>\n<p><strong>Shared database.<\/strong> This one catches people off guard. You stand up a shiny new microservice, but both apps still write to the same tables. On paper you&#8217;ve &#8220;extracted&#8221; something. In reality you&#8217;ve got the same coupling with extra deployment steps.<\/p>\n<p><strong>Session and login.<\/strong> If the legacy app uses Forms Authentication or in-proc session, don&#8217;t assume your new API can just plug in. We had a project stall for weeks because nobody mapped out how logged-in users would hit the new routes. Sometimes identity has to be the first slice, not the third.<\/p>\n<p><strong>Too many services, too fast.<\/strong> Five microservices sharing one database, deploying in a chain \u2014 often slower than the monolith you started with. One at a time is boring. Boring is fine.<\/p>\n<p><strong>Logging.<\/strong> Once traffic splits, &#8220;where did this request go?&#8221; is a real question. Set up correlation IDs and <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/core\/diagnostics\/observability-with-otel\">OpenTelemetry<\/a> before production routing, not after a late-night incident.<\/p>\n<h3>What the first 90 days might look like<\/h3>\n<p>Timelines vary \u2014 routing alone took three weeks on one project, eight on another. But when someone asks what the first three months look like, this is roughly what I say.<\/p>\n<p><strong>Weeks 1\u20133:<\/strong> Map what the monolith actually does. Pick one seam that won&#8217;t blow up if it wobbles. Get YARP or a gateway in front. Add correlation IDs \u2014 basic, but easy to skip and regret.<\/p>\n<p><strong>Weeks 4\u20138:<\/strong> Build the first ASP.NET Core piece. Keep scope tiny. Non-prod first, then shadow traffic or internal users who&#8217;ll find the edge cases.<\/p>\n<p><strong>Weeks 9\u201312:<\/strong> Route real production traffic for that slice. Document rollback while you&#8217;re calm. If numbers hold for a few weeks, delete the legacy path \u2014 not &#8220;cleanup in Q4,&#8221; actually delete it.<\/p>\n<h2>Conclusion<\/h2>\n<p>You don&#8217;t need a three-year rewrite that ships half-finished. Strangler Fig is slower on paper and faster in reality, because you keep delivering while you move.<\/p>\n<p>Pick a small slice. Get routing in place. Move traffic when you&#8217;ve got a rollback plan. Kill the old code when you&#8217;re sure. And when someone pushes for a full rewrite, ask which part of the business they&#8217;re fine pausing for six months. That tends to reset the conversation pretty quickly.<\/p>\n<p>Working through a legacy .NET migration? <a href=\"https:\/\/www.tothenew.com\/contact\">Get in touch<\/a> or see our <a href=\"https:\/\/www.tothenew.com\/services\/application-modernization\">Application Modernization services<\/a>. Heading cloud-native next? Read our <a href=\"https:\/\/www.tothenew.com\/blog\/getting-started-with-net-aspire-building-cloud-native-net-apps-made-easy\/\">.NET Aspire post<\/a>. Done a strangler migration before \u2014 what did you pull out first? Leave a comment.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Someone in leadership says &#8220;we need to move to .NET 8&#8221; or &#8220;let&#8217;s get this thing into Azure.&#8221; Cool. But when you ask what that actually means \u2014 which apps, which order, what happens to production while you&#8217;re mid-migration \u2014 you often get a vague answer and a timeline that makes no sense. I&#8217;ve [&hellip;]<\/p>\n","protected":false},"author":2311,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":1,"footnotes":""},"categories":[5867],"tags":[8995,6734,3979,8993,8994],"class_list":["post-83014","post","type-post","status-publish","format-standard","hentry","category-net","tag-applicationmodernization","tag-dotnet","tag-microservices","tag-stranglerfig","tag-yarp"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Introduction Someone in leadership says &quot;we need to move to .NET 8&quot; or &quot;let&#039;s get this thing into Azure.&quot; Cool. But when you ask what that actually means \u2014 which apps, which order, what happens to production while you&#039;re mid-migration \u2014 you often get a vague answer and a timeline that makes no sense. I&#039;ve\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Bhavesh Kumar Singh\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"TO THE NEW BLOG\" \/>\n\t\t<meta property=\"og:type\" content=\"blog\" \/>\n\t\t<meta property=\"og:title\" content=\"Strangler Fig Pattern for Legacy .NET Apps | TO THE NEW Blog\" \/>\n\t\t<meta property=\"og:description\" content=\"Introduction Someone in leadership says &quot;we need to move to .NET 8&quot; or &quot;let&#039;s get this thing into Azure.&quot; Cool. But when you ask what that actually means \u2014 which apps, which order, what happens to production while you&#039;re mid-migration \u2014 you often get a vague answer and a timeline that makes no sense. I&#039;ve\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/www.tothenew.com\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/www.tothenew.com\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@tothenew\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Strangler Fig Pattern for Legacy .NET Apps | TO THE NEW Blog\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Introduction Someone in leadership says &quot;we need to move to .NET 8&quot; or &quot;let&#039;s get this thing into Azure.&quot; Cool. But when you ask what that actually means \u2014 which apps, which order, what happens to production while you&#039;re mid-migration \u2014 you often get a vague answer and a timeline that makes no sense. I&#039;ve\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/www.tothenew.com\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/strangler-fig-pattern-for-legacy-net-apps\\\/#article\",\"name\":\"Strangler Fig Pattern for Legacy .NET Apps | TO THE NEW Blog\",\"headline\":\"Strangler Fig Pattern for Legacy .NET Apps\",\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/bhavesh-singh\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/strangler-fig-diagram-1.jpg\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/strangler-fig-pattern-for-legacy-net-apps\\\/#articleImage\"},\"datePublished\":\"2026-09-10T15:53:44+05:30\",\"dateModified\":\"2026-09-15T10:37:39+05:30\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/strangler-fig-pattern-for-legacy-net-apps\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/strangler-fig-pattern-for-legacy-net-apps\\\/#webpage\"},\"articleSection\":\".NET, ApplicationModernization, dotnet, microservices, StranglerFig, YARP\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/strangler-fig-pattern-for-legacy-net-apps\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/net\\\/#listItem\",\"name\":\".NET\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/net\\\/#listItem\",\"position\":2,\"name\":\".NET\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/net\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/strangler-fig-pattern-for-legacy-net-apps\\\/#listItem\",\"name\":\"Strangler Fig Pattern for Legacy .NET Apps\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/strangler-fig-pattern-for-legacy-net-apps\\\/#listItem\",\"position\":3,\"name\":\"Strangler Fig Pattern for Legacy .NET Apps\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/net\\\/#listItem\",\"name\":\".NET\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\",\"name\":\"TO THE NEW Blog\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/bhavesh-singh\\\/#author\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/bhavesh-singh\\\/\",\"name\":\"Bhavesh Kumar Singh\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/strangler-fig-pattern-for-legacy-net-apps\\\/#authorImage\",\"url\":\"https:\\\/\\\/newersworld-sf-static.tothenew.net\\\/prod\\\/profilePicFolder\\\/5093ba67-1371-4e75-888f-cd07c08d45ee_Bhavesh-Kumar-Singh-Profile-Pitcure.jpeg\",\"width\":96,\"height\":96,\"caption\":\"Bhavesh Kumar Singh\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/strangler-fig-pattern-for-legacy-net-apps\\\/#webpage\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/strangler-fig-pattern-for-legacy-net-apps\\\/\",\"name\":\"Strangler Fig Pattern for Legacy .NET Apps | TO THE NEW Blog\",\"description\":\"Introduction Someone in leadership says \\\"we need to move to .NET 8\\\" or \\\"let's get this thing into Azure.\\\" Cool. But when you ask what that actually means \\u2014 which apps, which order, what happens to production while you're mid-migration \\u2014 you often get a vague answer and a timeline that makes no sense. I've\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/strangler-fig-pattern-for-legacy-net-apps\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/bhavesh-singh\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/bhavesh-singh\\\/#author\"},\"datePublished\":\"2026-09-10T15:53:44+05:30\",\"dateModified\":\"2026-09-15T10:37:39+05:30\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\",\"name\":\"TO THE NEW Blog\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Strangler Fig Pattern for Legacy .NET Apps | TO THE NEW Blog","description":"Introduction Someone in leadership says \"we need to move to .NET 8\" or \"let's get this thing into Azure.\" Cool. But when you ask what that actually means \u2014 which apps, which order, what happens to production while you're mid-migration \u2014 you often get a vague answer and a timeline that makes no sense. I've","canonical_url":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/#article","name":"Strangler Fig Pattern for Legacy .NET Apps | TO THE NEW Blog","headline":"Strangler Fig Pattern for Legacy .NET Apps","author":{"@id":"https:\/\/www.tothenew.com\/blog\/author\/bhavesh-singh\/#author"},"publisher":{"@id":"https:\/\/www.tothenew.com\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/www.tothenew.com\/blog\/wp-content\/uploads\/2026\/09\/strangler-fig-diagram-1.jpg","@id":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/#articleImage"},"datePublished":"2026-09-10T15:53:44+05:30","dateModified":"2026-09-15T10:37:39+05:30","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/#webpage"},"isPartOf":{"@id":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/#webpage"},"articleSection":".NET, ApplicationModernization, dotnet, microservices, StranglerFig, YARP"},{"@type":"BreadcrumbList","@id":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.tothenew.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog\/category\/net\/#listItem","name":".NET"}},{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog\/category\/net\/#listItem","position":2,"name":".NET","item":"https:\/\/www.tothenew.com\/blog\/category\/net\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/#listItem","name":"Strangler Fig Pattern for Legacy .NET Apps"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/#listItem","position":3,"name":"Strangler Fig Pattern for Legacy .NET Apps","previousItem":{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog\/category\/net\/#listItem","name":".NET"}}]},{"@type":"Organization","@id":"https:\/\/www.tothenew.com\/blog\/#organization","name":"TO THE NEW Blog","url":"https:\/\/www.tothenew.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.tothenew.com\/blog\/author\/bhavesh-singh\/#author","url":"https:\/\/www.tothenew.com\/blog\/author\/bhavesh-singh\/","name":"Bhavesh Kumar Singh","image":{"@type":"ImageObject","@id":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/#authorImage","url":"https:\/\/newersworld-sf-static.tothenew.net\/prod\/profilePicFolder\/5093ba67-1371-4e75-888f-cd07c08d45ee_Bhavesh-Kumar-Singh-Profile-Pitcure.jpeg","width":96,"height":96,"caption":"Bhavesh Kumar Singh"}},{"@type":"WebPage","@id":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/#webpage","url":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/","name":"Strangler Fig Pattern for Legacy .NET Apps | TO THE NEW Blog","description":"Introduction Someone in leadership says \"we need to move to .NET 8\" or \"let's get this thing into Azure.\" Cool. But when you ask what that actually means \u2014 which apps, which order, what happens to production while you're mid-migration \u2014 you often get a vague answer and a timeline that makes no sense. I've","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.tothenew.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/#breadcrumblist"},"author":{"@id":"https:\/\/www.tothenew.com\/blog\/author\/bhavesh-singh\/#author"},"creator":{"@id":"https:\/\/www.tothenew.com\/blog\/author\/bhavesh-singh\/#author"},"datePublished":"2026-09-10T15:53:44+05:30","dateModified":"2026-09-15T10:37:39+05:30"},{"@type":"WebSite","@id":"https:\/\/www.tothenew.com\/blog\/#website","url":"https:\/\/www.tothenew.com\/blog\/","name":"TO THE NEW Blog","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.tothenew.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"TO THE NEW BLOG","og:type":"blog","og:title":"Strangler Fig Pattern for Legacy .NET Apps | TO THE NEW Blog","og:description":"Introduction Someone in leadership says &quot;we need to move to .NET 8&quot; or &quot;let's get this thing into Azure.&quot; Cool. But when you ask what that actually means \u2014 which apps, which order, what happens to production while you're mid-migration \u2014 you often get a vague answer and a timeline that makes no sense. I've","og:url":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/","og:image":"https:\/\/www.tothenew.com\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","og:image:secure_url":"https:\/\/www.tothenew.com\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","twitter:card":"summary","twitter:site":"@tothenew","twitter:title":"Strangler Fig Pattern for Legacy .NET Apps | TO THE NEW Blog","twitter:description":"Introduction Someone in leadership says &quot;we need to move to .NET 8&quot; or &quot;let's get this thing into Azure.&quot; Cool. But when you ask what that actually means \u2014 which apps, which order, what happens to production while you're mid-migration \u2014 you often get a vague answer and a timeline that makes no sense. I've","twitter:image":"https:\/\/www.tothenew.com\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png"},"aioseo_meta_data":{"post_id":"83014","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"limit_modified_date":false,"created":"2026-09-10 08:34:46","updated":"2026-09-15 05:07:41","focus_keyword":null,"additional_keywords":null,"truseo_locale":null,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.tothenew.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.tothenew.com\/blog\/category\/net\/\" title=\".NET\">.NET<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tStrangler Fig Pattern for Legacy .NET Apps\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.tothenew.com\/blog"},{"label":".NET","link":"https:\/\/www.tothenew.com\/blog\/category\/net\/"},{"label":"Strangler Fig Pattern for Legacy .NET Apps","link":"https:\/\/www.tothenew.com\/blog\/strangler-fig-pattern-for-legacy-net-apps\/"}],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/83014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/2311"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=83014"}],"version-history":[{"count":5,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/83014\/revisions"}],"predecessor-version":[{"id":83030,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/83014\/revisions\/83030"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=83014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=83014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=83014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}