{"id":1274,"date":"2026-03-12T09:29:12","date_gmt":"2026-03-12T12:29:12","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/?p=1274"},"modified":"2026-03-12T09:29:12","modified_gmt":"2026-03-12T12:29:12","slug":"arquitectura-web-api-dotnet-10-parte-1","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-web-api-dotnet-10-parte-1\/","title":{"rendered":"Arquitectura de Web APIs en .NET 10 \u2014 Parte 1: Los fundamentos que no pueden faltar"},"content":{"rendered":"\n<p>Cuando empec\u00e9 a trabajar con .NET, mi idea de una \u00abAPI lista para producci\u00f3n\u00bb era que compilara y los endpoints respondieran correctamente. Con el tiempo aprend\u00ed que hay una diferencia enorme entre una API que funciona en tu m\u00e1quina y una que sobrevive el mundo real.<\/p>\n\n\n\n<p>Esta es la primera parte de una serie de tres art\u00edculos donde te cuento los <strong>11 componentes que hoy considero esenciales<\/strong> en cualquier Web API con .NET 10. Empezamos por los fundamentos: los cuatro que deber\u00edas tener desde el primer d\u00eda, sin importar el tama\u00f1o del proyecto.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Health Checks: que el orquestador sepa si tu API est\u00e1 viva<\/h2>\n\n\n\n<p>La primera vez que deploy\u00e9 en Kubernetes sin health checks fue un desastre silencioso. El pod figuraba como \u00abRunning\u00bb, pero la base de datos no conectaba y las requests simplemente fallaban sin que el orquestador se enterara.<\/p>\n\n\n\n<p>Los Health Checks exponen endpoints que le dicen a Kubernetes (o a cualquier balanceador de carga) dos cosas fundamentales:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Liveness:<\/strong> \u00bfel proceso sigue vivo?<\/li>\n<li><strong>Readiness:<\/strong> \u00bfest\u00e1 listo para recibir tr\u00e1fico? (sus dependencias \u2014base de datos, Redis, etc.\u2014 est\u00e1n funcionando)<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp\">\/\/ Program.cs\nbuilder.Services.AddHealthChecks()\n    .AddNpgSql(builder.Configuration.GetConnectionString(\"Default\")); \/\/ Verifica PostgreSQL\n\nvar app = builder.Build();\n\napp.MapHealthChecks(\"\/health\");          \/\/ Endpoint general\napp.MapHealthChecks(\"\/health\/ready\",    \/\/ Solo readiness\n    new HealthCheckOptions { Predicate = check => check.Tags.Contains(\"ready\") });\napp.MapHealthChecks(\"\/health\/live\",     \/\/ Solo liveness\n    new HealthCheckOptions { Predicate = _ => false });<\/code><\/pre>\n\n\n\n<p>Con el paquete <code>AspNetCore.HealthChecks.*<\/code> pod\u00e9s agregar chequeos para SQL Server, Redis, servicios HTTP externos y m\u00e1s. Una l\u00ednea por dependencia cr\u00edtica.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Exception Handling Global con IExceptionHandler<\/h2>\n\n\n\n<p>Nada peor que una API que le devuelve un stack trace de C# al cliente, o un error 500 gen\u00e9rico sin informaci\u00f3n \u00fatil. Durante mucho tiempo us\u00e9 try\/catch en cada endpoint, hasta que descubr\u00ed <code>IExceptionHandler<\/code>.<\/p>\n\n\n\n<p>Con esta interfaz centraliz\u00e1s el manejo de errores en un solo lugar y respond\u00e9s siempre con el formato est\u00e1ndar <strong>ProblemDetails (RFC 7807)<\/strong>, que es lo que los clientes modernos esperan.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp\">public class GlobalExceptionHandler : IExceptionHandler\n{\n    private readonly ILogger&lt;GlobalExceptionHandler&gt; _logger;\n\n    public GlobalExceptionHandler(ILogger&lt;GlobalExceptionHandler&gt; logger)\n    {\n        _logger = logger;\n    }\n\n    public async ValueTask&lt;bool&gt; TryHandleAsync(\n        HttpContext context, Exception exception, CancellationToken cancellationToken)\n    {\n        _logger.LogError(exception, \"Error no controlado: {Message}\", exception.Message);\n\n        var problemDetails = new ProblemDetails\n        {\n            Status = StatusCodes.Status500InternalServerError,\n            Title = \"Ocurri\u00f3 un error inesperado\",\n            Detail = exception.Message\n        };\n\n        context.Response.StatusCode = problemDetails.Status.Value;\n        await context.Response.WriteAsJsonAsync(problemDetails, cancellationToken);\n        return true; \/\/ Excepci\u00f3n manejada, detiene la cadena\n    }\n}\n\n\/\/ Program.cs\nbuilder.Services.AddExceptionHandler&lt;GlobalExceptionHandler&gt;();\nbuilder.Services.AddProblemDetails();\napp.UseExceptionHandler();<\/code><\/pre>\n\n\n\n<p>Pod\u00e9s crear m\u00faltiples handlers y registrarlos en orden: el primero que devuelva <code>true<\/code> corta la cadena. \u00datil para manejar <code>ValidationException<\/code>, <code>NotFoundException<\/code>, etc., con respuestas espec\u00edficas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Validaci\u00f3n Nativa con Endpoint Filters<\/h2>\n\n\n\n<p>Validar el payload antes de que llegue a la l\u00f3gica de negocio es cr\u00edtico. En .NET 10, las Minimal APIs tienen Endpoint Filters que act\u00faan como un pipeline de validaci\u00f3n declarativo, sin necesidad de librer\u00edas externas para los casos m\u00e1s comunes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp\">app.MapPost(\"\/api\/users\", (UserDto user) =>\n{\n    return Results.Created($\"\/api\/users\/{user.Id}\", user);\n})\n.AddEndpointFilter(async (context, next) =>\n{\n    var user = context.GetArgument&lt;UserDto&gt;(0);\n\n    var errors = new Dictionary&lt;string, string[]&gt;();\n\n    if (string.IsNullOrEmpty(user.Name))\n        errors[\"Name\"] = new[] { \"El nombre es obligatorio\" };\n\n    if (user.Age &lt; 0 || user.Age &gt; 120)\n        errors[\"Age\"] = new[] { \"La edad debe estar entre 0 y 120\" };\n\n    if (errors.Any())\n        return Results.ValidationProblem(errors);\n\n    return await next(context);\n});<\/code><\/pre>\n\n\n\n<p>Para proyectos m\u00e1s grandes donde necesit\u00e1s validaciones complejas, <a href=\"https:\/\/docs.fluentvalidation.net\/\" target=\"_blank\" rel=\"noreferrer noopener\">FluentValidation<\/a> sigue siendo una excelente opci\u00f3n que se integra perfectamente con este patr\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. OpenAPI Integrado: adi\u00f3s Swashbuckle<\/h2>\n\n\n\n<p>Durante a\u00f1os, generar documentaci\u00f3n Swagger significaba instalar Swashbuckle y rezar para que no conflictuara con otras dependencias. En .NET 10, la generaci\u00f3n de especificaci\u00f3n OpenAPI es nativa, sin dependencias externas, con mejor performance de arranque y mantenimiento garantizado por Microsoft.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp\">builder.Services.AddOpenApi(); \/\/ Generaci\u00f3n nativa\n\nvar app = builder.Build();\n\nif (app.Environment.IsDevelopment())\n{\n    app.MapOpenApi(); \/\/ Expone la spec en \/openapi\/v1.json\n\n    \/\/ Opci\u00f3n A: Scalar (UI moderna, recomendada)\n    app.MapScalarApiReference();\n\n    \/\/ Opci\u00f3n B: Swagger UI cl\u00e1sico\n    \/\/ app.UseSwaggerUI(c => c.SwaggerEndpoint(\"\/openapi\/v1.json\", \"API v1\"));\n}<\/code><\/pre>\n\n\n\n<p>Para la UI de documentaci\u00f3n, te recomiendo probar <a href=\"https:\/\/scalar.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Scalar<\/a>: tiene mucho mejor UX que Swagger UI cl\u00e1sico y es trivial de integrar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resumen de la Parte 1<\/h2>\n\n\n\n<p>Estos cuatro componentes son los que agrego en cualquier proyecto nuevo desde el d\u00eda uno:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#x2705; <strong>Health Checks<\/strong> \u2192 para que Kubernetes y el balanceador sepan el estado real de tu API<\/li>\n<li>&#x2705; <strong>Exception Handler global<\/strong> \u2192 respuestas de error consistentes y sin leakear internos<\/li>\n<li>&#x2705; <strong>Validaci\u00f3n con Endpoint Filters<\/strong> \u2192 datos limpios antes de tocar la l\u00f3gica de negocio<\/li>\n<li>&#x2705; <strong>OpenAPI nativo<\/strong> \u2192 documentaci\u00f3n siempre actualizada sin overhead<\/li>\n<\/ul>\n\n\n\n<p>En la <a href=\"\/arquitectura-web-api-dotnet-10-parte-2\">Parte 2<\/a> vemos los tres componentes que marcan la diferencia cuando la API empieza a escalar: <strong>Rate Limiting, Output Cache y API Versioning<\/strong>.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Health Checks, Exception Handling global, Validaci\u00f3n con Endpoint Filters y OpenAPI nativo: los cuatro componentes esenciales que agrego en cualquier Web API con .NET 10 desde el d\u00eda uno.<\/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":[38,304,321,245,300,39,316,242,18,294,317,305,313,266,324,310,307,315,65,318,314,319,320,323,322],"class_list":["post-1274","post","type-post","status-publish","format-standard","hentry","category-blog","category-dotnet","tag-net","tag-aot","tag-api-versioning","tag-arquitectura","tag-async","tag-c","tag-caching","tag-devops","tag-dotnet","tag-dotnet10","tag-feature-flags","tag-gc","tag-health-checks","tag-microservicios","tag-middleware","tag-minimal-api","tag-openapi","tag-opentelemetry","tag-performance","tag-polly","tag-rate-limiting","tag-resiliency","tag-sse","tag-validation","tag-web-api"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Arquitectura de Web APIs en .NET 10 \u2014 Parte 1: Los fundamentos que no pueden faltar &#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\/arquitectura-web-api-dotnet-10-parte-1\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Arquitectura de Web APIs en .NET 10 \u2014 Parte 1: Los fundamentos que no pueden faltar &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"Health Checks, Exception Handling global, Validaci\u00f3n con Endpoint Filters y OpenAPI nativo: los cuatro componentes esenciales que agrego en cualquier Web API con .NET 10 desde el d\u00eda uno.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/arquitectura-web-api-dotnet-10-parte-1\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-12T12:29:12+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=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-web-api-dotnet-10-parte-1\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-web-api-dotnet-10-parte-1\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"Arquitectura de Web APIs en .NET 10 \u2014 Parte 1: Los fundamentos que no pueden faltar\",\"datePublished\":\"2026-03-12T12:29:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-web-api-dotnet-10-parte-1\\\/\"},\"wordCount\":567,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\".NET\",\"aot\",\"api-versioning\",\"arquitectura\",\"async\",\"c#\",\"caching\",\"devops\",\"dotnet\",\"dotnet10\",\"feature-flags\",\"gc\",\"health-checks\",\"microservicios\",\"middleware\",\"minimal-api\",\"openapi\",\"opentelemetry\",\"performance\",\"polly\",\"rate-limiting\",\"resiliency\",\"sse\",\"validation\",\"web-api\"],\"articleSection\":[\"Blog\",\"DotNet\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-web-api-dotnet-10-parte-1\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-web-api-dotnet-10-parte-1\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-web-api-dotnet-10-parte-1\\\/\",\"name\":\"Arquitectura de Web APIs en .NET 10 \u2014 Parte 1: Los fundamentos que no pueden faltar &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-12T12:29:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-web-api-dotnet-10-parte-1\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-web-api-dotnet-10-parte-1\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-web-api-dotnet-10-parte-1\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Arquitectura de Web APIs en .NET 10 \u2014 Parte 1: Los fundamentos que no pueden faltar\"}]},{\"@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":"Arquitectura de Web APIs en .NET 10 \u2014 Parte 1: Los fundamentos que no pueden faltar &#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\/arquitectura-web-api-dotnet-10-parte-1\/","og_locale":"es_ES","og_type":"article","og_title":"Arquitectura de Web APIs en .NET 10 \u2014 Parte 1: Los fundamentos que no pueden faltar &#183; devops Mauro Bernal","og_description":"Health Checks, Exception Handling global, Validaci\u00f3n con Endpoint Filters y OpenAPI nativo: los cuatro componentes esenciales que agrego en cualquier Web API con .NET 10 desde el d\u00eda uno.","og_url":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-web-api-dotnet-10-parte-1\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-12T12:29:12+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":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-web-api-dotnet-10-parte-1\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-web-api-dotnet-10-parte-1\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"Arquitectura de Web APIs en .NET 10 \u2014 Parte 1: Los fundamentos que no pueden faltar","datePublished":"2026-03-12T12:29:12+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-web-api-dotnet-10-parte-1\/"},"wordCount":567,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":[".NET","aot","api-versioning","arquitectura","async","c#","caching","devops","dotnet","dotnet10","feature-flags","gc","health-checks","microservicios","middleware","minimal-api","openapi","opentelemetry","performance","polly","rate-limiting","resiliency","sse","validation","web-api"],"articleSection":["Blog","DotNet"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/arquitectura-web-api-dotnet-10-parte-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-web-api-dotnet-10-parte-1\/","url":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-web-api-dotnet-10-parte-1\/","name":"Arquitectura de Web APIs en .NET 10 \u2014 Parte 1: Los fundamentos que no pueden faltar &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-12T12:29:12+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-web-api-dotnet-10-parte-1\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/arquitectura-web-api-dotnet-10-parte-1\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-web-api-dotnet-10-parte-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"Arquitectura de Web APIs en .NET 10 \u2014 Parte 1: Los fundamentos que no pueden faltar"}]},{"@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\/1274","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=1274"}],"version-history":[{"count":1,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1274\/revisions"}],"predecessor-version":[{"id":1277,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1274\/revisions\/1277"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}