martes, 20 de diciembre de 2016
Aunque esta tarea es algo que pueden (y suelen) realizar servidores frontales como IIS o Apache, a veces puede ser interesante que sea nuestra aplicación la que se encargue de ello, por ejemplo si estamos ofreciendo servicios directamente desde los servidores Kestrel o WebListener, o si deseamos aplicar algún tipo de compresión personalizada.
Conceptualmente, la tarea de compresión del resultado de una acción es una buena candidata para ser implementada como filtro. Los filtros son capaces de tomar el control antes y después de la ejecución de las acciones, por lo que, al menos en teoría, serían un buen lugar para implementar la lógica de compresión y retorno al cliente de los resultados, y su uso tendría la siguiente pinta:
public class HomeController : Controller { [Compress] public IActionResult Test() { var text = new string('x', 1000000); return Content(text); } }En este post vamos a ver cómo implementar ese filtro
[Compress]
. Y bueno, aunque implementarlo a mano y desde cero podría tener su gracia, lo que vamos a hacer es aprovechar dos de las últimas e interesantes novedades introducidas recientemente en ASP.NET Core 1.1: el middleware de compresión y la capacidad de utilizar middlewares como filtros de MVC.Publicado por José M. Aguilar a las 9:00 a. m.
Nadie ha comentado la entrada, ¿quieres ser el primero?
Etiquetas: aspnetcore, aspnetcoremvc
lunes, 19 de diciembre de 2016
.NET
- Eliding Async and Await
Stephen Cleary - The Year in .NET – Visual Studio 2017 RC and .NET Core updated, On .NET with Stephen Cleary and Luis Valencia, Ulterius, Inferno, Bastion, LoGeek Night
Bertrand Le Roy - GAMBADAS: Los tres principales pecados al gestionar errores y excepciones
José Manuel Alarcón - Why is reflection slow?
Matt Warren - .NET Framework December Monthly Rollup is Now Available
Stacey Haffner - How to Use Your GPU in .NET
D. Infuehr - Loading .NET Assemblies out of Seperate Folders
Rick Strahl - Research papers in the .NET source
Matt Warren
martes, 13 de diciembre de 2016
EnumDropDownListFor()
para simplificar la creación de cuadros desplegables cuyos elementos eran valores de una enumeración, un escenario relativamente frecuente al desarrollar aplicaciones.Su uso era bastante sencillo, como se puede observar en el código mostrado a continuación:
// Model: public enum Language { CSharp, VbNet, FSharp, NodeJs } public class CodeGenerator { public string ApplicationName { get; set; } public Language Language { get; set; } ... } // View: @model CodeGenerator ... @Html.LabelFor(m => m.Language) @Html.EnumDropDownListFor(m => m.Language)Pues bien,
EnumDropDownListFor()
ha dejado de existir en ASP.NET Core MVC, aunque por supuesto se ha incluido una alternativa, que incluso diría que es bastante más acertada, para conseguir el mismo objetivo, pues se ha separado de forma clara la generación del desplegable de la obtención de datos para poblarlo.
lunes, 12 de diciembre de 2016
.NET
- The week in .NET – On .NET on MyGet – FlexViewer – I Expect You To Die
Bertrand Le Roy - Fun with the HttpClient pipeline
Thomas Levesque - Here's how to detect installed 'Antivirus' software name (using C#)
Kunal Chowdhury - SmartFormat.NET /2 - Enhancing string.Format to new levels
Axuno - Performance of different lock methods in .net
Eowind
lunes, 5 de diciembre de 2016
.NET
- The week in .NET – Cosmos on On.NET, GongSolutions.WPF.DragDrop, Transistor
Bertrand Le Roy - LINQ Debugging and Visualization
Michael Sorens - Implementing a simple retry pattern in c#
Alastair Crabtree - Do not misuse or over abstract AutoMapper
Andriy Buday - Beware of the .NET HttpClient
Nima Ara - Novedades en C#7
Sebastian Henzenn
martes, 29 de noviembre de 2016
A la hora de registrar las trazas es posible indicar uno de los niveles definidos en la enumeración
LogLevel
, cuyos miembros son Trace
, Debug
, Information
, Warning
, Error
y Critical
. Estos miembros definen jerárquicamente la "importancia" de los acontecimientos que registramos, de forma que luego podemos configurar los proveedores para que sólo muestren o persistan mensajes a partir de un nivel determinado.
lunes, 28 de noviembre de 2016
.NET
- .NET Standard 2.0 - Making Sense of .NET Again
Rick Strahl - Beware of the IDictionary<TKey, TValue>
Nima Ara - .NET Standard and Testing Partially Trusted Code
Steve Wilkes - Problems with AsParallel
Szymon Warda - The week in .NET – .NET Core, ASP.NET Core, EF Core 1.1 – Docker – Xenko
Bertrand Le Roy - Cómo leer y escribir archivos de texto con .NET
José Manuel Alarcón - Open Source .NET – 2 years later
Matt Warren - MVP Hackathon 2016: Cool Projects from Microsoft MVPs
Jeffrey T. Fritz - Mapper vs Mapper: Performance
Steve Wilke - Novedades de C#7: Literales binarios.
Leo Micheloni
martes, 22 de noviembre de 2016
A continuación desgranaremos un poco qué se incluye en esta entrega, pero gracias al uso de versionado semántico, sin entrar en más detalles ya podemos saber que esta nueva versión añade características adicionales y mejoras compatibles hacia atrás, por lo que no tendríamos que preocuparnos por romper algo si actualizamos a ella (¡al menos en teoría, claro! ;)).
jueves, 3 de noviembre de 2016
Pues de nuevo este año voy a tener inmensa fortuna de dar el salto a la otra parte del mundo para asistir al eventazo anual que Microsoft organiza para sus MVP. Una nueva ocasión para salir un poco de la cueva y conocer lo que se está cociendo en los hornos del gigante, en el marco incomparable de su campus en Redmond.
Aunque por supuesto, los cientos de sesiones técnicas a las que podré asistir son uno de los grandes motivos para hacer un viaje de esta magnitud, he de reconocer que una de las cosas que más valoro de mi asistencia es pasar unos buenos ratos con colegas y amigos a los que sólo veo en ocasiones como estas y de cuya compañía disfruto cada minuto.
Y dicho esto, cierro las maletas y casi salgo pitando para el aeropuerto, que ya voy tarde ;D
¡Nos vemos a la vuelta!
Publicado en Variable not found.
lunes, 31 de octubre de 2016
.NET
- How does the 'fixed' keyword work?
Matt Warren - The week in .NET – .NET, ASP.NET, EF Core 1.1 Preview 1 – On .NET on EF Core 1.1 – Changelog – FluentValidation – Reverse: Time Collapse
Bertrand Le Roy - Interception in .NET – Part 4: An Interception Framework
Ricardo Peres - Roslyn - How to create a custom debuggable scripting language?
Michal Komorowski
martes, 25 de octubre de 2016
maxlength
en los cuadros de texto, máxime cuando esta información solíamos incluirla en anotaciones de las clases del modelo con atributos como StringLength
o MaxLength
.Y ha llovido bastante desde entonces, incluso el framework MVC se ha "reseteado" y ahora es ASP.NET Core MVC, pero seguimos sin disponer de esa posibilidad, que cubre un escenario muy frecuente al desarrollar aplicaciones con este framework.
En este post vamos a ver, paso a paso, cómo utilizar los maravillosos tag helpers para incluir este atributo de forma automática en los tags
<input>
vinculados a propiedades del modelo cuyos metadatos indiquen un tamaño máximo para el campo.
lunes, 24 de octubre de 2016
Como de costumbre, espero que os resulten interesantes :-)
.NET
- You're using HttpClient wrong and it is destabilizing your software
Simon Timms - Making .NET code less allocatey - Allocations and the Garbage Collector
Maarten Balliauw - Serialización de datos: Protocol Buffers
Javier Torrecilla - The week in .NET – Bond – The Gallery
Betrand Le Roy - Notes from the ASP.NET Community Standup – October 11, 2016
Jeffrey T. Fritz - Interception in .NET – Part 3: Static Interception
Ricardo Peres
martes, 18 de octubre de 2016
Me consta que muchos lo estabais esperando con impaciencia, así que me complace anunciaros que desde hace unos días tenéis disponible mi nuevo curso sobre ASP.NET Core MVC en CampusMVP.
Su creación sido un proceso realmente largo y laborioso porque, a diferencia de ediciones anteriores, los cambios que trae consigo el nuevo marco de trabajo han obligado a replantear desde el principio los contenidos, pero creo que el resultado ha valido la pena: un curso potente y completo en el que recorremos el marco de trabajo desde las bases que lo sustentan (ASP.NET Core) hasta la programación de aplicaciones y servicios con el framework ASP.NET Core MVC.
En este post intentaremos responder a las siguientes preguntas:
- ¿En qué consiste el curso de ASP.NET Core MVC?
- ¿Cuáles son los contenidos del curso?
- ¿Es este curso para mi?
- ¿Qué conocimientos previos necesito para seguir el curso?
- ¿Y qué ocurre con MVC 5 o los demás frameworks basados en ASP.NET 4.x?
- Me convence, ¿cuándo empezamos?
martes, 11 de octubre de 2016
El framework nos ofrece distintas fórmulas para generar direcciones, aunque la más básica es utilizar extensores de
IUrlHelper
como Action()
, Link()
o RouteUrl()
. Tenemos instancias de dicho interfaz disponibles en la propiedad Url
de controladores y vistas, pero también podemos reclamarlas directamente al sistema de inyección de dependencias en otros contextos. Asimismo, en las vistas podemos utilizar helpers específicos para generar hipervínculos, como el clásico Html.Action()
, o el más reciente tag helper <a>
.
lunes, 10 de octubre de 2016
.NET
- Audit.NET: A small framework to audit .NET object changes
Federico Daniel Colombo - New Features of C# 7.0
Prasad kulkarni - Screen Recorder in .NET
Arun Chandrasekhara Pillai - The week in .NET – On .NET on Cecil – NAudio – SpeechCentral – Hand of Fate
Bertrand Le Roy - Story of Equality in .Net - Part 6
Ehsan Sajjad - Pluralization: The missing part of .NET & PluralNet: Pluralization for your .Net application
Rudy Huyn
martes, 4 de octubre de 2016
Startup
es donde introducimos el código de inicialización de nuestras aplicaciones. En sus métodos Configure()
y ConfigureServices()
encontraremos aspectos de todo tipo, como los siguientes, por citar sólo algunos:- La configuración del sistema de settings
- Definición de destinos de logs y niveles de trazas
- Configuración de componentes de tratamiento de errores y sistemas de depuración y profiling adicionales
- Configuración de servicios como caching o estado de sesión
- Inserción y configuración de servicios y middlewares del framework, como los destinados al proceso de contenidos estáticos, internacionalización, CORS, u otros
- Middlewares personalizados
- Registro de servicios en el sistema de inyección de dependencias
- Inicializaciones específicas de la aplicación, como seeds de bases de datos o configuración de mapeos entre objetos
- Configuración de rutas de la aplicación
- …
lunes, 3 de octubre de 2016
.NET
- Optimising LINQ
Matt Warren - Convirtiendo Entidades de Dominio a Dtos y viceversa, parte I & parte II
Javier Torrecilla - Un-swallowing Swallowed Exceptions with Fody and IL Weaving
Nick Chamberlain - The week in .NET: On .NET on Orchard 2 – Mocking on Core – StoryTeller – Armello
Bertrand Le Roy - Introducing .NET Standard
Immo Landwerth - .NET Standard, una única Library para gobernarlos a todos!
Bruno Capuano - Yield or Not To Yield
Pavel Rytikov
martes, 27 de septiembre de 2016
En más de una ocasión me he topado con artículos que sugerían que ASP.NET Core MVC es un middleware y de hecho, incluso en algunos momentos yo también he tenido la sensación de que podía serlo.
Sin embargo, y esta es la respuesta corta si quieres ahorrar tiempo de lectura, estrictamente hablando no lo es.
lunes, 26 de septiembre de 2016
.NET
- When a disk cache performs better than an in-memory cache (befriending the .net GC)
Dan Roberts - Asynchronous Programming in C# using Async Await – Best Practices
Damir Arh - The week in .NET: On .NET with Steeltoe – C# Functional Extensions – Firewatch
Bertrand Le Roy - Inspecting aspects and interception in .NET, part I, II & III
Erik Heemskerk - Compact strings in the CLR
Matt Warren - Designing with Exceptions in .NET
Jonathan Allen - Channelling my inner geek
Marc Gravell
miércoles, 20 de julio de 2016
Parecía que no llegaban, pero por fin están aquí las vacaciones :)
Como suele ser habitual por esta época, colgaré temporalmente los hábitos digitales y durante las próximas semanas el blog quedará a merced de las olas. Aunque la mayor parte del tiempo seguiré trabajando en distintos temas, espero poder reducir un poco la intensidad y tomar aunque sea algunos días de descanso para poder disfrutar de la familia y darme algún que otro bañito relajante en las costas de Cádiz.
Espero que nos veamos a la vuelta, todos morenitos y con las pilas al 100%, ya en el mes de septiembre.
¡Felices vacaciones, amigos!

Imagen: Atardecer en Costa Ballena (Rota-Cádiz)
Autor: Ramón Sobrino https://trapatroles.wordpress.com/2015/04/08/rota-cadiz/
Como suele ser habitual por esta época, colgaré temporalmente los hábitos digitales y durante las próximas semanas el blog quedará a merced de las olas. Aunque la mayor parte del tiempo seguiré trabajando en distintos temas, espero poder reducir un poco la intensidad y tomar aunque sea algunos días de descanso para poder disfrutar de la familia y darme algún que otro bañito relajante en las costas de Cádiz.
Espero que nos veamos a la vuelta, todos morenitos y con las pilas al 100%, ya en el mes de septiembre.
¡Felices vacaciones, amigos!
Imagen: Atardecer en Costa Ballena (Rota-Cádiz)
Autor: Ramón Sobrino https://trapatroles.wordpress.com/2015/04/08/rota-cadiz/
martes, 19 de julio de 2016
Hoy vamos a hablar de las variables de sesión, un tema que ya tratamos por aquí hace bastante tiempo, pero que conforme evolucionaba el producto ha cambiado lo suficiente como para dedicarle un nuevo post.
lunes, 18 de julio de 2016
.NET
- The cost of garbage collection
Szymon Warda - Cambios de zona horaria en .NET
CampusMVP - Accessing and deleting large e-mails in Gmail with C#
Bruno Sonnino - LongRunning Is Useless For Task.Run With async-await
Bar Arnon - Fast Deep Copy of Objects by Expression Trees (C#)
Fakon - Simplest C# code to post a tweet using OAuth
Danny Tuppeny
martes, 12 de julio de 2016
Pero como sabemos, en ASP.NET Core el sistema de configuración ha cambiado para mejor, y ahora los settings podemos almacenarlos en archivos JSON independientes del resto de configuraciones del proyecto, así como en otros formatos y ubicaciones. Y ya que se ponían con el tema, el equipo de ASP.NET ha aprovechado para hacer que podamos modificar los settings sobre los archivos de configuración y que éstos sean aplicados sobre la marcha, sin necesidad de volver a arrancar la aplicación.
lunes, 11 de julio de 2016
.NET
- Upload File to SFTP Site with C# in Visual Studio .NET
Slccocdev - Avoidable colletion mistakes in C#
Trevor Ash - AutoMapper 5.0 Released
Jimmy Bogard - How to Write Your Own Programming Language in C#
Vassili Kaplan - .NET Backward Compatibility – Part 1, Part 2 & Part 3
Bastian Eicher - Story of Equality in .Net - Part 3 & Part 4
Ehsan Sajjad - Querying JSON using LINQ
Mahesh Sabnis - What is the Extension Method in C#?
Dhananjay Kumar - The async/await model and its perils
& The cost of the async state machine
Ayende Rahien
lunes, 4 de julio de 2016
Para contaros penas ya están los telediarios, así que simplemente quería compartir vosotros una alegría de la que, de alguna u otra forma, sois también artífices: el pasado viernes me notificaron desde Microsoft que he sido reconocido nuevamente como MVP :)
Supongo que todos habréis visto ya la pinta que tiene este ansiado mail, pero para los que acabéis de llegar, el mensaje de notificación del nombramiento viene a ser más o menos como sigue:
Esta vez me ha pillado por sorpresa porque en el fragor de la batalla diaria no me había dado cuenta de que era día uno de julio, que es la fecha en la que conozco si me otorgan o no esta distinción, por lo que no he tenido la tensa espera de otras veces… y os confirmo que, a pesar de ser la sexta vez, la mezcla de emoción, alegría y orgullo es la misma :)
Una novedad curiosa es que dejo de ser MVP en ASP.NET/IIS, como ocurría años anteriores, y paso a ser MVP en la categoría Visual Studio and Development Technologies . Pero no, no es que haya cambiado de especialidad; este cambio es debido a las modificaciones al programa MVP que anunció Microsoft meses atrás, que introducía nuevas categorías de "grano grueso" en las que englobarían especializaciones más concretas:
![image[20] image[20]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5oqleoTTBHdTywJKDYeY3ih2Qa_pN1UGxU2l3WDAuPYWml_gD3hGY2r0EK65yWvAAE80mHu2LpAkU5fm1FZxabfxl0i8eK9HDVGnCVctj0aciKbuR0AoMr6c89bp5U7RCAwsnLw/?imgmax=800)
Muchas gracias al equipo del programa MVP en Microsoft, a la gran Cristina González, MVP lead para esta parte del mundo, y a todos vosotros, amigos de Variable not found, por hacerlo posible.
Es un honor seguir formando parte de este privilegiado grupo de personas que cada día dedican su tiempo y entusiasmo para compartir conocimientos con la comunidad de desarrolladores, y entre los que cuento ya grandes amigos. Sinceramente, cada vez me siento más afortunado de pertenecer a esta pandilla y, como sé que esto es algo que lógicamente en algún momento habrá de acabarse, estoy disfrutando el momento como nadie :)
Ah, y ¡enhorabuena al resto de MVP nombrados el mismo día!
Publicado en Variable Not Found.
Supongo que todos habréis visto ya la pinta que tiene este ansiado mail, pero para los que acabéis de llegar, el mensaje de notificación del nombramiento viene a ser más o menos como sigue:
De: support@mvpaward.com Asunto: ¡Enhorabuena MVP de Microsoft 2016! Estimado/a Jose Maria Aguilar, Enhorabuena. Nos complace anunciarle el Premio MVP de Microsoft® de 2016. Este nombramiento se concede a los líderes excepcionales de la comunidad técnica que comparten de forma activa con otras personas su profundo conocimiento técnico así como su experiencia en el uso de la tecnología. Le agradecemos especialmente la contribución que ha realizado en las comunidades técnicas en el área de Visual Studio and Development Technologies a lo largo del pasado año. |
Esta vez me ha pillado por sorpresa porque en el fragor de la batalla diaria no me había dado cuenta de que era día uno de julio, que es la fecha en la que conozco si me otorgan o no esta distinción, por lo que no he tenido la tensa espera de otras veces… y os confirmo que, a pesar de ser la sexta vez, la mezcla de emoción, alegría y orgullo es la misma :)
Una novedad curiosa es que dejo de ser MVP en ASP.NET/IIS, como ocurría años anteriores, y paso a ser MVP en la categoría Visual Studio and Development Technologies . Pero no, no es que haya cambiado de especialidad; este cambio es debido a las modificaciones al programa MVP que anunció Microsoft meses atrás, que introducía nuevas categorías de "grano grueso" en las que englobarían especializaciones más concretas:
Muchas gracias al equipo del programa MVP en Microsoft, a la gran Cristina González, MVP lead para esta parte del mundo, y a todos vosotros, amigos de Variable not found, por hacerlo posible.
Es un honor seguir formando parte de este privilegiado grupo de personas que cada día dedican su tiempo y entusiasmo para compartir conocimientos con la comunidad de desarrolladores, y entre los que cuento ya grandes amigos. Sinceramente, cada vez me siento más afortunado de pertenecer a esta pandilla y, como sé que esto es algo que lógicamente en algún momento habrá de acabarse, estoy disfrutando el momento como nadie :)
Ah, y ¡enhorabuena al resto de MVP nombrados el mismo día!
Publicado en Variable Not Found.
domingo, 3 de julio de 2016
Y hoy el algoritmo cuasimágico de generación de números pseudoaleatorios ha determinado que los ganadores son:
Ibai Imaz @ibaiimaz Euskal Herria | ||
L. Alberto Baigorria @uialberto Santa Cruz de la Sierra, Bolivia |
Y así, damos por finalizada la ronda de sorteos por la celebración del décimo aniversario del blog. Al comenzar esta iniciativa quería que fuera algo grande y espero haber conseguido al menos un poco de dicho objetivo: todos os habéis llevado un libro de O'Reilly, muchos de vosotros conseguisteis grandes premios, pero lo más importante es que con todo esto espero haber sido capaz de transmitiros mi agradecimiento por estar siempre ahí, ayudándome a encontrar la variable.
Venga, ¡a por los próximos diez años!
Publicado en Variable not found
miércoles, 29 de junio de 2016
Sorteo finalizado, ya tenemos los ganadores. ¡Muchas gracias a todos por participar!
Personalmente le tengo bastante aprecio a estos chicos desde que conocí su popular Resharper, una herramienta que uso a diario desde hace años, por lo que no dudé en contactar con ellos y, por supuesto, se ofrecieron amablemente a colaborar en la celebración.
Y gracias a ello, hoy sorteamos dos suscripciones a Resharper Ultimate, la suite de productos que incluye:
- Resharper para .NET. Indispensable. Creedme, una vez lo probéis os haréis adictos ;)
- Resharper para C++.
- DotTrace el profiler de rendimiento para .NET
- DotMemory, un profiler de memoria para aplicaciones .NET
- DotCover, runner de pruebas unitarias y control de cobertura de código
- DotPeek, el descompilador para.NET (que por cierto, de todas formas es gratuito y podéis descargar desde su página).
martes, 28 de junio de 2016
La verdad es que hace tan sólo unos años, presentar la nueva versión de ASP.NET en la conferencia Red Hat DevNation habría resultado una auténtica osadía y probablemente habría acabado con tomates volando hacia el escenario. Pero esto es agua pasada, y este simple gesto es una prueba más de que realmente las cosas han cambiado en Microsoft.
Con el lanzamiento de la versión 1.0 de la infraestructura .NET Core y el conjunto de frameworks basados en ella (ASP.NET, MVC, Entity Framework), iniciamos una nueva época en la que aquél sueño de desarrollar o ejecutar fácilmente aplicaciones .NET en cualquier plataforma es ya una realidad, y con todo el soporte y las bendiciones del gigante de Redmond. Escenarios antes impensables, como desarrollar desde Mac para desplegar en Linux, o crear nuestras aplicaciones en Windows y explotarlas desde un contenedor Docker, son ya posibles.
Estamos ante un reboot en toda regla: todos estos frameworks han sido construidos desde cero teniendo en mente conceptos actuales que ni siquiera existían cuando empezaron a gestarse las versiones iniciales de .NET o ASP.NET "clásicos": la nube, alto rendimiento, escalabilidad, APIs, múltiples dispositivos y plataformas, contenedores, microservicios etc. Y creados usando principios y buenas prácticas que tampoco eran los habituales antaño: inyección de dependencias, clases con responsabilidades limitadas, modularidad, componibilidad, abstracciones basadas en interfaces, pruebas unitarias…