
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo solucionar el error "Unable to connect to web server 'IIS Express'" en Visual Studio
José María Aguilar - Renderizar una vista Razor a un string en ASP.NET Core MVC
José María Aguilar
.NET Core / .NET
- Free eBook: How to use Dapr for .NET Developers
Scott Hanselman - ICYMI C# 8 New Features: Simplify Array Access and Range Code
Jason Roberts - Experimenting with .NET 5 and 6 using Docker containers
Elton Stoneman - Multi-targeting a Roslyn analyzer
Gérald Barré - Generating HTTP API clients using Visual Studio Connected Services
Jon Galloway - How can I prevent a Windows Runtime WebView from loading any content beyond the initial request?
Raymond Chen - .NET 6 – Single file apps improved for Windows and Mac!
Bruno Capuano - How to create faster and smarter apps with .NET 5
Michael Crump - C#'s Functional Journey
Mads Torgersen - Using Streams with HttpClient to Improve Performance and Memory Usage
Marinko Spasojevic - Internals of the POH
Maoni Stephens - How to Debug Live .NET Application
Hasan Hasanov - C# 9.0: Pattern Matching in Switch Expressions
Thomas Claudius Huber
Estos contenidos se publican bajo una licencia de Creative Commons
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: enlaces

Ya hace tiempo que se lanzó .NET 5, pero seguro que algunos os habéis dado cuenta de que cuando desde Visual Studio creamos determinados tipos de proyecto, como bibliotecas de clases o proyectos de consola, por defecto éstos utilizan como target .NET Core 3.1 en lugar de .NET 5.
No se trata de un error; desde Microsoft justifican esta decisión porque .NET 5 no es una versión LTS, y prefieren que por defecto los proyectos sean creados usando una versión con mayor tiempo de soporte, como .NET Core 3.1.
Esto tiene fácil solución, porque tras crearlo simplemente deberíamos acceder a las propiedades del proyecto o editar el archivo .csproj
y modificar ajustar el target framework a nuestro antojo, pero, ¿cómo podríamos evitar tener que hacer esto cada vez?
Estos contenidos se publican bajo una licencia de Creative Commons

Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo invocar métodos estáticos C# desde Javascript con Blazor (interop 2/3)
José M. Aguilar - ¡Mi pantalla se ha puesto gris!
José María Aguilar
.NET Core / .NET
- Announcing .NET 6 Preview 1
Richard Lander - Cómo obtener el código fuente de cualquier programa o DLL escrita para .NET (C#)
José Manuel Alarcón - DotNet Boxed includes prescriptive templates for .NET Core
Scott Hanselman - ICYMI C# 8 New Features: Nested Switch Expressions
Jason Roberts - Correctly converting a character to lower/upper case
Gérald Barré - Packaging a Roslyn Analyzer with NuGet package references
Gérald Barré - .NET 5 Deterministic Builds & Source Linking
Mitchel Sellers - Pure functions and unused return values
Cezary Piątek - Cake Frosting: More Maintainable C# DevOps
Lee P Richardson - Introducing Spreadsheet Rich Cell Data Types for .NET Objects
Mackenzie Albitz - C# 9.0: Improved Pattern Matching
Thomas Claudius Huber - My Favorite C# Features - Part 1: Strong-types, Implicit-types, Anonymous-types, and Target-types
Jeffrey T. Fritz - Porting versus interop for .NET
Mark Heath
Estos contenidos se publican bajo una licencia de Creative Commons

Es frecuente que alumnos de mi curso de Blazor en CampusMVP me pregunten sobre la existencia de bibliotecas de componentes que les ayuden a desarrollar aplicaciones profesionales más rápidamente, por lo que no podía pasar por alto la noticia que publicaban hace unos días los amigos de Radzen en su cuenta de Twitter:
En efecto, ¡los componentes para Blazor de Radzen han pasado a ser open source y distribuidos bajo licencia MIT!
Para los que no los conozcan, Radzen es uno de los referentes en el mundo de las herramientas y componentes visuales para el desarrollo rápido de aplicaciones web, pero lo que nos ocupa ahora son el conjunto de más de 60 componentes visuales para Blazor Server y WebAssembly que ahora podremos utilizar de forma totalmente gratuita (bueno, aunque existen opciones para pagar por servicios de soporte profesional).
Estos contenidos se publican bajo una licencia de Creative Commons
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: blazor, blazorserver, blazorwasm, componentes

Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo invocar métodos estáticos C# desde Javascript con Blazor (interop 2/3)
José María Aguilar - ¿Es mi biblioteca portable a .NET Core?
José María Aguilar
.NET Core / .NET
- An Introduction to Channels in C# & What's the Difference between Channel<T> and ConcurrentQueue<T> in C#?
Jeremy Clark - C#/WinRT Authoring Preview and Updates
Angela Zhang - Polymorphic deserialization with System.Text.Json
Josef Ottosson - ICYMI C# 8 New Features: Simplify If Statements with Property Pattern Matching
Jason Roberts - Tiny top-level programs with C# 9 and SmallSharp and Visual Studio
Scott Hanselman - Better refactoring for Unity projects using .NET analyzers
John Miller - Staying safe with .NET containers
Richard Lander - Building A Custom Event Hubs Event Processor with .NET
Matt Ellis - Creating a Windows Service with C#/.NET5
Alexandre Zollinger Chohfi - How to Unit Test Existing C# Apps? Easy—With a Mocking Tool
Viktoria Grozdancheva
Estos contenidos se publican bajo una licencia de Creative Commons
Hoy voy a hablar de un cambio introducido en el framework hace ya algunos años, que, al menos en mi caso, pasó totalmente desapercibido en su momento y durante bastante tiempo después. Y he pensado que sería buena idea publicar sobre ello porque, como este mundo es así de grande, seguro que hay todavía algún despistado al que podría estar afectando a día de hoy y ni siquiera se ha dado cuenta :)
Como recordaréis, los atributos de validación [EmailAddress]
y [Url]
, presentes en el espacio de nombres System.ComponentModel.DataAnnotations
, los hemos utilizado durante años para asegurar que determinados valores de entrada eran direcciones de correo electrónico y URLs válidas, respectivamente:
public class Blog
{
[Required, EmailAddress]
public string ContactEmail { get; set; }
[Required, Url]
public string Url { get; set; }
}
Desde el principio de los tiempos, aún en ASP.NET "clásico", ambos atributos de validación utilizaban internamente complejas expresiones regulares para comprobar los valores, y la verdad es que funcionaban relativamente bien. Nuestras aplicaciones podían confiar en que valores que hubieran superado dichas validaciones serían, como mínimo, sintácticamente correctos y buenos candidatos a ser direcciones de correo o URLs válidas.
Pues bien, desde la llegada de NET 4.7.2, y luego en .NET Core, [EmailAddress]
y [Url]
ya no funcionan así. En palabras casi textuales del equipo de desarrollo, el objeto de estos dos atributos es simplemente prevenir algunos errores básicos al teclear, y no contemplar todas las posibilidades definidas en las respectivas RFC que describen la sintaxis de dichos valores.
Estos contenidos se publican bajo una licencia de Creative Commons

Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- ¿Se pueden desarrollar aplicaciones ASP.NET Core con Visual Basic .NET?
José María Aguilar - Cómo invocar funciones Javascript desde Blazor (interop 1/3)
José María Aguilar - Más velocidad de carga y mejor SEO en tus apps Blazor WebAssembly mediante prerrenderización
José María Aguilar
.NET Core / .NET
- What I Learned About C# From Job Interviews
Michael Shpilt - ICYMI C# 8 New Features: Write Less Code with Using Declarations
Jason Roberts - Create Anonymous Data Object With AutoFixture From Type
Adam Storr - Tracing IO in .NET Core
Jonathan Channon - A C# Implementation of McCarthy’s Ambiguity Operator
Jorge L Orejel - Substring in C#
Mahesh Chand - Developer's Cheat Sheet for C# 9.0
Franco Tiveron - My mental model of Span, Memory and ReadOnlySequence in .NET
Szymon Kulec - Command Line Parser on .NET5
Alexandre Zollinger Chohfi - Common Files In A .NET Solution
Khalid Abuhakmeh
Estos contenidos se publican bajo una licencia de Creative Commons

El parser de Blazor de versiones anteriores a la 5.0 era bastante permisivo con los espacios no significativos que los desarrolladores dejamos a la hora de escribir nuestro código de marcado. Es decir, todos los espacios incluidos en el código fuente, fueran importantes o no para el resultado final, formaban parte del proceso de renderización y, por tanto, trasladados tal cual al navegador.
Entendemos por espacio no significativo aquél carácter espacio, tabulador, saltos de línea o similares que el navegador no va a representar visualmente al componer la página. Por ejemplo, un marcado como "<h2>1 2</h2>
" suele representarse en el browser exactamente igual que si hubiéramos enviado "<h2>1 2</h2>
" (salvo que hayamos usado reglas CSS específicas en dirección contraria), porque todos los espacios intermedios son ignorados.
Estos contenidos se publican bajo una licencia de Creative Commons

Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Autenticación JWT en APIs con ASP.NET Core
José María Aguilar - Cómo mostrar y ocultar elementos en Blazor
José María Aguilar
.NET Core / .NET
- ICYMI C# 8 New Features: Switch Expressions
Jason Roberts - PostSharp's Great Reset: Announcing Project "Caravela", a Roslyn-based aspect framework
Gael Fraiteur - .NET 5: How to enable .NET 5 runtime on console apps instead of .NET Core 3.1 ?
Anthony Giretti - Simplifying paths handling in .NET code with the FullPath type
Gérald Barré - Choosing a ServiceLifetime
Jimmy Bogard - Using C# Source Generators to create an external DSL
Luca Bolognese - Chromium WebView2 Control and .NET to JavaScript Interop
Rick Strahl
Estos contenidos se publican bajo una licencia de Creative Commons

El desarrollo de EF6.TagWith lo comencé hace algo más de un año, cuando escribía para el blog lo interesante que me parecía el extensor TagWith()
de Entity Framework Core y me preguntaba por qué no existía algo similar para Entity Framework 6.x.
Como recordaréis, la idea era traer a EF "clásico" la posibilidad de añadir a consultas realizadas desde C# un comentario o etiqueta que después podría ser fácilmente visible en trazas, como las proporcionadas por SQL Server Profiler o herramientas de análisis de rendimiento.
No pensé que existieran muchos desarrolladores a los que pudiera interesar, pero con el tiempo esto me ha servido para confirmar que cualquier aportación a la comunidad, por pequeña que sea, puede ayudar a un buen número de personas.
A día de hoy, y por increíble que parezca, este pequeño y humilde paquetito ha sido instalado más de 6.000 veces, con una media de 10 descargas al día, y ha recibido issues y pull requests de desarrolladores que han decidido contribuir a su mejora a través del sitio del proyecto en GitHub. Impresionante.
Pues bien, por fin he podido dedicar un rato a actualizarlo y he publicado su versión 1.2.1. Esta revisión soluciona algunos errores menores y problemas de compatibilidad con proyectos .NET Framework 4.5, además de incluir un par de novedades fruto del feedback recibido de sus usuarios, que describimos a continuación.
Estos contenidos se publican bajo una licencia de Creative Commons

Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Probar scripts en producción sin desplegar nada, y otros usos interesantes de Fiddler
José María Aguilar - Cómo personalizar el mensaje "Loading" de las aplicaciones Blazor WebAssembly
José María Aguilar
.NET Core / .NET
- Introducción a los registros (record) y los objetos inmutables de C# 9
Rubén Rubio - AutoFixture and .NET 5.0 Record Types
Adam Storr - Be Carefull With ZipArchive
Hasan Hasanov - Deep Dive into Open Telemetry for .NET
Muhammad Rehan Saeed - The Many Flavors of .NET
Sean Killeen - Best 20 C# & .NET Blogs
Seb Nilsson - How to use configuration with C# 9 top-level programs
Dave Brock - Flatten Strings with Regex.Replace
Khalid Abuhakmeh - .NET GC Internals mini-series
Konrad Kokosa - Find Prime Numbers With C# 9
Khalid Abuhakmeh
Estos contenidos se publican bajo una licencia de Creative Commons

Leyendo las novedades de C# 9, hay una que pasa casi completamente desapercibida pero que me ha llamado la atención: la posibilidad de convertir prácticamente cualquier tipo en enumerable.
La magia consiste en que, a partir de esta versión, se podrá recorrer con un foreach
objetos que, o bien implementen IEnumerable
o directamente el conocido GetEnumerator()
, como lo hacen los arrays o strings, o bien existe un método extensor con el mismo nombre declarado sobre el tipo.
Estos contenidos se publican bajo una licencia de Creative Commons

Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cancelación de peticiones en ASP.NET Core y MVC
José María Aguilar - Componentes con cuerpo en Blazor
José María Aguilar
.NET Core / .NET
- Todo sobre los archivos .PDB: qué son y por qué se generan siempre al compilar una aplicación .NET
José Manuel Alarcón - .NET Worker Service: Working Hard So You Don’t Have To
Richard Reedy - Capitalize First Letter Of Words With C#
Khalid Abuhakmeh - Blank Zero Values in .NET Number Format Strings
Rick Strahl - .NET 5 Networking Improvements
Máňa Píchová - Migrating RealProxy Usage to DispatchProxy
Mike Rousos - Diagnostics improvements in .NET 5
Sourabh Shirhatti - Go (golang) Multiple Return Values
Jeremy Clark - Azure Active Directory's gateway is on .NET Core 3.1!
Avanindra Paruchuri - Happy 10th Birthday, NuGet!
Christopher Gill - Here's a One-Stop Shop for .NET 5 Improvements
David Ramel - How to configure your custom roslyn analyzer using an .editorconfig file
Carlos Pons - Taking the new Chromium WebView2 Control for a Spin in .NET
Rick Strahl - My preferred .NET console stack
Mattias Karlsson - Quick tip: listing global dev tools and extensions
Mark Heath
Estos contenidos se publican bajo una licencia de Creative Commons

Pues parece que por fin hemos conseguido quitarnos de encima el nefasto 2020, y afrontamos un nuevo año con la esperanza de que sea, al menos, algo mejor que el anterior. Os deseo a todos que así sea; sobre todo que la salud os acompañe a vosotros y los que os rodean, y que esto permita que seáis felices tanto en lo personal como en lo profesional.
Y dicho esto, llega la hora de acudir a las tradiciones: el repaso de los posts más visitados durante el año que acabamos de dejar atrás, donde, como podemos ver, Blazor ha entrado con bastante fuerza :)
Top ten 2020 en Variable not found
Comenzando por el décimo puesto, encontramos el post cómo mostrar el número de usuarios conectados a una aplicación Blazor Server, en tiempo real, un interesante ejercicio que nos ayudaba a comprender cómo funcionan los circuitos de Blazor Server y cómo sacar partido a los componentes internos que nos permiten introducirnos en su ciclo de vida.
La novena posición la ocupa nuestro amigo Mario, protagonista del post incluir recursos estáticos en una Biblioteca de Clases Razor (RCL), donde lo usábamos para crear un componente Razor reutilizable que mostraba al simpático personaje correteando por la pantalla.
Continuamos con Blazor gracias a la serie sobre los mecanismos de interoperación con Javascript de este framework. En concreto, el post Cómo invocar métodos de instancia C# desde Javascript con Blazor es el que más vistas ha tenido, probablemente por su atractiva propuesta ;)
La posibilidad de publicar aplicaciones .NET Core en modo auto-contenido y en un único archivo no ha pasado desapercibida para los lectores del blog. Por ello, el post publicación self-contained y single-file en .NET Core, aparece ocupando la séptima posición del ranking anual.
Muy cerca del anterior en número de visitas, encontramos la respuesta a una pregunta relativamente frecuente a la hora de desarrollar aplicaciones .NET: ¿Usar try/catch
es malo para el rendimiento?. Una respuesta con demostración incluida, gracias al imprescindible BenchmarkDotnet.
La basura que va dejando en vuestro equipo las distintas versiones y revisiones de .NET Core conforme evoluciona el producto también parece haberos preocupado o, al menos, os ha llamado la atención. La aparición de una herramienta para limpiarlas fácilmente fue el detonante para escribir el post desinstala fácilmente versiones antiguas de .NET Core con "dotnet-core-uninstall".
AddMvc(), AddControllers(), AddControllersWithViews(), AddRazorPages()... ¿qué es todo eso?, ya en quinta posición de la lista, intentaba aclarar qué eran esos nuevos métodos que aparecían en el intellisense a la hora de registrar los servicios de MVC o Razor Pages a partir de la llegada de ASP.NET 3.0.
En tercera y cuarta posición respectivamente encontramos dos post muy relacionados. En el primero de ellos, describiendo APIs ASP.NET Core con Swagger, veíamos los conceptos básicos de OpenAPI y el uso de Swashbuckle para describir nuestras APIs creadas con ASP.NET Core. En el segundo, cómo documentar y generar código cliente de nuestras APIs utilizando Swagger/OpenAPI, revisábamos cómo sacar partido de dicha descripción, generando automáticamente la documentación de la API e incluso código cliente para acceder a ella.
A cierta distancia de los anteriores, ya en segundo puesto, tenemos la solución a un error que frecuentemente encontramos al desarrollar aplicaciones ASP.NET Core con Visual Studio e IIS Express. El post cómo solucionar el error "Unable to connect to web server 'IIS Express'" en Visual Studio describe paso a paso qué hacer cuando nos topamos con este incómodo inconveniente al ejecutar las aplicaciones.

Y por último, el indiscutible vencedor del año: ¿qué es Blazor, eso de lo que todo el mundo habla?. Este post intentaba despejar dudas en un momento en el que la palabra "Blazor" empezaba a sonar más de la cuenta y a despertar el interés de muchos desarrolladores, entre los que, por supuesto, me incluyo.
Para acabar, me gustaría también hacer una mención especial a ¡Toma las riendas! ¡Conviértete en Desarrollador 10x Certificado!, el post publicado el 28 de diciembre que, si bien no ha conseguido entrar en el ranking, se ha quedado bien cerca a pesar de haber tenido pocos días para acumular visitas. Me he divertido mucho escribiéndolo, leyendo las respuestas y comentarios que me han llegado por diversas vías, y comprobando que algunos incluso habéis traducido los textos en japonés para ver qué ponía :D
¡Vamos a por 2021!
Publicado en Variable not found.
Estos contenidos se publican bajo una licencia de Creative Commons