{"id":1293,"date":"2026-03-16T14:24:54","date_gmt":"2026-03-16T17:24:54","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/dotnet-aspire-origen-evolucion-dotnet-10\/"},"modified":"2026-03-16T14:24:54","modified_gmt":"2026-03-16T17:24:54","slug":"dotnet-aspire-origen-evolucion-dotnet-10","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/dotnet-aspire-origen-evolucion-dotnet-10\/","title":{"rendered":".NET Aspire: Desde su Origen hasta .NET 10 \u2014 La Gu\u00eda Pr\u00e1ctica"},"content":{"rendered":"\n<p>Cuando Microsoft anunci\u00f3 .NET Aspire a finales de 2023, mi primera reacci\u00f3n fue esc\u00e9ptica. \u00abOtro framework de orquestaci\u00f3n\u00bb, pens\u00e9. Me equivoqu\u00e9 bastante. Despu\u00e9s de usarlo en proyectos reales \u2014desde una API con tres microservicios hasta una arquitectura con colas, cach\u00e9 y modelos de IA local\u2014 cambi\u00f3 radicalmente c\u00f3mo arranco proyectos distribuidos. En este art\u00edculo repaso qu\u00e9 es, c\u00f3mo evolucion\u00f3 de .NET 8 a .NET 10 y c\u00f3mo puede convivir con tu stack de Kubernetes existente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 es .NET Aspire y para qui\u00e9n est\u00e1 destinado?<\/h2>\n\n\n\n<p><strong>.NET Aspire<\/strong> es un <em>stack<\/em> opinado (opinionated) de herramientas, plantillas y paquetes NuGet dise\u00f1ado para construir aplicaciones distribuidas, observables y listas para producci\u00f3n con .NET. La palabra clave ah\u00ed es <strong>opinado<\/strong>: toma decisiones por vos (OpenTelemetry por defecto, health checks incluidos, service discovery autom\u00e1tico) para que vos no tengas que hacerlo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfPara qui\u00e9n es?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n  <li><strong>Equipos sin un DevOps dedicado:<\/strong> Facilita enormemente la orquestaci\u00f3n local y el despliegue a la nube sin tener que escribir complejos archivos <code>docker-compose.yml<\/code> o manifiestos de K8s.<\/li>\n  <li><strong>Desarrolladores que buscan productividad local:<\/strong> Permite levantar 5 microservicios, una base de datos PostgreSQL, un cach\u00e9 Redis y un broker RabbitMQ con un solo F5, autoconfigurando las cadenas de conexi\u00f3n y la inyecci\u00f3n de dependencias entre ellos.<\/li>\n  <li><strong>Proyectos que requieren observabilidad inmediata:<\/strong> Trae un Dashboard local que muestra logs, m\u00e9tricas, trazas distribuidas (OpenTelemetry) y variables de entorno en tiempo real, sin necesidad de configurar Grafana, Prometheus o Jaeger localmente.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfPara qui\u00e9n NO es (o no es obligatorio)?<\/h3>\n\n\n\n<p>Si sos un arquitecto que necesita control absoluto sobre el plano de red, <em>service mesh<\/em> y configuraciones avanzadas de orquestaci\u00f3n, Aspire no tiene que reemplazar tu setup de producci\u00f3n. Pero s\u00ed puede ser tu entorno de desarrollo local mientras segu\u00eds gestionando todo con Helm y Kubernetes en prod. M\u00e1s sobre esto al final.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">L\u00ednea de Tiempo: De .NET 8 a .NET 10<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">El Origen: .NET 8 (Finales de 2023)<\/h3>\n\n\n\n<p>Naci\u00f3 como la respuesta de Microsoft a la complejidad de configurar microservicios localmente. Se introdujeron los conceptos de <strong>AppHost<\/strong> (el proyecto orquestador) y <strong>Service Defaults<\/strong> (configuraciones base de OpenTelemetry y resiliencia). En esta primera versi\u00f3n estaba bastante acoplado al ecosistema de Azure, lo que gener\u00f3 resistencia en quienes trabajaban con otros proveedores cloud. Aun as\u00ed, la experiencia de desarrollo local era notablemente mejor que cualquier alternativa existente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">La Madurez: .NET 9 (Finales de 2024)<\/h3>\n\n\n\n<p>Aspire se desvincul\u00f3 de ser \u00absolo para Azure\u00bb. La comunidad explot\u00f3: aparecieron decenas de integraciones para AWS, GCP y contenedores gen\u00e9ricos. El Dashboard mejor\u00f3 considerablemente en rendimiento y se introdujo una gesti\u00f3n m\u00e1s robusta del ciclo de vida de los contenedores locales. Para este momento ya lo estaba usando en proyectos reales sin dudar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">El Estado Actual: .NET 10 (2025\/2026)<\/h3>\n\n\n\n<p>Con .NET 10, Aspire se convirti\u00f3 en el est\u00e1ndar de facto para arquitecturas distribuidas en .NET. Las novedades principales:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n  <li><strong>Integraci\u00f3n profunda con IA:<\/strong> Componentes nativos para orquestar contenedores de Ollama (modelos de IA locales), bases de datos vectoriales (Qdrant, Milvus) y configuraci\u00f3n autom\u00e1tica de Semantic Kernel.<\/li>\n  <li><strong>Event-Driven &amp; Dapr:<\/strong> Integraci\u00f3n fluida con arquitecturas dirigidas por eventos y soporte mejorado para Dapr.<\/li>\n  <li><strong>Manifiestos K8s Nativos:<\/strong> Mejoras en la exportaci\u00f3n de la topolog\u00eda de Aspire hacia cl\u00fasteres de Kubernetes, lo que facilita el trabajo de quienes administran sus propios servidores.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conceptos Clave<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">AppHost: Tu docker-compose en C#<\/h3>\n\n\n\n<p>El <strong>AppHost<\/strong> es un proyecto de consola de C# normal que act\u00faa como el orquestador local. En lugar de YAML, us\u00e1s C# para definir qu\u00e9 contenedores o proyectos de .NET deben ejecutarse juntos. Si sab\u00e9s C#, ya sab\u00e9s escribir tu orquestaci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Service Discovery: Sin hardcodear puertos<\/h3>\n\n\n\n<p>Aspire inyecta autom\u00e1ticamente las URLs de los servicios. Si tu API \u00abA\u00bb necesita llamar a la API \u00abB\u00bb, no hardcode\u00e1s <code>localhost:5001<\/code>. Aspire resuelve los nombres din\u00e1micamente usando el nombre que vos le asignaste. Esto elimina una categor\u00eda entera de bugs que antes aparec\u00edan en desarrollo (\u00abfunciona en mi m\u00e1quina\u00bb).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hosting &amp; Client Integrations<\/h3>\n\n\n\n<p>Son paquetes NuGet que vienen en pares: uno para el <strong>AppHost<\/strong> que levanta el contenedor (<code>Aspire.Hosting.Redis<\/code>), y otro para el <strong>microservicio<\/strong> que lo consume (<code>Aspire.StackExchange.Redis<\/code>). Este segundo paquete configura autom\u00e1ticamente el cliente con resiliencia, health checks y telemetr\u00eda. Sin boilerplate.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplos de C\u00f3digo (.NET 10)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">A. El Orquestador: Proyecto AppHost<\/h3>\n\n\n\n<p>Este es el c\u00f3digo que reemplaza a un <code>docker-compose.yml<\/code>. Cuando presion\u00e1s F5 sobre este proyecto, Aspire levanta todos los contenedores, configura las variables de entorno y arranca los proyectos de .NET autom\u00e1ticamente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var builder = DistributedApplication.CreateBuilder(args);\n\n\/\/ 1. Contenedor de PostgreSQL con pgAdmin integrado\nvar postgres = builder.AddPostgres(\"postgres-server\")\n    .WithPgAdmin()\n    .AddDatabase(\"MiBaseDeDatos\");\n\n\/\/ 2. Contenedor de Redis\nvar cache = builder.AddRedis(\"redis-cache\");\n\n\/\/ 3. Modelo de IA local con Ollama\nvar ollama = builder.AddOllama(\"ia-local\")\n    .AddModel(\"llama3\");\n\n\/\/ 4. API Backend: recibe referencias a todos los recursos\nvar apiBackend = builder.AddProject&lt;Projects.MiApiBackend&gt;(\"backend-api\")\n    .WithReference(postgres)\n    .WithReference(cache)\n    .WithReference(ollama);\n\n\/\/ 5. Frontend Blazor: solo necesita saber d\u00f3nde est\u00e1 la API\nbuilder.AddProject&lt;Projects.MiFrontendBlazor&gt;(\"frontend-web\")\n    .WithReference(apiBackend)\n    .WithExternalHttpEndpoints();\n\nbuilder.Build().Run();<\/code><\/pre>\n\n\n\n<p>Lo que m\u00e1s me llam\u00f3 la atenci\u00f3n la primera vez: no hay ninguna cadena de conexi\u00f3n hardcodeada. Aspire las inyecta autom\u00e1ticamente en las variables de entorno de cada proyecto al momento de arrancar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">B. Consumiendo los recursos en la API<\/h3>\n\n\n\n<p>En el <code>Program.cs<\/code> de tu microservicio, us\u00e1s las integraciones de Aspire. El nombre <code>\"redis-cache\"<\/code> o <code>\"MiBaseDeDatos\"<\/code> se resuelve autom\u00e1ticamente al contenedor correspondiente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var builder = WebApplication.CreateBuilder(args);\n\n\/\/ Configura OpenTelemetry, health checks y resiliencia por defecto\nbuilder.AddServiceDefaults();\n\n\/\/ Se conecta al Redis del AppHost por nombre, sin IP ni puerto\nbuilder.AddRedisClient(\"redis-cache\");\n\n\/\/ Se conecta a Postgres, tambi\u00e9n por nombre\nbuilder.AddNpgsqlDbContext&lt;MiDbContext&gt;(\"MiBaseDeDatos\");\n\nvar app = builder.Build();\n\n\/\/ Expone \/health y \/alive autom\u00e1ticamente\napp.MapDefaultEndpoints();\n\napp.MapGet(\"\/datos\", async (IDistributedCache cache, MiDbContext db) =>\n{\n    \/\/ Us\u00e1s los servicios como siempre, sin saber nada de c\u00f3mo se conectaron\n    return Results.Ok(new { Mensaje = \"Conectado por Aspire!\" });\n});\n\napp.Run();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">C. Service Discovery entre microservicios<\/h3>\n\n\n\n<p>En el Frontend, si queremos llamar al Backend por HTTP, usamos el nombre registrado en el AppHost. Aspire intercepta y resuelve el puerto real en tiempo de ejecuci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ En el Program.cs del Frontend Blazor\nbuilder.Services.AddHttpClient&lt;BackendClient&gt;(client =>\n{\n    \/\/ \"backend-api\" es el nombre del proyecto en el AppHost\n    \/\/ Aspire lo traduce al puerto correcto autom\u00e1ticamente\n    client.BaseAddress = new Uri(\"http:\/\/backend-api\"); \n});<\/code><\/pre>\n\n\n\n<p>El primer d\u00eda que esto funcion\u00f3 sin tocar un solo archivo de configuraci\u00f3n ni abrir el <code>launchSettings.json<\/code>, entend\u00ed por qu\u00e9 la gente dice que Aspire cambia la forma de trabajar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfY si uso Kubernetes en producci\u00f3n?<\/h2>\n\n\n\n<p>Esta es la pregunta que m\u00e1s me hacen cuando presento Aspire. La respuesta corta: <strong>no son excluyentes<\/strong>.<\/p>\n\n\n\n<p>Pod\u00e9s adoptar .NET Aspire \u00fanicamente como tu entorno de desarrollo local. Tus desarrolladores clonan el repositorio, presionan F5 y Aspire se encarga de levantar las bases de datos en Docker, configurar las variables de entorno y mostrar las trazas de OpenTelemetry en el Dashboard. Luego, en el pipeline de CI\/CD, el proyecto <code>AppHost<\/code> simplemente se ignora: compil\u00e1s tus contenedores como siempre y los despleg\u00e1s en K8s con tus manifiestos o Helm Charts.<\/p>\n\n\n\n<p>El resultado: productividad local extrema sin ceder ni un mil\u00edmetro de control en producci\u00f3n. Para equipos que administran sus propios cl\u00fasteres, es una combinaci\u00f3n muy pr\u00e1ctica.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p>.NET Aspire no es hype. Es una soluci\u00f3n concreta a un problema real: configurar microservicios localmente es tedioso, propenso a errores y consume tiempo valioso de desarrollo. Con la evoluci\u00f3n de .NET 8 a .NET 10 pas\u00f3 de ser una herramienta interesante a ser el punto de partida obvio para cualquier arquitectura distribuida en .NET.<\/p>\n\n\n\n<p>Si todav\u00eda no lo probaste, mi recomendaci\u00f3n es crear un proyecto nuevo con la plantilla de Aspire, agregar un Redis y un Postgres, y ver el Dashboard en acci\u00f3n. En menos de 20 minutos vas a entender por qu\u00e9 est\u00e1 cambiando la forma en que trabajamos.<\/p>\n\n\n\n<p>\u00bfLo est\u00e1s usando en alg\u00fan proyecto? \u00bfTen\u00e9s dudas sobre c\u00f3mo integrarlo con tu setup actual? Dejalo en los comentarios.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Repaso completo de .NET Aspire desde su origen en .NET 8 hasta las novedades de .NET 10: qu\u00e9 es, para qui\u00e9n es, c\u00f3mo funciona el AppHost, Service Discovery y las integraciones de cliente. Con ejemplos de c\u00f3digo reales y c\u00f3mo convivir con Kubernetes en producci\u00f3n.<\/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,352,357,353,242,240,238,266,354,315,355,356],"class_list":["post-1293","post","type-post","status-publish","format-standard","hentry","category-blog","category-dotnet","tag-net-10","tag-net-8","tag-net-9","tag-net-aspire","tag-apphost","tag-dapr","tag-devops","tag-docker","tag-kubernetes","tag-microservicios","tag-ollama","tag-opentelemetry","tag-service-discovery","tag-sistemas-distribuidos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>.NET Aspire: Desde su Origen hasta .NET 10 \u2014 La Gu\u00eda Pr\u00e1ctica &#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\/dotnet-aspire-origen-evolucion-dotnet-10\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\".NET Aspire: Desde su Origen hasta .NET 10 \u2014 La Gu\u00eda Pr\u00e1ctica &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"Repaso completo de .NET Aspire desde su origen en .NET 8 hasta las novedades de .NET 10: qu\u00e9 es, para qui\u00e9n es, c\u00f3mo funciona el AppHost, Service Discovery y las integraciones de cliente. Con ejemplos de c\u00f3digo reales y c\u00f3mo convivir con Kubernetes en producci\u00f3n.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/dotnet-aspire-origen-evolucion-dotnet-10\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-16T17:24:54+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=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/dotnet-aspire-origen-evolucion-dotnet-10\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/dotnet-aspire-origen-evolucion-dotnet-10\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\".NET Aspire: Desde su Origen hasta .NET 10 \u2014 La Gu\u00eda Pr\u00e1ctica\",\"datePublished\":\"2026-03-16T17:24:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/dotnet-aspire-origen-evolucion-dotnet-10\\\/\"},\"wordCount\":1158,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\".NET 10\",\".NET 8\",\".NET 9\",\".NET Aspire\",\"AppHost\",\"Dapr\",\"devops\",\"docker\",\"kubernetes\",\"microservicios\",\"Ollama\",\"opentelemetry\",\"Service Discovery\",\"Sistemas Distribuidos\"],\"articleSection\":[\"Blog\",\"DotNet\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/dotnet-aspire-origen-evolucion-dotnet-10\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/dotnet-aspire-origen-evolucion-dotnet-10\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/dotnet-aspire-origen-evolucion-dotnet-10\\\/\",\"name\":\".NET Aspire: Desde su Origen hasta .NET 10 \u2014 La Gu\u00eda Pr\u00e1ctica &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-16T17:24:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/dotnet-aspire-origen-evolucion-dotnet-10\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/dotnet-aspire-origen-evolucion-dotnet-10\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/dotnet-aspire-origen-evolucion-dotnet-10\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\".NET Aspire: Desde su Origen hasta .NET 10 \u2014 La Gu\u00eda Pr\u00e1ctica\"}]},{\"@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":".NET Aspire: Desde su Origen hasta .NET 10 \u2014 La Gu\u00eda Pr\u00e1ctica &#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\/dotnet-aspire-origen-evolucion-dotnet-10\/","og_locale":"es_ES","og_type":"article","og_title":".NET Aspire: Desde su Origen hasta .NET 10 \u2014 La Gu\u00eda Pr\u00e1ctica &#183; devops Mauro Bernal","og_description":"Repaso completo de .NET Aspire desde su origen en .NET 8 hasta las novedades de .NET 10: qu\u00e9 es, para qui\u00e9n es, c\u00f3mo funciona el AppHost, Service Discovery y las integraciones de cliente. Con ejemplos de c\u00f3digo reales y c\u00f3mo convivir con Kubernetes en producci\u00f3n.","og_url":"https:\/\/maurobernal.com.ar\/blog\/dotnet-aspire-origen-evolucion-dotnet-10\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-16T17:24:54+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":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/dotnet-aspire-origen-evolucion-dotnet-10\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/dotnet-aspire-origen-evolucion-dotnet-10\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":".NET Aspire: Desde su Origen hasta .NET 10 \u2014 La Gu\u00eda Pr\u00e1ctica","datePublished":"2026-03-16T17:24:54+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/dotnet-aspire-origen-evolucion-dotnet-10\/"},"wordCount":1158,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":[".NET 10",".NET 8",".NET 9",".NET Aspire","AppHost","Dapr","devops","docker","kubernetes","microservicios","Ollama","opentelemetry","Service Discovery","Sistemas Distribuidos"],"articleSection":["Blog","DotNet"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/dotnet-aspire-origen-evolucion-dotnet-10\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/dotnet-aspire-origen-evolucion-dotnet-10\/","url":"https:\/\/maurobernal.com.ar\/blog\/dotnet-aspire-origen-evolucion-dotnet-10\/","name":".NET Aspire: Desde su Origen hasta .NET 10 \u2014 La Gu\u00eda Pr\u00e1ctica &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-16T17:24:54+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/dotnet-aspire-origen-evolucion-dotnet-10\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/dotnet-aspire-origen-evolucion-dotnet-10\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/dotnet-aspire-origen-evolucion-dotnet-10\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":".NET Aspire: Desde su Origen hasta .NET 10 \u2014 La Gu\u00eda Pr\u00e1ctica"}]},{"@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\/1293","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=1293"}],"version-history":[{"count":0,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1293\/revisions"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1293"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1293"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}