Blog de Francisco Velázquez

otro blog personal

Posts Tagged ‘asp.net

ASP.NET WebPages Optimizar el uso de strings

leave a comment »

Interesante optimización del equipo de WebPages para mejorar como se renderizan las páginas.

Instead of creating a string from the StringWriter (_tempWriter) we will copy the underlying buffer in chunks to the output text buffer. For large pages this both reduces the total allocations to 1KB as well as avoid getting into the large object heap.

Este es un problema común en código manejado cuando se usan cadenas.

Written by fravelgue

August 13, 2014 at 4:00 pm

Posted in development

Tagged with , , ,

QueryString Helper

leave a comment »

Muy a menudo tengo que consultar los valores de las QueryStrings, y la verdad es que es horrible el montón de comprobaciones que hay que hacer. Además muchas veces, wap proxies o adsevers incluyen caracteres en la querystring, haciendo que los parsers lancen excepciones.

public static class Extensions
{
private static readonly Regex LeadingInteger = new Regex(@"^(-?\d+)");

public static T Get<T>(this System.Collections.Specialized.NameValueCollection nvc, string key)
where T : IConvertible
{
T obj = default(T);

if (nvc == null || string.IsNullOrEmpty(nvc[key]))
return default(T);

string v = nvc[key];

if (typeof(T) == typeof(Guid))
v = v.Substring(0, 36);

if (typeof(T) == typeof(int))
{   //http://stackoverflow.com/a/975512/22055
Match match = LeadingInteger.Match(v);
if (!match.Success)
v = match.Value;
else
return default(T);
}

try
{
obj = (T)Convert.ChangeType(v, typeof(T));
}
catch { }
return obj;
}
}

A veces, echo de menos las facilidades de lenguajes dinámicos como JS, por ejemplo, en el parseInt

Written by fravelgue

May 24, 2012 at 6:41 pm

Posted in development

Tagged with , ,

Modificar el valor de Request.Param o QueryString

with one comment

Hace unos días necesité modificar el valor de Request.Param y de la QueryString en una página ASP.NET. Parece que no es algo común pero sin embargo, había gente que también había necesitado hacerlo.

La manera de hacerlo fue usando un HttpModule y usando un poco de Reflection. La verdad algo bastante sencillo de hacer y con un buen resultado.

    public class ChangeParamsModule : IHttpModule
    {
        public void Dispose()
        {
            throw new NotImplementedException();
        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += (sender, e) =>
            {
                HttpApplication httpContext = (HttpApplication)sender;
                // reflect to getting readonly property
                PropertyInfo isReadOnly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);

                // make collection editable
                isReadOnly.SetValue(httpContext.Request.QueryString, false, null);
                isReadOnly.SetValue(httpContext.Request.Params, false, null);

                httpContext.Request.QueryString.Set("nuevoParam", "nuevoValor");
                httpContext.Request.Params.Set("nuevoParm", "nuevoValor");

                // make collection readonly again
                isReadOnly.SetValue(httpContext.Request.QueryString, true, null);
                isReadOnly.SetValue(httpContext.Request.Params, true, null);
            };
        }
    }

Written by fravelgue

October 19, 2011 at 5:47 pm

ASP.NET sirviendo contenido estático

leave a comment »

Dos interesantes propuestas para mejorar el rendimiento de nuestras aplicaciones ASP.NET, y del mismo blog, al que habrá que echarle un ojo.

Cargar contenido estático de otro dominio de forma automática.

Eliminar las cookies de contenido estático.

Si a esto le añadimos un proxy inverso delante de nuestro IIS, ganaremos bastante en rendimiento.

Written by fravelgue

October 19, 2011 at 5:37 pm

Posted in development

Tagged with , ,

ASP.NET SessionState Cookieless

leave a comment »

Llevo varios días intentando modificar el comportamiento de cookieless en la sesión. Comencé queriendo heredar SessionIDManager pero los métodos virtuales expuestos no lo permiten. Después intenté desarrollar mi propio SessionStateModule y aunque es posible, la verdad, es que la mayoría de la funcionalidad es interna o privada. A pesar de tener el código de mono y haber investigado mucho con reflector no he podido encontrar la solución todavía.

Pienso que esta parte del framework no esta lo suficientemente clara y el abuso de internal y private sólo intentan ocultar una mala implementación.

El equipo de MVC se vangloria de lo extensible que es su framework, pues valdría la pena que le echaran un vistazo a esta parte del framework. Porque la verdad no termino de enterder porque no es posible realizar esto de una manera sencilla.

Written by fravelgue

October 14, 2011 at 4:00 pm

Vulnerabilidad en ASP.NET

leave a comment »

Ha aparecido una vulnerabilidad importante en ASP.NET. Ha llegado a sitios generalistas (como alt1040) que cubren la noticia con sensacionalismo y medias verdades. Supongo que habrán cogido la costumbre de los telediarios.

Aunque para mi lo más sorprendente es encontrar un post de ScottGu, detallando los pasos para evitarla. Esperamos que pronto saquen un parche para completar de solucionarlo.

Written by fravelgue

September 19, 2010 at 7:18 pm

Posted in development

Tagged with ,

Gestión de sesiones en ASP.NET para Mobile Web

with 2 comments

Cuando se realiza un desarrollo de Mobile Web nos enfrentamos con unos problemas y algunas ventajas con respecto a la web de escritorio. En este post vamos a ofrecer una mejora en el gestor de sesiones web de ASP.NET.

La mayoría de los problemas que se nos presentarán, vienen por los WAP proxies que instalan los operadores o bien por otros transcoders externos como los de Google. Uno de los problemas que se presentan es que algunos no soportan cookies y por lo tanto nuestras sesiones se pierden.

Sin embargo, como hemos dicho no todo son problemas también tenemos herramientas de identificación de usuario y demás sistemas de cobro integrados con la factura de teléfono. Estos servicios pueden ser ofrecidos por los propios operadores o por diversos agregadores. La mayoría de estos sistemas tienen en común que de alguna u otra manera se debe realizar una redirección al usuario (consumidor) a su servicio para que ellos confirmen la identidad del usuario y redirijan de nuevo a nuestra aplicación.

Bueno como se puede imaginar nuestro gestor de sesiones va a ser una variación de cookieless, en la cual vamos a usar una Guid para identificar la sesión, por simplificar este identificador será el ID del consumidor, que estará persistido en base de datos. Por tanto, la idea será  heredar de SessionIDManager.

public class SessionIdManager : System.Web.SessionState.SessionIDManager
    {
        public override string CreateSessionID(System.Web.HttpContext context)
        {
            CarrierIdentificator identificator = new CarrierIdentificator();
            Guid sessionId = Guid.Empty;

            IConsumer consumer = CookieHelper.Get(context);

            if (consumer == null)
                consumer = identificator.Get(context);

            if (consumer != null)
                sessionId = consumer.Id;

            CookieHelper.Save(context, consumer);

            return sessionId.ToString("N");
        }

        public override bool Validate(string id)
        {
            // TODO validate session
        }
    }

También tendremos que registrar el session manager:

<system.web> 
        <sessionState cookieless="true" sessionIDManagerType="namespace.SessionIdManager" />
        ....
</system.web> 

Written by fravelgue

July 5, 2010 at 6:17 pm

Posted in development

Tagged with , , ,