
Si lleváis algunos años en esto, seguro recordaréis que en ASP.NET "clásico", los settings de las aplicaciones eran valores inmutables. Se guardaban habitualmente en el célebre archivo Web.config
, y cualquier cambio a este archivo implicaba reiniciar la aplicación para que los cambios tuvieran efecto.
En ASP.NET Core, los settings son mucho más flexibles: se pueden cargar desde diferentes orígenes, pueden almacenarse en distintos formatos, y es posible modificarlos en caliente sin necesidad de reiniciar la aplicación. Pero además, ofrecen otra capacidad que es interesante conocer: podemos detectar y reaccionar a cambios en los settings en tiempo real, es decir, en el mismo momento en que se producen.
Para ello, básicamente tendremos que bindear una clase personalizada a la sección de settings que nos interese, y luego utilizar la interfaz IOptionsMonitor
, para registrar un manejador personalizado que se ejecute cada vez que se produzca un cambio en los valores de configuración que estamos monitorizando.
En este post vamos a ver cómo hacerlo, paso a paso.
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: .net, aspnetcore, trucos

Un lunes más, ya tenemos aquí la colección de enlaces a contenidos interesantes recopilados durante la semana pasada. Como de costumbre, encontramos lecturas sobre .NET, ASP.NET Core, Blazor, IA, datos, frontend, JavaScript, TypeScript, MAUI y otros temas que espero os aporten algo 🙂
En esta ocasión, me gustaría destacar algunos de los artículos de la semana que más me han llamado la atención.
Primero, una nueva demostración de la velocidad brutal con la que se van produciendo avances tecnológicos de escala: la presentación por parte de Microsoft de Majorana 1, el nuevo chip que, según anuncian, adelantará el uso real de computación cuántica a unos años, en lugar de las décadas que estaban previstas.
También me ha resultado interesante el post sobre cómo SoundCloud evolucionó su su arquitectura utilizando BFF, microservicios y DDD. Estos contenidos basados en experiencias reales suelen ser bastante inspiradores.
Toda seguridad es poca, por lo que siempre es recomendable volver a echar un vistazo a las guías OWASP sobre cómo asegurar nuestras aplicaciones web full-stack.
Por último, es impresionante leer las mejoras que se van introduciendo en Visual Studio, especialmente las que hacen que el IDE sea cada vez más inteligente y, por tanto, nosotros seamos cada vez más productivos. En esta entrega, encontramos el soporte para tool calling en Copilot, y la información sobre el código usado como referencia para los autocompletados.
El resto, a continuación...
Por si te lo perdiste...
- Cambiar el nombre de la carpeta raíz de las páginas en Razor Pages
José M. Aguilar - Adivina, adivinanza: ¿por qué no compila este código?
José M. Aguilar
.NET
- IEnumerable vs IEnumerator in C#: One is 2x Faster
Steven Giesel - Understanding Garbage Collection - How the dotnet Garbage Collector Works
Darren Horrocks - The Curious Case of .NET ConcurrentDictionary and Closures
Khalid Abuhakmeh - How to Convert Word to PDF in C# with Advanced Formatting Options
Mohanaselvam Jothi - Leveraging Tuples in C#: Real-World Use Cases
Ali Hamza Ansari - Writing a .NET Garbage Collector in C#
Kevin Gosse - Killing a Worker Application from a BackgroundService
Bryan Hogan - Microsoft .NET Code Analysis: Optimizing Byte-to-Hex Conversions
David McCarter - Retrieving Images from the Clipboard Reliably in WPF Revisited
Rick Strahl

Imaginad que tenemos un objeto clase Coche
y otro del tipo PatitoDeGoma
, sin ningún tipo de relación entre ellos. C# no permite hacer un cast y convertir libremente de uno a otro tipo o viceversa, ¿verdad?
Pues eso pensaba yo también, hasta que hace poco descubrí una característica de .NET que no he usado nunca y dudo que vaya a usar 😝, pero me ha parecido de lo más curiosa y quería compartirla con vosotros. Como podréis comprobar, es una buena candidata para la serie C# bizarro, de la que ya llevamos varias entregas, aunque en realidad se trata de una característica de la plataforma y no del lenguaje.
La protagonista es la clase estática System.Runtime.CompilerServices.Unsafe
, que, según indican en la documentación oficial, implementa funcionalidades de bajo nivel para manipular punteros gestionados y no gestionados. Su objetivo, según esta misma fuente, es permitir a desarrolladores de bibliotecas escribir código de alto rendimiento evitando los chequeos de seguridad de .NET.
Esta clase proporciona métodos de aritmética de punteros, conversión de tipos y otras operaciones que no son seguras en C# y que, por tanto, no se permiten salvo en contextos unsafe
. Sin embargo, en ocasiones, puede ser útil para realizar operaciones que no son seguras pero que sabemos que no van a causar problemas en tiempo de ejecución.
El que más me ha llamado la atención ha sido el método As()
, que permite forzar un cast entre dos tipos que a priori no son compatibles sin realizar comprobaciones de tipo en tiempo de ejecución.

Aquí tenemos la colección semanal de enlaces a contenidos interesantes relacionados con el desarrollo de software con C#, ASPNET, Blazor, JavaScript, CSS, Azure, AI, .NET MAUI, Visual Studio y otros.
Por destacar, esta semana encontramos un interesante post de Ricardo Peres donde nos cuenta qué eso de OpenTelemetry, cómo enviar datos de telemetría desde aplicaciones ASP.NET Core, y cómo recopilarlos y consultarlos usando herramientas como Grafana, Loki, Tempo y Prometheus a través de una imagen de Docker. Imperdible.
También me ha parecido curioso Gandalf, el juego al que llego a través del post de Bart Wullems, que nos permite comprobar nuestras habilidades para manipular un LLM usando inyección de prompts. Sin duda, da para un buen rato de maldad y diversión 😉
El resto, a continuación. ¡Espero que os resulten interesantes!
Por si te lo perdiste...
- ¿Acceder a miembros privados de una clase C# sin usar reflection? ¡En .NET 8 es posible!
José M. Aguilar - Flushing asíncrono en ASP.NET Core MVC
José M. Aguilar
.NET
- Microsoft.Testing.Platform: Now Supported by All Major .NET Test Frameworks
Amaury Levé - Using .NET on Linux
Bryan Hogan - Unlocking delegate's potential in C#
Ali Hamza Ansari - Writing a .NET Garbage Collector in C#, part 3
Kevin Gosse - Why Large JSON Objects Are Slowing Down Your .NET Application (And How to Fix It)
Hossein Kohzadi - C# Dictionary: How to Create One and Best Practices
Stackify Team - Exploring the .NET Ecosystem: A Visual Mind Map
Abhijit Jana

Desde que se introdujo en Visual Studio el soporte para archivos .http
, he estado usando esta funcionalidad del IDE para probar APIs, dejando casi totalmente de lado a herramientas que había utilizado siempre como Postman o Fiddler. Es genial tenerlo todo en el mismo entorno, que sea tan sencillo de utilizar, y que se integre tan bien con otras herramientas del ecosistema, como el endpoint explorer, user secrets de ASP.NET Core, Azure key vault, etc.
Sin embargo, una limitación importante era que sólo podíamos declarar y asignar variables, pero éstas no podían ser modificadas en tiempo de ejecución. Esto hacía que, por ejemplo, no pudiéramos hacer una llamada a un endpoint de autenticación y utilizar luego el token retornado para acceder a determinados recursos, por lo que teníamos que hacerlo manualmente.
Pero esto cambió con la versión 17.12 de Visual Studio 2022, donde se ha añadido la posibilidad de poder capturar valores de la respuesta de una petición para utilizarlos más adelante en otras peticiones.

Ya está disponible la entrega semanal número 596 de la serie, donde, como de costumbre, podéis encontrar decenas de links a contenidos que he ido recopilando durante la semana y considero interesantes sobre .NET, ASP.NET Core, Blazor, acceso a datos, inteligencia artificial, programación en frontend, herramientas y otros temas.
En esta ocasión, lo que me más ha llamado la atención es la retirada de Azure Data Studio. Ahora que estaba empezando a tenerle cariño a esta herramienta para gestionar mis bases de datos SQL Server, resulta que la van a discontinuar en favor de la extensión MSSQL extension de Visual Studio Code.
¿Sabíais que la media de tiempo que se tarda en volver a concentrarse en una tarea después de una interrupción es de 23 minutos? Muy interesante el artículo de Milan Milanović sobre cómo los cambios de contexto, o context switching, afectan a la productividad de los desarrolladores. Aunque cualquiera que se dedique al desarrollo ya lo ha sentido en sus carnes, es interesante leer un análisis más profundo sobre el tema.
Vale la pena echar también el vistazo a las reflexiones de Tim O'Reilly sobre cómo afectará la irrupción de la IA en el trabajo de los desarrolladores. ¿Iremos todos a la calle? ¿O, por el contrario, se abrirán nuevas oportunidades? Spoiler: la clave es adaptarse.
El resto de enlaces, a continuación...
Por si te lo perdiste...
- TimeProvider: el proveedor de tiempos de .NET 8
José M. Aguilar - Acceder a IIS Express desde otro equipo de la red local
José M. Aguilar
.NET
- Why Tracebit is written in C#
Sam Cox - Modelling data relationships with C# types
Mark Seemann - Timers, Finalizers and Memory Leaks
Sergey Teplyakov - Supporting multiple .NET SDK versions in a source generator
Andrew Lock - Vogen and Value Objects with C# and .NET
Khalid Abuhakmeh - Writing a .NET Garbage Collector in C#
Kevin Gosse - Migrate from MSTest to xUnit using a Roslyn analyzer
Gérald Barré - Numeric sorting in .NET
Anthony Simmon - How to Protect Word Documents in C#: Step-by-Step Guide
Mohanaselvam Jothi - .NET 9 Networking Improvements
Máňa & Natalia Kondratyeva & Anton Firszov - LINQ MindMap: .NET 10 Edition
Steven Giesel

Como sabemos, es muy sencillo implementar servicios en segundo plano alojados en el interior de aplicaciones ASP.NET Core porque el framework nos proporciona infraestructura que simplifica la tarea, permitiendo que nos enfoquemos en la lógica de negocio que queremos ejecutar en background en lugar de tener que preocuparnos de los aspectos de más bajo nivel necesarios para hacer que funcione.
En la práctica, basta con heredar de la clase BackgroundService
y sobreescribir el método ExecuteAsync
para implementar la lógica que queremos ejecutar en segundo plano. Por ejemplo, el siguiente servicio se encarga de escribir un mensaje en la consola cada segundo:
public class MyBackgroundService : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
Console.WriteLine($"Current time: {DateTime.Now:T}");
await Task.Delay(1000, stoppingToken);
}
}
}
Luego tendríamos registrar este servicio en el contenedor de dependencias de ASP.NET Core, de forma que el framework lo detectará automáticamente y lo lanzará cuando la aplicación sea iniciada:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHostedService<MyBackgroundService>();
...
Al ejecutar, veremos que, en la consola donde hemos lanzado la aplicación, se escribirá periódicamente la hora desde la tarea en segundo plano:
Current time: 13:34:06
info: Microsoft.Hosting.Lifetime[14]
Now listening on: https://localhost:7080
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5148
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: D:\Projects\BackgroundServiceCrash
Current time: 13:34:07
Current time: 13:34:08
Pero bueno, no es esto de lo que quería hablar, sino de lo que ocurre cuando en uno de estos servicios en segundo plano se produce un error... porque ojo, que si no tenemos cuidado puede tumbar completamente nuestra aplicación.

Estrenamos febrero con la recopilación número 595 de enlaces interesantes, cargado de contenidos variados y de calidad relacionado con el desarrollo de software: .NET, ASP.NET, Azure, conceptos, patrones y buenas prácticas, IA, programación web (HTML, CSS, Javascript, frameworks), Visual Studio y herramientas, .NET MAUI, y otros.
Sin duda, la sorpresa y gran protagonista de la semana ha sido el lanzamiento de DeepSeek R1, la IA open source que ha puesto patas arriba a los que hasta ahora se consideraban los reyes del mambo, demostrando que China compite en primera división de los modelos generativos.
También es interesante echar un vistazo bajo el capó de los navegadores, a los mecanismos encargados de interpretar los para interpretar el código HTML y CSS que les llega y crear su representación visual. Aditya Bhattacharya nos lo cuenta el artículo HTML & CSS Deep Dive Part 1: How Browsers Make Sense of Your Code.
Sergey Teplyakov nos recuerda en el post The Dangers of Async Void lo peligroso que puede ser crear métodos o funciones async void
en C#, una práctica que puede llegar a tumbar por completo una aplicación.
El amigo Braulio Díez vuelve con sus historias para no dormir, con el artículo Las migraciones tienen veneno, una visión práctica y realista de lo que hay detrás de estos proyectos que, aunque a primera vista pueden parecer sencillos, tienen bastantes trampas ocultas.
Por último, desde CampusMVP nos llega un post que abre los ojos sobre la realidad del open source: ¿es gratis? ¿quién lo mantiene? ¿quién contribuye? ¿Es sostenible? Muchas preguntas interesantes a las que podremos dar respuesta en el post y vídeo donde José Manuel Alarcón y Jorge Turrado debaten sobre el tema.
El resto de enlaces, a continuación 🙂
Por si te lo perdiste...
- ¡No guardes como cadena el resultado JSON de la llamada a una API si lo único que quieres hacer es deserializarla!
José M. Aguilar - Personalizar la negociación de contenidos en ASP.NET Core MVC
José M. Aguilar
.NET Core / .NET
- When will .NET Framework retire?
Steven Giesel - Implementing AES Encryption With C#
Milan Jovanović - How Fast is Microsoft C#? Discover the Advantages
Dave Ward - Moving from .NET 6 to 8
Joao Correia - Supporting multiple .NET SDK versions in analyzers and source generators
Andrew Lock - The New LINQ Methods from .NET 6 to .NET 9
Anton Martyniuk - Writing a .NET Garbage Collector in C#
Kevin Gosse - The Dangers of Async Void
Sergey Teplyakov - Useful New-ish Features in .NET/C#
David Ramel