martes, 20 de marzo de 2018
Como sabemos, los conocidos códigos de estado HTTP 301 y 302 se usan para retornar al agente de usuario (normalmente, el navegador) una redirección, que viene a ser algo así como decirle “hey, el recurso que andas buscando ya no se encuentra aquí, sino en esta otra dirección”.
Presto y obediente, el browser interpretará esta orden navegando hacia la URL indicada en el encabezado
Un ejemplo del workflow de peticiones y respuestas de este tipo podría ser la siguiente:
Los códigos de estado HTTP 301 y 302 son válidos en la mayoría de escenarios, y permiten solucionar problemas como, entre otros, el cambio de ubicación nuestros recursos sin perder posicionamiento en buscadores, o implementar el patrón Post-Redirect-Get para mejorar un poco la experiencia de usuario y evitar dobles envíos de información en formularios.
Sin embargo, hay ocasiones en que la solución queda algo corta. Por ejemplo, si cambiamos de URL el endpoint de un servicio programado exclusivamente para ser invocado mediante peticiones de tipo
Por ello, y algunas otras razones que veremos después, el estándar HTTP amplió, hace ya bastante tiempo, el conjunto de códigos de redirección con tres nuevos miembros: HTTP 303, 307 y 308. Los dos primeros formaron parte de HTTP 1.1, mientras que el código 308 fue añadido en la RFC 7538 algo más adelante.
Veamos para qué sirve cada uno de ellos.
Presto y obediente, el browser interpretará esta orden navegando hacia la URL indicada en el encabezado
location
del resultado, es decir, generando una nueva petición de tipo GET
y mostrando al usuario la página obtenida.Un ejemplo del workflow de peticiones y respuestas de este tipo podría ser la siguiente:
// Petición:
GET /home/articles/welcome-to-my-blog.html HTTP/1.1
Host: www.myserver.com
// Respuesta:
HTTP/1.1 301 Moved Permanently
Location: http://www.myserver.com/blog/welcome-to-my-blog.html
// Nueva petición:
GET /blog/welcome-to-my-blog.html HTTP/1.1
Host: www.myserver.com
...
La diferencia entre el código 301 y 302 es que el primero de ellos indica al agente de usuario (sea un browser o aplicación cliente) que la redirección es permanente, esto es, que puede almacenar localmente la nueva ubicación y utilizarla en el futuro con seguridad en lugar de la que se usó originalmente. El código 302, en cambio, indica que la nueva ubicación es temporal y sólo debe ser utilizada en esta ocasión para dirigir la petición al lugar correcto.Los códigos de estado HTTP 301 y 302 son válidos en la mayoría de escenarios, y permiten solucionar problemas como, entre otros, el cambio de ubicación nuestros recursos sin perder posicionamiento en buscadores, o implementar el patrón Post-Redirect-Get para mejorar un poco la experiencia de usuario y evitar dobles envíos de información en formularios.
Sin embargo, hay ocasiones en que la solución queda algo corta. Por ejemplo, si cambiamos de URL el endpoint de un servicio programado exclusivamente para ser invocado mediante peticiones de tipo
POST
o PUT
, lo que nos interesaría sería que las peticiones a la dirección original retornaran una redirección indicando la nueva ubicación pero también informando al browser de que utilice sobre ella el mismo verbo de la petición original.Por ello, y algunas otras razones que veremos después, el estándar HTTP amplió, hace ya bastante tiempo, el conjunto de códigos de redirección con tres nuevos miembros: HTTP 303, 307 y 308. Los dos primeros formaron parte de HTTP 1.1, mientras que el código 308 fue añadido en la RFC 7538 algo más adelante.
Veamos para qué sirve cada uno de ellos.
lunes, 19 de marzo de 2018
Pues tras un par de semanitas de parón debido a mi excursión al MVP Summit, volvemos a la carga con un buen puñado de enlaces que, como siempre, espero que os resulten interesantes :-)
.NET / .NET Core
- Protecting Your Passwords with the .NET Secret Manager
Corey Weathers - How generics were added to .NET
Matt Warren - Does System.Net.WebSockets include a keepalive mechanism which automatically takes care of Ping/Pong control frames?
José Paulo Pendão - Fun with global tools in .NET Core 2.1 Preview
Alexander Tsvetkov - Functional Programming in C#: Map, Filter, and Reduce Your Way to Clean Code
Carlos Schults - Lightweight .NET Core benchmarking with BenchmarkDotNet and dotnet-script
Filip Woj - Cross-platform GUIs with open source .NET using Eto.Forms
Scott Hanselman - Exploring Global Tools in .NET Core
Anuraj Parameswaran
jueves, 1 de marzo de 2018
Pues creo que habré visitado Redmond ya en ocho o nueve ocasiones, pero la verdad es que la semana del MVP Global Summit sigue siendo una de esas épocas del año que espero con más entusiasmo. Y por fin, ya toca dentro de unos días ;)
Una vez más, allí tendré ocasión de disfrutar de la compañía de amigos que sólo veo una vez al año, de respirar un ambiente geek++ inigualable, y, por supuesto, del lujazo de aprender y profundizar sobre las tecnologías lo que tenemos por delante de mano de los propios padres de las criaturas. Bueno, y siempre mola quitarse un poco del día a día y hacerse un viajillo al otro lado del mundo :)
¡Nos vemos por aquí a la vuelta!
Publicado en Variable not found.
martes, 27 de febrero de 2018
Cuando en nuestras aplicaciones o APIs web usamos autenticación basada en tokens, ya sean JWT o simples cookies, normalmente aprovechamos para introducir en ellos información extendida sobre el usuario que realiza la petición, básicamente para tenerla más a mano a la hora de procesarla. Por ejemplo, suele ser habitual guardar su nombre, el identificador en base de datos, roles de seguridad y cosas de este estilo.
Desde el punto de vista práctico, es una solución fantástica y muy cómoda de utilizar, y de hecho seguro que en más de una ocasión os habréis visto abusando de ella, es decir, habréis introducido en claims más información de la cuenta sólo por lo cómodo que resulta utilizarlo.
Pero claro, esto tiene su coste. Cada dato extra que añadimos a esos tokens supone transferencia adicional a la hora de recibir peticiones y retornar resultados, lo que puede repercutir en costes de operación si nuestro sistema tiene mucho tráfico, y en cualquier caso, aumentar los tiempos de respuesta de la aplicación.
Para solucionar estos problemas, ASP.NET Core incorpora el concepto de claims transformation, que son componentes ejecutados durante la fase de autenticación que toman el
De esta forma, podríamos introducir en los tokens que viajan por la red un único claim con el nombre o identificador único del usuario, y mediante una transformación posterior añadirle atributos adicionales, como su nombre completo, roles de seguridad y otros que nos hagan falta a nivel de aplicación.
Desde el punto de vista práctico, es una solución fantástica y muy cómoda de utilizar, y de hecho seguro que en más de una ocasión os habréis visto abusando de ella, es decir, habréis introducido en claims más información de la cuenta sólo por lo cómodo que resulta utilizarlo.
Pero claro, esto tiene su coste. Cada dato extra que añadimos a esos tokens supone transferencia adicional a la hora de recibir peticiones y retornar resultados, lo que puede repercutir en costes de operación si nuestro sistema tiene mucho tráfico, y en cualquier caso, aumentar los tiempos de respuesta de la aplicación.
Para solucionar estos problemas, ASP.NET Core incorpora el concepto de claims transformation, que son componentes ejecutados durante la fase de autenticación que toman el
ClaimsPrincipal
generado a partir de la información recibida en el token y permiten extenderlo o modificarlo para añadirle claims o atributos adicionales.De esta forma, podríamos introducir en los tokens que viajan por la red un único claim con el nombre o identificador único del usuario, y mediante una transformación posterior añadirle atributos adicionales, como su nombre completo, roles de seguridad y otros que nos hagan falta a nivel de aplicación.
Publicado por José M. Aguilar a las 8:55 a. m.
Etiquetas: aspnetcore, aspnetcoremvc, autenticación, jwt, trucos
lunes, 26 de febrero de 2018
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes :-)
.NET / .NET Core
- Accessing Configuration in .NET Core Test Projects
Rick Strahl - Are you registering IHttpContextAccessor correctly?
Adam Storr - .NET Foundation February Update
.NET Foundation - How to use Null Conditional operators
Brij Bhushan Mishra - Quick Tips for Better C# Security
Justin Boyer - Use the awesomeness of Pattern Matching with C# 7.0
Brij Bhushan Mishra - Logging with output in Unit Tests in .Net Core 2.0
Alastair Crabtree
martes, 20 de febrero de 2018
En ocasiones puede resultar interesante renderizar una vista de ASP.NET Core MVC a una cadena de caracteres. Probablemente el escenario clásico de uso sea utilizar este tipo de vistas como motores de plantillas, por ejemplo, a la hora de generar el cuerpo de un email, pero puede haber muchos otros casos en los que nos vendría bien saber hacerlo.
En las versiones "clásicas" de ASP.NET MVC era algo que se podía resolver con relativa facilidad gracias a proyectos como RazorGenerator o RazorEngine, pero, como en ASP.NET Core las cosas han cambiado bastante, he pensado que quizás sería interesante comentar por aquí cómo podríamos conseguirlo en este nuevo framework.
En las versiones "clásicas" de ASP.NET MVC era algo que se podía resolver con relativa facilidad gracias a proyectos como RazorGenerator o RazorEngine, pero, como en ASP.NET Core las cosas han cambiado bastante, he pensado que quizás sería interesante comentar por aquí cómo podríamos conseguirlo en este nuevo framework.
lunes, 19 de febrero de 2018
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
.NET / .NET Core
- New Free eBook: C# 7.2: What’s New Quick Start
Jason Roberts - Introducing AsyncUtilities
Bar Arnon - Addressing a Simple Yet Common C# Async/Await Misconception
Ben Hall - Four LINQ methods that are similar but have important differences
Andy Schwam - URL Matching in C#
Camilo Reyes - Validating JSON with JSON Schema
Peter Vogel - One user scenario to rule them all
Sergey Teplyakov - Aspect Oriented Programming (AOP) in .NET Core and C# using AutoFac and DynamicProxy
Carlos Blanco
martes, 13 de febrero de 2018
Hoy me voy a salir un poco de las temáticas habituales del blog para comentar rápidamente la solución a algo que me ocurrió hace unos días y quizás pueda resultar de ayuda a alguien más.
Resulta que en mitad de una sesión de trabajo normal, de repente todo lo que tenía en pantalla comenzó a mostrarse en escala de grises. Para entendernos, lo que tenía por delante era más o menos lo siguiente, que no puedo negar que tenía su encanto:
Resulta que en mitad de una sesión de trabajo normal, de repente todo lo que tenía en pantalla comenzó a mostrarse en escala de grises. Para entendernos, lo que tenía por delante era más o menos lo siguiente, que no puedo negar que tenía su encanto:
lunes, 12 de febrero de 2018
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
.NET / .NET Core
-
Microsoft eBook gratuito en Español: “Microservicios .NET – Arquitectura para aplicaciones .NET contenerizadas”
César de la Torre - C# Varianza en delegados
Eduard Tomás - Announcing .NET Framework 4.7.2 Early Access build 3052!
Preeti Krishna - TransactionScope: A simple way to handle transactions in .NET
Brij Bhushan Mishra
martes, 6 de febrero de 2018
Todos tenemos bibliotecas o componentes escritos para .NET Framework que nos gustaría portar de alguna forma a .NET Core para poder utilizarlos en nuevos proyectos, o, al menos, saber si esto sería posible en un futuro.
Aunque de forma intuitiva muchas veces tenemos la respuesta (sobre todo cuando ésta es un rotundo “no” ;D), sin duda es interesante disponer de información objetiva que indique cómo de lejos estamos de conseguirlo y cuáles son los principales impedimentos.
Aunque de forma intuitiva muchas veces tenemos la respuesta (sobre todo cuando ésta es un rotundo “no” ;D), sin duda es interesante disponer de información objetiva que indique cómo de lejos estamos de conseguirlo y cuáles son los principales impedimentos.
lunes, 5 de febrero de 2018
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
.NET / .NET Core
- .NET Core 2.1 Roadmap
Rick Lander - Stacktrace improvements in .NET Core 2.1
Ben Adams - .NET Core Global Tools and Gotchas
Nate McMaster - Easy way to create a C# lambda expression from a string (with Roslyn)
Filip Woj - Sorting myself out, extreme edition
Marc Gravell - Zero Garbage Collector for .NET Core 2.1 and ASP.NET Core 2.1
Konrad Kokosa - Distributing Content and Showing a ReadMe file in a .NET Core Nuget Package
Rick Strahl - Resources for Learning about .NET Internals
Matt Warren - Accessing Tuples at Runtime using Reflection
Daniel Cabtree - Sunsetting StructureMap
Jeremy D. Miller
lunes, 22 de enero de 2018
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
.NET / .NET Core
- C#: Favorite Features through the Years
David Pine - Using the HttpClientInterception to Test Methods That Use a HttpClient
Bryan Hogan - Maximize the Performance of Your .NET Application With This Optimization Guide
Jared Nance - Building a Let’s Encrypt ACME V2 client
Ayende Rahien - Duck Typing And Async/Await
Bar Arnon - Be careful in using the C# null conditional operators in tests
Andrea Angella - ConcurrentDictionary Is Not Always Thread-Safe
Bar Arnon - Cómo mostrar los tests de forma legible en el Explorador de Tests de Visual Studio con xUnit (III) & Cómo ejecutar en xUnit un conjunto de tests sobre un mismo método de Test
Jorge Serrano - Task.CompletedTask and Task.Result Tips
K. Scott Allen - Uso de Caller Information en .NET
Jorge Serrano
martes, 16 de enero de 2018
Ya, sé que puede parecer una pregunta extraña a estas alturas, pero el caso es que un alumno del curso de ASP.NET Core en CampusMVP me la envió hace unos días y me ha parecido interesante comentar el asunto por aquí, por si puede interesar a alguien más.
Aunque a muchos nos pueda parecer raro, aún hay bastantes empresas y desarrolladores trabajando en Visual Basic .NET. En ocasiones sólo es para mantener código antiguo, pero otras veces (más de lo que puede parecer) incluso para crear nuevos sistemas aprovechando la experiencia de los desarrolladores y bases de código existente.
En este post vamos a hacer un tour rápido para ver, en la práctica, cómo está el soporte para VB.NET en la versión actual de ASP.NET Core (2.0).
Aunque a muchos nos pueda parecer raro, aún hay bastantes empresas y desarrolladores trabajando en Visual Basic .NET. En ocasiones sólo es para mantener código antiguo, pero otras veces (más de lo que puede parecer) incluso para crear nuevos sistemas aprovechando la experiencia de los desarrolladores y bases de código existente.
Si estáis en esta situación y vais a comenzar a trabajar con ASP.NET Core, mi recomendación siempre es que aprovechéis el momento de cambios para dar el salto a C#. Spoiler: no os arrepentiréis ;)Bien, respecto a la pregunta motivo del post, en teoría debería poderse, y de hecho ya difundimos por aquí hace tiempo la noticia oficial de que sería soportado, pero la verdad es que desde entonces no he vuelto a oir hablar mucho del tema, ni he visto ejemplos, ni movimiento en la comunidad ni nada parecido, lo cual me hizo dudar de la situación actual de este tema.
En este post vamos a hacer un tour rápido para ver, en la práctica, cómo está el soporte para VB.NET en la versión actual de ASP.NET Core (2.0).
lunes, 15 de enero de 2018
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
.NET / .NET Core
- C# 7 Series, Part 8: “in” Parameters
Mark Zhou - Writing IL code on Visual Studio
Gunnar Peipman - Fast Pixel Operations in .NET (With and Without unsafe)
Morzel - Introducing Jasper — Asynchronous Messaging for .Net
Jeremy Miller - Throttling with BlockingCollection
Derek Fowler - Cómo mostrar los tests de forma legible con xUnit, Parte I y Parte II & Cómo mostrar un nombre personalizado en un Test ejecutado con xUnit
Jorge Serrano - .NET Core January 2018 Update & .NET Framework January 2018 Security and Quality Rollup
Rich Lander - A very simple resource compiler for .NET *.resx files on non-Windows OS
Steffen Ploetz - Functions as Data: Functional Programming in C#
Ed Charberneau - 4 Common Datetime Mistakes in C# — And How to Avoid Them
Carlos Schults
lunes, 8 de enero de 2018
Antes de nada, me gustaría aprovechar este pequeño momento de vuestro tiempo a desearos un gran 2018 repleto de salud, prosperidad, felicidad y mucha diversión, tanto en los aspectos personales como en los profesionales.
Y ahora, como manda la tradición, dedicaremos este primer post del año a repasar cuáles son los contenidos que más han llamado la atención a los seguidores de Variable Not Found durante este 2017 que acabamos de cerrar.
Y ahora, como manda la tradición, dedicaremos este primer post del año a repasar cuáles son los contenidos que más han llamado la atención a los seguidores de Variable Not Found durante este 2017 que acabamos de cerrar.