{"id":1295,"date":"2026-03-16T19:00:33","date_gmt":"2026-03-16T22:00:33","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/"},"modified":"2026-03-16T19:00:33","modified_gmt":"2026-03-16T22:00:33","slug":"feature-flags-dotnet-microsoft-feature-management","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/","title":{"rendered":"Feature Flags en .NET: Separando el Deploy del Release con Microsoft.FeatureManagement"},"content":{"rendered":"\n<p>Uno de los cambios m\u00e1s importantes que tuve en mi forma de trabajar en los \u00faltimos a\u00f1os fue aprender a separar el <strong>despliegue<\/strong> del <strong>lanzamiento<\/strong>. Hasta ese momento, cada vez que terminaba una feature la sub\u00eda a producci\u00f3n directamente. Si algo sal\u00eda mal, hab\u00eda que hacer rollback de todo. Con los Feature Flags, eso cambi\u00f3 completamente: el c\u00f3digo puede estar en producci\u00f3n, pero inactivo. Lo activ\u00e1s cuando quer\u00e9s, para quien quer\u00e9s, sin tocar el deploy. En .NET esto se implementa con <code>Microsoft.FeatureManagement<\/code>, y en este art\u00edculo te muestro c\u00f3mo funciona.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 son los Feature Flags y por qu\u00e9 importan?<\/h2>\n\n\n\n<p>Los <strong>Feature Flags<\/strong> (tambi\u00e9n llamados Feature Toggles) son interruptores que habilitan o deshabilitan funcionalidades en tiempo de ejecuci\u00f3n. Su valor principal no es t\u00e9cnico sino estrat\u00e9gico: permiten que el equipo de desarrollo haga merge continuo a la rama principal (<em>Trunk-based development<\/em>) sin bloquear a nadie, mientras el c\u00f3digo de la nueva feature espera desactivado hasta que est\u00e9 listo para salir.<\/p>\n\n\n\n<p>Esto los diferencia del <strong>versionado de APIs<\/strong>, que apunta a mantener contratos estables para distintos consumidores. Los Feature Flags apuntan a <strong>estrategias de CI\/CD<\/strong>: lanzamientos progresivos (Canary releases), pruebas A\/B y acceso gradual a nuevas funcionalidades. Y lo m\u00e1s importante: <strong>su estado se modifica en caliente<\/strong>, cambiando el <code>appsettings.json<\/code> o variables de entorno, sin recompilar ni redesplegar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Evaluaci\u00f3n B\u00e1sica: El Interruptor On\/Off<\/h2>\n\n\n\n<p>La forma m\u00e1s simple de Feature Management. Un flag booleano que habilita o deshabilita una ruta de c\u00f3digo. Existe principalmente para resolver el problema de los <em>feature branches<\/em> de larga duraci\u00f3n: en lugar de mantener una rama separada durante semanas y sufrir un merge doloroso, el c\u00f3digo convive en la rama principal desactivado, esperando su momento.<\/p>\n\n\n\n<p>Gracias a la recarga din\u00e1mica de <code>IConfiguration<\/code> en .NET, cambiar el valor en el archivo de configuraci\u00f3n actualiza el comportamiento de la app instant\u00e1neamente, sin reiniciarla.<\/p>\n\n\n\n<p>Configuraci\u00f3n en <code>appsettings.json<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"FeatureManagement\": {\n    \"NewPaymentGateway\": false\n  }\n}<\/code><\/pre>\n\n\n\n<p>Implementaci\u00f3n en C#:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using Microsoft.FeatureManagement;\n\n\/\/ Registro en Program.cs:\n\/\/ builder.Services.AddFeatureManagement();\n\npublic class PaymentService\n{\n    private readonly IFeatureManager _featureManager;\n\n    public PaymentService(IFeatureManager featureManager)\n    {\n        _featureManager = featureManager;\n    }\n\n    public async Task ProcessPaymentAsync(Order order)\n    {\n        \/\/ Se eval\u00faa en tiempo de ejecuci\u00f3n.\n        \/\/ Cambiar el flag en appsettings.json actualiza este comportamiento sin reiniciar la app.\n        if (await _featureManager.IsEnabledAsync(\"NewPaymentGateway\"))\n        {\n            await ProcessWithStripeAsync(order); \/\/ Nueva pasarela\n        }\n        else\n        {\n            await ProcessWithLegacySystemAsync(order); \/\/ Sistema anterior\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>La primera vez que us\u00e9 esto en un proyecto real, cambi\u00e9 el comportamiento de la pasarela de pago en producci\u00f3n cambiando un <code>false<\/code> por <code>true<\/code> en un archivo de configuraci\u00f3n. Sin deploy, sin downtime, sin nervios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. FeatureGate: Bloqueando Endpoints Completos<\/h2>\n\n\n\n<p>A veces no alcanza con un condicional dentro de la l\u00f3gica de negocio. Si la feature expone un endpoint nuevo, queremos que ese endpoint directamente no exista mientras el flag est\u00e9 apagado. El atributo <code>[FeatureGate]<\/code> intercepta la petici\u00f3n HTTP en el pipeline de ASP.NET Core y devuelve autom\u00e1ticamente un <code>404 Not Found<\/code> si el flag est\u00e1 desactivado. La l\u00f3gica de negocio queda limpia, sin condicionales.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using Microsoft.AspNetCore.Mvc;\nusing Microsoft.FeatureManagement.Mvc;\n\n[ApiController]\n[Route(\"api\/[controller]\")]\npublic class ReportsController : ControllerBase\n{\n    \/\/ Este endpoint solo existe si \"AdvancedReporting\" es true.\n    \/\/ Si est\u00e1 apagado, responde 404 autom\u00e1ticamente.\n    [HttpGet(\"advanced\")]\n    [FeatureGate(\"AdvancedReporting\")]\n    public IActionResult GetAdvancedReport()\n    {\n        return Ok(new { Message = \"Reporte avanzado generado exitosamente.\" });\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u00datil para exponer funcionalidades premium, features en beta o endpoints que todav\u00eda est\u00e1n en desarrollo pero ya mergeados a main.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Feature Filters: Reglas Din\u00e1micas y Canary Releases<\/h2>\n\n\n\n<p>Los flags booleanos globales son el punto de partida, pero las situaciones reales suelen ser m\u00e1s complejas. \u00bfQu\u00e9 pasa si quer\u00e9s activar una feature solo para el 10% del tr\u00e1fico? \u00bfO solo durante ciertos horarios? \u00bfO solo para usuarios internos? Ah\u00ed entran los <strong>Feature Filters<\/strong>.<\/p>\n\n\n\n<p>El m\u00e1s directo para Canary releases es el filtro de porcentaje. En lugar de un booleano, defin\u00eds una regla:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"FeatureManagement\": {\n    \"RedesignedUI\": {\n      \"EnabledFor\": [\n        {\n          \"Name\": \"Percentage\",\n          \"Parameters\": {\n            \"Value\": 25\n          }\n        }\n      ]\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p>El 25% de las peticiones ver\u00e1n la nueva UI. El 75% restante, la versi\u00f3n anterior. Sin tocar el c\u00f3digo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using Microsoft.FeatureManagement;\nusing Microsoft.FeatureManagement.FeatureFilters;\n\n\/\/ Registro en Program.cs incluyendo el filtro:\n\/\/ builder.Services.AddFeatureManagement().AddFeatureFilter&lt;PercentageFilter&gt;();\n\npublic class UIController : Controller\n{\n    private readonly IFeatureManager _featureManager;\n\n    public UIController(IFeatureManager featureManager)\n    {\n        _featureManager = featureManager;\n    }\n\n    public async Task&lt;IActionResult&gt; Index()\n    {\n        if (await _featureManager.IsEnabledAsync(\"RedesignedUI\"))\n        {\n            return View(\"Index_v2\"); \/\/ 25% del tr\u00e1fico\n        }\n\n        return View(\"Index_v1\"); \/\/ 75% del tr\u00e1fico\n    }\n}<\/code><\/pre>\n\n\n\n<p>Con este patr\u00f3n pod\u00e9s hacer un lanzamiento progresivo real: empez\u00e1s con el 5%, observ\u00e1s m\u00e9tricas, sub\u00eds a 25%, luego a 50%, y cuando est\u00e1s seguro activ\u00e1s al 100%. Todo sin un solo redeploy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfCu\u00e1ndo usar Feature Flags vs. versionado de API?<\/h2>\n\n\n\n<p>Es una confusi\u00f3n frecuente. La regla pr\u00e1ctica que uso:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n  <li><strong>Feature Flags<\/strong> \u2192 cuando el cambio es interno o progresivo y quer\u00e9s controlar cu\u00e1ndo se activa en producci\u00f3n sin cambiar el contrato p\u00fablico de la API.<\/li>\n  <li><strong>Versionado de API<\/strong> \u2192 cuando el cambio rompe el contrato y ten\u00e9s consumidores externos que necesitan tiempo para adaptarse.<\/li>\n<\/ul>\n\n\n\n<p>No son excluyentes: pod\u00e9s usar ambos en el mismo proyecto para prop\u00f3sitos distintos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pr\u00f3ximos pasos<\/h2>\n\n\n\n<p>Lo que vimos ac\u00e1 es la base. El ecosistema de <code>Microsoft.FeatureManagement<\/code> va m\u00e1s lejos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n  <li><strong>Custom Feature Filters:<\/strong> habilitar features seg\u00fan el Tenant de la base de datos, el rol del usuario o cualquier l\u00f3gica de negocio propia.<\/li>\n  <li><strong>Azure App Configuration:<\/strong> centralizar todos los flags en un servicio externo, modificarlos desde un panel sin tocar archivos de configuraci\u00f3n y con soporte para targeting (activar por usuario espec\u00edfico, grupo o regi\u00f3n).<\/li>\n<\/ul>\n\n\n\n<p>\u00bfQuer\u00e9s que profundice en alguno de estos dos temas en un pr\u00f3ximo art\u00edculo? Dejalo en los comentarios.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>C\u00f3mo implementar Feature Flags en .NET con Microsoft.FeatureManagement: flags booleanos en tiempo de ejecuci\u00f3n, bloqueo de endpoints con FeatureGate, y lanzamientos progresivos Canary con Feature Filters de porcentaje. Con ejemplos reales y cu\u00e1ndo usarlos vs. versionado de API.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1,202],"tags":[348,346,347,371,370,368,374,366,367,373,372,324,369],"class_list":["post-1295","post","type-post","status-publish","format-standard","hentry","category-blog","category-dotnet","tag-net-10","tag-net-8","tag-net-9","tag-a-b-testing","tag-canary-release","tag-ci-cd-2","tag-configuracion","tag-feature-flags-2","tag-feature-management","tag-featuregate","tag-ifeaturemanager","tag-middleware","tag-trunk-based-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Feature Flags en .NET: Separando el Deploy del Release con Microsoft.FeatureManagement &#183; devops Mauro Bernal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Feature Flags en .NET: Separando el Deploy del Release con Microsoft.FeatureManagement &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"C\u00f3mo implementar Feature Flags en .NET con Microsoft.FeatureManagement: flags booleanos en tiempo de ejecuci\u00f3n, bloqueo de endpoints con FeatureGate, y lanzamientos progresivos Canary con Feature Filters de porcentaje. Con ejemplos reales y cu\u00e1ndo usarlos vs. versionado de API.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-16T22:00:33+00:00\" \/>\n<meta name=\"author\" content=\"Mauro Bernal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:site\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mauro Bernal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-flags-dotnet-microsoft-feature-management\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-flags-dotnet-microsoft-feature-management\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"Feature Flags en .NET: Separando el Deploy del Release con Microsoft.FeatureManagement\",\"datePublished\":\"2026-03-16T22:00:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-flags-dotnet-microsoft-feature-management\\\/\"},\"wordCount\":791,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\".NET 10\",\".NET 8\",\".NET 9\",\"A\\\/B Testing\",\"Canary Release\",\"CI\\\/CD\",\"Configuracion\",\"Feature Flags\",\"Feature Management\",\"FeatureGate\",\"IFeatureManager\",\"middleware\",\"Trunk-based Development\"],\"articleSection\":[\"Blog\",\"DotNet\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-flags-dotnet-microsoft-feature-management\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-flags-dotnet-microsoft-feature-management\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-flags-dotnet-microsoft-feature-management\\\/\",\"name\":\"Feature Flags en .NET: Separando el Deploy del Release con Microsoft.FeatureManagement &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-16T22:00:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-flags-dotnet-microsoft-feature-management\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-flags-dotnet-microsoft-feature-management\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/feature-flags-dotnet-microsoft-feature-management\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Feature Flags en .NET: Separando el Deploy del Release con Microsoft.FeatureManagement\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\",\"name\":\"devops Mauro Bernal\",\"description\":\"Cuando tu trabajo es hacer que las cosas funcionen bien...\",\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\",\"name\":\"Mauro Bernal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"width\":1740,\"height\":1740,\"caption\":\"Mauro Bernal\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\"},\"description\":\"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman\",\"sameAs\":[\"https:\\\/\\\/maurobernal.com.ar\",\"https:\\\/\\\/x.com\\\/_maurobernal\",\"https:\\\/\\\/youtube.com\\\/maurobernal\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Feature Flags en .NET: Separando el Deploy del Release con Microsoft.FeatureManagement &#183; devops Mauro Bernal","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/","og_locale":"es_ES","og_type":"article","og_title":"Feature Flags en .NET: Separando el Deploy del Release con Microsoft.FeatureManagement &#183; devops Mauro Bernal","og_description":"C\u00f3mo implementar Feature Flags en .NET con Microsoft.FeatureManagement: flags booleanos en tiempo de ejecuci\u00f3n, bloqueo de endpoints con FeatureGate, y lanzamientos progresivos Canary con Feature Filters de porcentaje. Con ejemplos reales y cu\u00e1ndo usarlos vs. versionado de API.","og_url":"https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-16T22:00:33+00:00","author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal","Tiempo de lectura":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"Feature Flags en .NET: Separando el Deploy del Release con Microsoft.FeatureManagement","datePublished":"2026-03-16T22:00:33+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/"},"wordCount":791,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":[".NET 10",".NET 8",".NET 9","A\/B Testing","Canary Release","CI\/CD","Configuracion","Feature Flags","Feature Management","FeatureGate","IFeatureManager","middleware","Trunk-based Development"],"articleSection":["Blog","DotNet"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/","url":"https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/","name":"Feature Flags en .NET: Separando el Deploy del Release con Microsoft.FeatureManagement &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-16T22:00:33+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/feature-flags-dotnet-microsoft-feature-management\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"Feature Flags en .NET: Separando el Deploy del Release con Microsoft.FeatureManagement"}]},{"@type":"WebSite","@id":"https:\/\/maurobernal.com.ar\/blog\/#website","url":"https:\/\/maurobernal.com.ar\/blog\/","name":"devops Mauro Bernal","description":"Cuando tu trabajo es hacer que las cosas funcionen bien...","publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/maurobernal.com.ar\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283","name":"Mauro Bernal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","width":1740,"height":1740,"caption":"Mauro Bernal"},"logo":{"@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1"},"description":"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman","sameAs":["https:\/\/maurobernal.com.ar","https:\/\/x.com\/_maurobernal","https:\/\/youtube.com\/maurobernal"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1295","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/comments?post=1295"}],"version-history":[{"count":0,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1295\/revisions"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1295"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1295"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1295"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}