Por si te lo perdiste:
- 10 razones por las que tu blog te ayuda a encontrar empleo
José María Aguilar - Redirecciones HTTP 303, 307 y 308: ¿las conoces?
José María Aguilar
.NET / .NET Core
Scripts to remove old .NET Core SDKs
Scott Hanselman- Async pitfalls: deferred work and resource ownership
Ian Griffiths - Asynchronous functors
Mark Seemann - "ImageResizer" is now "dotnet srcset"
Steve Desmond - Getting the date of build of a .NET assembly at runtime
Gérald Barré - How to generate a zip containing the user personal data to be GDPR compliant in .Net Core 2.1.
Silvia Campo - A command-line REPL for RESTful HTTP Services
Scott Hanselman - [.NET Internals 09] Just-In-Time (JIT) compilation
Dawid Sibiński - C# Intermediate - Static Members in C# & Anonymous and Nullable Types in C#
Marinko Spasojevic - Performance in .NET – Part 1
Ricardo Peres - How Microsoft rewrote its C# compiler in C# and made it open source
Mads Torgersen
Publicado por José M. Aguilar a las 9:15 a. m.
Etiquetas: enlaces
Básicamente, la duda era la siguiente:
¿Hay alguna forma sencilla de añadir el atributo [Authorize]
, pero sólo a los controladores que se encuentren en una carpeta determinada del proyecto, sin tener que aplicarlo uno a uno?
La respuesta rápida es: sí. Bueno, con matices ;) Incluso hay varias opciones, así que vamos a ver algunas de ellas, y de paso repasamos conceptos de ASP.NET Core MVC :)Por si te lo perdiste:
- Extendiendo claims de usuarios en ASP.NET Core
José María Aguilar - ¿Se pueden desarrollar aplicaciones ASP.NET Core con Visual Basic .NET?
José María Aguilar
.NET / .NET Core
- Announcing .NET Framework 4.8 Early Access build 3646
Jamshed Damkewala - Announcing Cumulative Updates for .NET Framework for Windows 10 October 2018 Update
Brett Lopez - Implementing Self-Organizing Maps with .NET Core
Nikola Živković - C# Intermediate - Properties in C#
Marinko Spasojevic - C# 8 Small Features
Jonathan Allen - C# Special Method Names
Ricardo Peres - .NET Core Opinion
K. Scott Allen - Introduction to ANNdotNET v1.0 deep learning tool on .NET Platform
Bahrudin Hrnjica - Avoid Logging in Low-Level Code
Mark Heath

Hoy en día, salvo en contadas ocasiones, ha dejado de tener sentido invertir demasiado tiempo en estas labores. Tenemos máquinas potentes, con micros cuya velocidad se mide en GHz capaces de ejecutar bastantes tareas de forma concurrente, y muchos Gigabytes libres de memoria RAM en los que guardar información. Además, los frameworks actuales como .NET permiten despreocuparse de asuntos como la reserva o liberación de memoria porque ya hay sistemas de más bajo nivel que se encargan de eso por nosotros.
Indudablemente es un gran avance, pero esto ha llevado a que, con el tiempo, se nos esté atrofiando ese sentido arácnido que antes nos disparaba las alertas cuando cierto código podía ser optimizado para consumir menos recursos.
En la mayoría de escenarios, y sobre todo cuando trabajamos en entornos empresariales, aplicaciones de escritorio o webs de poca carga, está bien así. Sin embargo, es cierto también que las necesidades han cambiado.
Por ejemplo, ahora creamos frecuentemente aplicaciones mucho más complejas que pueden ser utilizadas a través de Internet por miles de usuarios de forma simultánea y todos ellos esperan respuestas rápidas. Estas aplicaciones se ejecutan en servidores cuyos recursos son compartidos entre todos los usuarios que pueden llegar a tener un coste importante y debemos exprimir al máximo. Aquí, y en otros escenarios similares, es donde aparece de nuevo la necesidad de introducir optimizaciones en el código.
En este post vamos a hacer una introducción al uso de BenchmarkDotNet, una magnífica herramienta que nos permitirá medir el rendimiento de nuestro código .NET para hacerlo más eficiente en términos de uso de procesador y memoria.
Pero antes de empezar, no olvidéis la famosa frase de Donald Knuth:
“Los programadores consumen una gran cantidad de tiempo pensando, o preocupándose, sobre la velocidad de partes no críticas de sus programas, y esos intentos de mejorar la eficiencia tienen posteriormente un gran impacto negativo sobre la facilidad de depuración o mantenimiento. Deberíamos olvidarnos de las pequeñas mejoras de eficiencia, digamos en un 97% de los casos: la optimización prematura es el origen de todos los males. Sin embargo, no debemos dejar pasar la oportunidad de mejorar ese crítico 3% restante”
Publicado por José M. Aguilar a las 8:30 a. m.
Etiquetas: netcore, netframework, rendimiento, trucos
Y para celebrarlo, nada mejor que un buen puñado de enlaces recopilados durante la semana pasada que, como siempre, espero que os resulten interesantes. :-)
.NET / .NET Core
- .NET Core September 2018 Update
Lee Coward - .NET Framework September 2018 Security and Quality Rollup
Tara Overfield - .NET Core Opinion - Structuring a repository & Managing a repository structure
K. Scott Allen - How to (really) migrate from .NET Core 2.0 to 2.1
Jelly Hive - How do you use System.Drawing in .NET Core?
Scott Hanselman - Writing a JIT Compiler in C# | Mono
Ludovic Henry, Miguel de Icaza, Aleksey Kliger, Bernhard Urban & Ming Zhou - Announcing ML.NET 0.5
César de la Torre - C# 8 Concerns
Ben Bowen
Durante las próximas semanas dejaré el blog a merced de las olas, pues estaré disfrutando con la familia en las maravillosas playas de Cádiz: sol, paseos, refrescantes bañitos en las aguas del Atlántico y chiringuitos playeros con aroma a pescado fresco. Un buen plan, sin duda ;)

Imagen original
Nos vemos a la vuelta, ya en el mes de septiembre, con la batería al 100% y listos para seguir buscando la variable ;)
¡Felices vacaciones a todos!
Publicado con ánimo vacacional en Variable not found.
Lo habitual es echar mano de los status code de HTTP para indicar problemas en el proceso de una petición; de hecho, este protocolo dispone de un rico conjunto de códigos que en principio parecen cubrir todas nuestras necesidades.
Pero no siempre es así. Por ejemplo, si tenemos un servicio que permite a los clientes de una empresa formalizar un pedido a través de un API y una llamada a este servicio retorna un error HTTP 403 (forbidden), claramente estamos indicando que el solicitante no tiene permisos para hacer un pedido. Sin embargo, no tenemos una forma clara de indicar cuál es la causa de esta prohibición (¿quizás las credenciales no son correctas? ¿o quizás el cliente no tiene crédito en la empresa? ¿o puede ser que el administrador lo haya denegado expresamente?)
Para aportar más detalles sobre el problema, normalmente necesitaremos retornar en el cuerpo de la respuesta información extra usando estructuras o formatos personalizados, probablemente distintos de una aplicación a otra, y documentarlos apropiadamente para que los clientes puedan entenderlos. Y aquí es donde entra en juego el estándar “Problem details”.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
.NET / .NET Core
- Pipelines - a guided tour of the new IO API in .NET, part 1
Marc Gravell - Prepare Visual Basic for Conversion to C#
Paul D. Sheriff - What C# can learn from Haskell: Pipe Operator
Daniel Cabtree - Optimising Image Processing
Indy Singh - Debugging through the .NET Core framework using VSCode (e.g. on Linux)
Vance Morrison - Create and Pack Reference Assemblies
Oren Novotny - C# 8: Pattern Matching Extended
Christian Nagel - Machine Learning with ML.NET – Solving Real-World Classification Problem (Wine Quality)
Nikola Živković - The Case For .Net Monkey Patching In 2018
Khalid Abuhakmeh - Using global tool “dotnet outdated” to check for the latest NuGet package updates
Shayne Boyer - Sending email in .NET Core with FluentEmail
Luke Lowrey* - The whole of WordPress compiled to .NET Core and a NuGet Package with PeachPie
Scott Hanselman - .NET JIT and CLR - Joined at the Hip
Matt Warren
ASP.NET Core 2.1 continúa profundizando en esa línea e incluye entre sus novedades el nuevo atributo
[ApiController]
, un decorador aplicable a controladores que los identifica como puntos de entrada de APIS, aplicando de forma automática una serie de convenciones bastante útiles a la hora de crear este tipo de componentes:[ApiController]
[Route("api/[controller]")]
public class ValuesController : ControllerBase
{
...
}
Fijaos que, a diferencia de ASP.NET Web API (.NET Framework), se ha optado por utilizar un atributo en lugar de emplear herencia (en aquél framework existía la clase ApiController
).
A continuación veremos qué debemos tener en cuenta a la hora de aplicar este atributo a nuestros controladores y qué convenciones son las que estaremos asumiendo al utilizarlo.
Publicado por José M. Aguilar a las 8:55 a. m.
Etiquetas: aspnetcore, aspnetcoremvc, novedades, webapi
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
.NET / .NET Core
- Introducing .NET Core 2.1 Flagship Types: Span<T> and Memory<T>
Ahson A. Khan - Garbage collection, a memorandum on memory in C#
Carmel Eve - Using Flurl to easily build URLs and make testable HttpClient calls in .NET
Scott Hanselman - Machine Learning with ML.NET – Solving Real-World Regression Problem (Bike Sharing Demands)
Nikola Živković - Analyzing .NET Core project dependencies: Finding transitive dependencies
Jerrie Pelser - Deserializing different JSON structures to the same C# class
Jerrie Pelser - Using GOTO in C#
Ayende Rahien - Dynamic Binding in C#
Damir Arh - .NET Core and Docker
Scott Hanselman
Son ya ocho años consecutivos y debería haberme acostumbrado a este subidón de primeros de julio, pero, como no suelo ser consciente de que ha llegado el día de los nombramientos, sigo recibiendo el conocido email de nombramiento casi con la misma emoción que aquella primera vez en que me pilló completamente desprevenido.
Muchas gracias a todos vosotros, amigos y amigas de Variable not found, porque si estoy aquí es porque me habéis regalado vuestro incondicional apoyo durante todos estos años.
Muchas gracias también al equipo del programa MVP en Microsoft y, en particular, a nuestra querida MVP lead Cristina González, por el gran trabajo que realizan.
Muchas gracias todos los que dedicáis vuestro tiempo la comunidad, seáis MVP o no, porque hacéis posible que todos aprendamos y mejoremos un poco más cada día.
Y, por supuesto, muchas gracias también a mi mujer e hijas, Inma, Inmita y María, porque ellas son las que permiten, con su infinita paciencia y comprensión, que pueda dedicar a mi pasión por el software más de lo que estrictamente requieren mis obligaciones profesionales.
Aprovecho también para enviar mi enhorabuena a los MVP renovados recientemente, y un caluroso abrazo de bienvenida a los que lo han sido por primera vez (es un momento muy bonito, ¡disfrutadlo!)
Sólo espero estar a la altura de esta distinción, compartida con gente de todo el mundo a la que admiro tanto personal como profesionalmente, y entre los que me enorgullezco de contar con grandes amigos. Y ahora, con esta dosis extra de motivación, ¡a seguir trabajando!

Publicado en Variable not found.
@helper
para crear porciones de HTML reutilizables en el interior de nuestras vistas, tanto para conseguir un código más limpio como para abrazar el principio DRY (Don’t Repeat Yourself), tan frecuentemente apaleado en la capa de presentación.Recordaréis que esta directiva permitía crear “funciones” en cuyo interior podíamos escribir código Razor (mezclando marcado y C#) que podía ser invocado desde distintos puntos:
@* File: Test.cshtml *|
@Multiplication(2)
@Multiplication(3)
@helper Multiplication(int x)
{
<h2>Multiplication table of @x</h2>
<ul>
@for (var i = 1; i <= 10; i++)
{
<li>@x * @i = @(x * i)</li>
}
</ul>
}
Además de definirlos y consumirlos desde la misma vista, también era posible crear helpers globales introduciéndolos en App_Code
, aunque esta opción me gustaba menos y creo que no la utilicé jamás en aplicaciones reales.
Pues bien, por algunas extrañas razones, en ASP.NET Core la directiva @helper
no está disponible, lo que puede complicarnos un poco a la hora de portar vistas antiguas o, simplemente, cuando queramos usarla para mejorar la legibilidad de nuestro código.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
.NET / .NET Core
- NET Core 2.0 will reach End of Life on
September 1October 1, 2018
Rich Lander - NET Core 2.1 June Update
Rich Lander - Deep Dive into Microsoft Configuration
Travis Illig - Span for Audio
Mark Heath - Disposing of services when using Dependency Injection with .NET Core console apps
Jerrie Pelser - Staying up-to-date with .NET Container Images
Rich Lander -
Using ML.NET – Introduction to Machine Learning and ML.NET
Nikola Živković - Default Interface Methods in C# 8
Bassam Alugii - The RyuJIT transition is complete!
Bruce Forstall - Cómo Microsoft hizo que me volvieran a gustar otra vez .NET y C#
CampusMVP - Adding attribute to backing field of automated property
Gunnar Peipman - C# 8 & No More NullReferenceExceptions – What about legacy code?
Christian Nagel
IActionResult
(o un Task<IActionResult>
en caso de ser asíncronas). Este interfaz, cuya única misión es definir el método de ejecución asíncrona del resultado, ExecuteResultAsync()
, es implementado por la gran variedad de tipos de resultado ofrecidos de serie por el framework, como ViewResult
, RedirectResult
o FileResult
.Sin embargo, no es esta la única opción disponible a la hora de especificar el resultado de una acción, como veremos a continuación.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
.NET / .NET Core
- Asynchronous Programming in .NET – Benefits and Tradeoffs of Using ValueTask
Nikola Živković - .NET Core 2.1 broke my software, thank you very much!
Ayende Rahien - Dissecting new generic constraints in C# 7.3 Sergey Teplyakov
- C# Pattern Matching: Are The Official Docs Lying?
James Hickey - IHttpClientFactory Patterns: Using Typed Clients from Singleton Services
Steve Gordon - Announcing .NET Core 2.1 for Red Hat Platforms
Bob Davis & Mike Guerette - Simple Machine Learning with .NET Core Sample
Carlos Mendible - Using .NET and Docker Together – DockerCon 2018 Update
Rich Lander - C# Enum: Definition, Examples, Best Practices, and Pitfalls
Justin Boyer - Lamar 1.0: Faster, modernized successor to StructureMap
Jeremy D. Miller - IAsyncEnumerable - An Introduction
Stuart Lang - Nullable Types and Null Coalescing Operator in C#
Debendra Dash - Explicitly Ignoring Exceptions in C#
Rick Strahl - Tools for Exploring .NET Internals
Matt Warren - An Early Look at .NET 4.8
Jonathan Allen
Veamos muy rápidamente en qué consiste.
.NET / .NET Core
- Ya está disponible .NET Core 2.1
CampusMVP - Novedades .NET Core 2.1: Generic host
Eduard Tomás - Strings Are Evil. Reducing memory allocations from 7.5GB to 32KB
Indy Singh - Libro C# Yellow Book 2016 de Rob Miles, edición 8.2 en español
Jesús Ruiz - Pattern matching in switch statements
Gunnar Peipman - Less-Common C# Keywords - A Guided Tour
Matthew Jones - Asynchronous Programming in .NET – Task-based Asynchronous Pattern (TAP)
Nikola Živković - Tuple Trouble: Why C# Tuples Get to Break the Guidelines
Mark Michaelis - CoreRT - A .NET Runtime for AOT
Matt Warren - Which .NET Core Runtime Download do you need?
Rick Strahl - Announcing ML.NET 0.2
Ankit Asthana - Easier GetHashCode implementation in .NET Core 2.1
Jiří Činčura - Announcing .NET Framework 4.8 Early Access build 3621!
Preeti Krishna - HTTP Client Factory with .NET Core 2.1
Christian Nagel
Centrándonos en ASP.NET Core, la versión 2.1 incluye numerosas mejoras sobre su predecesora. Muchos componentes internos han sido reescritos y se han añadido características que, sin duda, continúan haciendo de ASP.NET Core un framework cada vez más completo y eficiente.
Pero eso sí, no rompe nada y todo lo que sabemos de ASP.NET Core 2.0 sigue siendo válido (de ahí que sea simplemente una revisión 2.x: no hay breaking changes).
En este post vamos a ver por encima las novedades que creo más destacadas de esta entrega.
.NET / .NET Core
- Announcing .NET Core 2.1
Rich Lander - C# 8.0 Expected Features: Part – III : Switch statements & Part IV: Something new for Indexes and ranges
Neel Bhatt - Asynchronous Programming in .NET – Common Mistakes and Best Practices
Nikola Živković - C# 8.0 – New Planned Features
Damir Arh
IHostedService
y registrar dicha implementación en el inyector de dependencias.Sin embargo, aunque podía parecer lo contrario, la implementación correcta del interfaz
IHostedService
no era una tarea sencilla. De hecho, como se comenta en este issue de Github, IHostedService
era un interfaz de muy bajo nivel y, al no quedar claro cómo debía utilizarse en escenarios reales, podría dar lugar a bastantes confusiones y problemas..NET / .NET Core
- The State of HttpClient and .NET Multi-Targeting
Dominick Baier - Build 2018: The Future of C#
Jonathan Allen - Asynchronous Programming in .NET – Motivation and Unit Testing
Nikola Živković - The Testing Context
Wade - Models and Their Interfaces in C# API Design
Jonathan Allen - Non-trailing named arguments in C# 7.2
Gunnar Peipman - Announcing Discover .NET
Dave Glick - Understanding the .NET Build Configuration System
Peter Morlion - Introducing signed package submissions to NuGet.org
Ricardo Minguez - More C# 7 goodness – Span of T – Span
Ibrahim Šuta - Migrating to .NET Core: NuGet Package Dependencies
Derek Comartin - How to Update Net Core 2.0 Application to 2.1 Version
Sibeesh Venu
- Procesar la plantilla CSHTML y obtener código C# que permita renderizarla.
- A continuación, compilar dicho código para obtener un componente ejecutable.
- Por último, ejecutar el código para renderizar la plantilla.
¡Seguimos! ;)
.NET / .NET Core
- Code coverage in .NET Core with Coverlet
Anuraj Parameswaran - .NET Span better performance
Bnaya Eshet - dotnet watch 2.1
Nate McMaster - .NET Core 2.1 Global Tools
Nate McMaster - C# List: Definition, Examples, Best Practices, and Pitfalls
Carlos Schults

ImprPant
, o a lo sumo Alt+ImprPant
si sólo necesito el contenido de una ventana; tras ello, acudo a una herramienta de edición como Paint.net, pego la imagen desde el portapapeles y desde ahí recorto la sección que me interesa. Pues sí, todo muy manual, como en los viejos tiempos ;) Creo que estas funciones deben andar por ahí desde los tiempos de Windows 95 o quizás antes, así que simplemente sigo haciendo lo mismo que he hecho toda la vida.
Pero como ha ocurrido en otras ocasiones, creo que debo ser de los últimos en saber que Windows incluye desde hace ya bastante tiempo herramientas más sofisticadas para conseguir capturas de pantalla de forma sencilla, así que aprovecharemos este post para hacer una pequeña puesta al día.
.NET / .NET Core
- Announcing .NET Core 2.1 RC 1
Rich Lander - .NET Core 3 and Support for Windows Desktop Applications
Rich Lander - .NET Core May 2018 Update
Rich Lander - Introducing ML.NET: Cross-platform, Proven and Open Source Machine Learning Framework
Ankit Asthana - Serialization Performance Update With .NET 4.7.2
Alois Kraus - A Look at .NET Core 2.1
Justin Boyer - 7 Things Worth Knowing About ASP.NET Core Logging
Bipin Joshi - Version vs VersionSuffix vs PackageVersion: What do they all mean?
Andrew Lock - Default literal expressions in C# 7.1
Gunnar Peipman - Using LazyCache for clean and simple .NET Core in-memory caching
Scott Hanselman - Hola Mundo con ML.Net, Machine Learning for .Net!
Bruno Capuano

Mucho han cambiado las cosas desde 2006. Por aquellos tiempos, Windows XP campaba a sus anchas en los equipos de escritorio. Usábamos Visual Studio 2005 para programar aplicaciones .NET Framework 2.0, usando un C# en el que se acababan de incorporar características novedosas como los tipos genéricos, nullables, o los data tables. No teníamos smartphones, simplemente teléfonos móviles. Han cambiado muchas cosas, pero una sigue intacta: las ganas de seguir aprendiendo y compartir por aquí lo que pienso que puede ayudar a otros.
Mil y pico entradas después de aquél mayo de 2006, y tras recibir a más de dos millones de visitantes, no puedo más que seguir agradeciéndoos el apoyo que me habéis dado desde entonces con vuestras visitas, vuestros comentarios y sugerencias para mejorar. Muchas gracias a todos.
Publicado por José M. Aguilar a las 8:55 a. m.
Etiquetas: aniversario, autobombo, variablenotfound.com
El problema que tiene intentar usar Razor de esta forma es que estamos muy malacostumbrados ;) ASP.NET Core hace mucho trabajo por nosotros y puede hacernos ver que renderizar una vista es algo trivial, pero no lo es; la vista debe ser parseada para obtener de ella un código C# que más adelante será compilado al vuelo para generar un ensamblado que será anexado a nuestra aplicación de forma dinámica y que será utilizado en cada renderización. Y todo ello, de forma rápida y eficiente en recursos.
La renderización de una vista Razor desde una aplicación de consola “pura” consiste en seguir estos mismos pasos, pero de forma manual. Lo que veremos a lo largo de un par de posts es:
- Cómo generar código C# parseando una plantilla Razor, es decir, un archivo
.cshtml
. - Cómo compilar el código C# obtenido y generar un ensamblado con Roslyn.
- Cómo cargar dinámicamente dicho ensamblado en memoria.
- Cómo ejecutar una vista presente en dicho ensamblado y obtener el resultado.
Nota: el objetivo de estos posts es puramente didáctico, y su única intención es aprender algo sobre las tripas de ASP.NET Core. No nos meteremos en optimizar estas operaciones o introducir mejoras como cacheado o similares, ni en ofrecer una solución funcionalmente completa. Por tanto, lo que veremos aquí no será production ready, pero sí un buen punto de partida para que podáis crear vuestras propias soluciones.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
.NET / .NET Core
- Using Reflection to Identify Unwanted Dependencies
John Reilly - Announcing the .NET Framework 4.7.2
Preeti Krishna - Stop Writing Switch and If-Else Statements!
Marc Clifton