Asíncronía = bueno
A grandes rasgos, la explicación es la siguiente: IIS tiene disponible un número limitado de hilos (threads) destinados a procesar las peticiones. Cuando llega una petición, uno de estos hilos es asignado en exclusiva a ella y permanecerá ocupado hasta que haya sido totalmente procesada. Si llegan peticiones cuando todos los hilos están ocupados, se introducen en una cola, también limitada. Cuando el tamaño máximo de esta cola ha sido superado, ya al servidor no le queda más remedio que responder con un error HTTP 503 al usuario indicándole que está seriamente ocupado.
Publicado por José M. Aguilar a las 9:25 a. m.
Etiquetas: aspnetmvc, async, desarrollo
.Net
La verdad es que hemos tenido un veranito cargado de novedades. De hecho, nos encontramos a la vuelta de las vacaciones con versiones renovadas en todos los productos que usamos habitualmente para nuestro trabajo: sistemas operativos, plataforma .NET, entorno de desarrollo, EF, MVC… muchos juguetitos nuevos a los que hincarle el diente, y de los que seguro que hablaremos largamente durante los próximos meses.
Dicho esto, ¡queda inaugurada la temporada 2012-2013 de Variable not found!
Como siempre, nos vemos por aquí :-)
Publicado por José M. Aguilar a las 9:15 a. m.
Etiquetas: blogging, variablenotfound, variablenotfound.com
Hasta el próximo mes de Septiembre soltaré el timón de Variable not found y lo dejaré a la deriva, hasta que vuelva con energías renovadas y ánimos para afrontar el próximo año con la misma ilusión y dedicación que siempre.
En cuanto a los planes veraniegos, este año no voy a poder disfrutar de todo el tiempo libre que me
Pero aún así, tendremos tiempo de hacer una nueva escapada a Mallorca, donde ya estuvimos el año pasado y estamos deseando repetir, y seguro que alguna que otra visita fugaz a playas cercanas de Cádiz y Huelva.
Nos vemos en unas semanillas :-)
¡Felices vacaciones, amigos!
.Net
- Evolution of C# (1.0 – 5.0) – What are the New Features Introduced in C#
Kunal Chowdhury - Identity & .NET 4.5, parte I y parte II
Unai Zorrilla - [VS2012] Información del llamante
Javier Torrecilla - Should C# warn on null dereference?
Eric Lippert - Breaking Changes In Argument List Evaluation In C# 5.0
Paulo Morgado - AOP con Castle Windsor: DynamicInterceptionFacility
Juan María Hernández - Tracing System.Net to debug HTTP Clients
Mike Hadlow - C#/.NET Little Wonders: The Nullable<T> struct
James Michael Hare
Asp.net
- ASP.NET MVC HTML Helper for the jqGrid
Rui Inacio - Customize Json result in Web API
Ugo Lattanzi - Multiple file upload with asp.net 4.5 and Visual Studio 2012
Jalpesh Vadgama - Why is my web application slow?
Sudheer Reddy Battula - .NET HTML Sanitation for rich HTML Input
Rick Stralh - ASP.Net Web API and using Razor the next step
Fredrik Normén - Everything you want to know about ASP.NET Web API content negotation
Filip W.
Data access
- Entity Framework Magic Unicorn (and much more!) is now open source with take backs
Scott Hanselman - Entity Framework and Open Source
EF Team - So you want to contribute to EF? Part 1: Introduction
Arthur Vickers - Entity Framework y OSS
Unai Zorrilla - Entity Framework and Open Source
Scott Guthrie
Html/Css/Javascript
- jQuery Mobile Development Guide
Anthony James - 10 Best jQuery and HTML5 WYSIWYG Plugins
jQuery4u - Straightforward Dates In JavaScript
Oscar - How Do You Mark Up A Single Link or Button?
Louis Lazaris - Announcing jQuery Mobile 1.1.1
Todd Parker
Visual Studio/Complementos/Herramientas
- How Exactly ReSharper 7 Supports Visual Studio 2012
Hadi Hariri - Visual Studio 2012 RC Web Tooling Extensions update
Sayed Ibrahim Hashimi
Otros
- 7 Reasons Why I Can’t Do “Free”
Sharon Hayes - Windows 8 gets a date: 10/26
Todd Bishop - Un año después (¡felicidades, Juanma!)
Juan María Hernández
Publicado en Variable not found
DefaultDisplayMode
proporcionada por el framework, con la que podíamos cubrir la mayoría de necesidades comunes.Así, veíamos cómo el siguiente código era suficiente para registrar un nuevo Display Mode llamado “iPhone”, que sería activado cuando en el identificador del agente de usuario (encabezado user-agent de la petición) incluyera el texto “iPhone”:
DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("iPhone") { ContextCondition = (context => context.Request.UserAgent.IndexOf ("iPhone", StringComparison.OrdinalIgnoreCase) >= 0) });Hecho esto, ya podíamos definir vistas alternativas a las habituales específicas para este dispositivo, cuyos nombres de archivo acabarían siempre en “.iphone.cshtml”. Observad que estamos usando la clase
DefaultDisplayMode
, a la que estamos facilitando la condición que debe cumplirse para que se active este Display mode.Sin embargo, si pensamos crear muchas vistas específicas para dispositivos, podríamos encontrarnos con un maremagnum de archivos como el que veis en la captura de pantalla adjunta.
Obviamente, no es una situación fácilmente manejable, así que ¿por qué no cambiar la forma de nombrar los archivos dependiendo del Display Mode actual? Pues dicho y hecho, vamos a conseguir que cada dispositivo disponga de una carpeta específica para guardar sus vistas.
Heredando de DefaultDisplayMode
Si analizamos el código fuente de la clase DefaultDisplayMode
, veremos que hay varios miembros virtuales que podemos sobrescribir para tomar el control, y uno de ellos es el método TransformPath()
, encargado de transformar la ruta hacia el archivo físico donde está definida la vista teniendo en cuenta el nombre del Display Mode actual.El código por defecto del método es el siguiente:
protected virtual string TransformPath(string virtualPath, string suffix)
{
if (string.IsNullOrEmpty(suffix))
return virtualPath;
string extension = Path.GetExtension(virtualPath);
return Path.ChangeExtension(virtualPath, suffix + extension);
}
O sea, que se reemplaza la extensión del archivo, normalmente “.cshtml” por el resultado de concatenar el sufijo suministrado (el nombre del Display Mode) a dicha extensión. Por esta razón, el comportamiento por defecto del framework es utilizar construcciones como “nombrevista.iphone.cshtml”.Si, como es el caso, queremos cambiar la ruta donde van a intentar localizarse las vistas, lo único que tenemos que hacer es crear una clase descendiente de
DefaultDisplayMode
, sobrescribir la forma de “montar” la ruta hacia la vista, y utilizar esta nueva clase para registrar los modos de visualización que nos interesen. Una posible implementación podría ser la siguiente: public class OrganizedDisplayMode: DefaultDisplayMode
{
public OrganizedDisplayMode(string displayModeId): base(displayModeId)
{
}
protected override string TransformPath(string virtualPath, string suffix)
{
if (string.IsNullOrEmpty(suffix))
return virtualPath;
// Transforms /index.cshtml --> /suffix/index.cshtml
int lastSeparator = virtualPath.LastIndexOf('/');
virtualPath = virtualPath.Substring(0, lastSeparator) +
"/" + suffix +
virtualPath.Substring(lastSeparator);
return virtualPath;
}
}
Y en la inicialización de la aplicación ya podríamos registrar este Display Mode y asociarlo a la condición que esperamos que cumpla la petición: DisplayModeProvider.Instance.Modes.Insert(0,
new OrganizedDisplayMode("iPhone")
{
ContextCondition =
context => context.Request.UserAgent.Contains("iPhone")
});
De esta forma, ya podemos organizar las vistas como podéis observar en la captura de pantalla de la derecha: cada dispositivo (o Display Mode registrado) dispondría de una carpeta en cuyo interior se encontrarían las vistas específicas para el mismo.Y observad que su funcionamiento no se limita a las vistas asociadas a controladores concretos, la solución también sería válida en vistas compartidas (Shared) y con aquellas incluidas en áreas :-)
Publicado en Variable not found.
Publicado por José M. Aguilar a las 9:18 a. m.
Etiquetas: asp.net, aspnetmvc, desarrollo, novedades, trucos