Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

18 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 25 de febrero de 2025
Una lupa examinando de cerca opciones de configuración

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.

lunes, 24 de febrero de 2025
Arquitecto de SoundCloud trabajando en la modernización de su sistema

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...

.NET

martes, 18 de febrero de 2025
Un patito de goma al que se ha forzado a ser un coche

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.

lunes, 17 de febrero de 2025
Gandalf interrogado

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...

.NET

martes, 11 de febrero de 2025
Desarrollador trabajando con herramientas

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.

lunes, 10 de febrero de 2025
El equipo técnio de una empresa despidiéndose Azure Data Studio

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...

.NET

martes, 4 de febrero de 2025
Máquina compleja con piezas explotando

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.

lunes, 3 de febrero de 2025
Desarrollador construyendo una casa con Lego

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...

.NET Core / .NET