.NET

Bug en Subsonic 3.x al comparar instancias de objetos

He utilizado Subsonic de Rob Conery por varios años, desde sus primera version.

Es un ORM decente, hecho por un buen desarrollador. Subsonic ya no se desarrolla activamente (ahora se enfoca en Massive, su micro ORM), pero la ultima version, 3.0.0.4, sigue siendo utilizada por varios proyectos.

Hace algunas semanas desarrolle una funcionalidad nueva en un proyecto existente, que utilizaba Subsonic, y al estar probando la funcionalidad descubri un bug en Subsonic y la manera en que compara instancias de objetos de la misma clase, haciendo que siempre regrese false en una comparacion.

El codigo problema esta en el metodo Equals, generado por el template T4 de ActiveRecord de Subsonic:

public override bool Equals(object obj)
{
    if(obj.GetType()==typeof(Entity))
    {
        Entity compare=(Entity)obj;
        return compare.KeyValue()==this.KeyValue();
    }
    else
    {
        return base.Equals(obj);
    }
}

Y el metodo KeyValue hace esto:

public object KeyValue()
{
    return this.EntityId;
}

Al estar comparando dos objetos, este metodo es llamado, y si los objetos que se estan comparando son de la misma clase, ejecuta la linea

    return compare.KeyValue()==this.KeyValue();

El metodo KeyValue() simplemente regresa el valor del campo que este asignado como Id de la clase, ya sea un entero, un GUID, long, etc. El problema es que regresa el valor casteandolo a tipo object. Es decir, la siguiente comparacion regresara false, incorrectamente:

    bool testOne = (object)5 == (object)5; //this will return false

No importa que estamos comparando un valor constante, porque lo estamos casteando a ser de tipo object. La comparacion correcta seria comparar los objetos directamente (sin castearlos), o utilizando el metodo Equals de la misma clase.


    bool testTwo = 5.Equals(5); //this will return true, as we expect.

Entonces, para corregir el bug en Subsonic, se puede actualizar el template T4 de la siguiente manera:

public override bool Equals(object obj)
{
    if(obj.GetType()==typeof(<#=tbl.ClassName#>))
    {
        <#=tbl.ClassName#> compare=(<#=tbl.ClassName#>)obj;
        return compare.KeyValue().Equals(this.KeyValue());
    }
    else
    {
        return base.Equals(obj);
    }
}

Es decir, reemplazando la comparacion anterior (que usaba el operador ==) con una llamada explicita al metodo Equals de la instancia del objeto que estamos comparando.

Espero les sirva.

Como verificar con C# si un archivo existe en un servidor remoto, sin descargar el archivo

.NET logo

Con este codigo de C# se puede verificar si un archivo existe en un servidor remoto, sin bajarlo.

var request = WebRequest.Create(new Uri("http://www.site.com/file1.zip"));

request.Method = "HEAD";

try
{
	var response = request.GetResponse();
	Console.WriteLine("{0} - {1}", response.ContentLength, response.ContentType);
}
catch (WebException ex)
{
	var resp = (HttpWebResponse) ex.Response;

	if (resp.StatusCode == HttpStatusCode.NotFound)
	{
		Console.WriteLine("File does not exist");
	}

}

La diferencia es el uso del metodo HEAD en lugar de POST o GET. El metodo HEAD regresa exactamente los mismos Headers que un request tipo GET, con la excepcion de que no transfiere el message-body, o en este caso, el contenido del archivo en bytes. Este codigo funciona para verificar la existencia de archivos fisicos, o URLs virtuales (ya que no siempre un URL corresponde a un archivo fisico).

Una vez que obtenemos una respuesta, podemos verificar varias propiedades del archivo, como el tamaño (ContentLength) o el tipo (ContentType). Si el archivo no existe, el Framework va a lanzar una WebException, de la cual tomamos la propiedad Response y le podemos hacer un cast al tipo HttpWebResponse, para poder verificar el error especifico HTTP que el servidor arrojó. Si el codigo es 404, significa que el archivo no existe.

Espero les sirva.

Como ayudar a mejorar el .NET Framework

Últimamente, Microsoft ha dado mucho peso a las opiniones y sugerencias de los desarrolladores que usan el .NET Framework. Varios líderes de equipo de los diferentes bloques que componen el framework (ASP.NET, Entity Framework, WCF, WPF, etc) han utilizado redes sociales, blog posts y varios otros medios para solicitar retroalimentación de los usuarios de .NET sobre las nuevas funcionalidades del framework que han liberado, o sobre ideas y solicitudes para futuras funcionalidades.

Aquí les dejo las ligas a las páginas donde pueden votar por ideas o solicitudes de funcionalidades nuevas hechas por otros usuarios, o donde hasta ustedes mismos pueden crear una nueva solicitud. Esto ayuda a Microsoft a enterarse de cuales funcionalidades o cualidades nuevas los programadores desean que estén incluidas en el framework.

A votar!

Curso de ASP.NET MVC 3 de Pluralsight gratis gracias a Microsoft

Scott Guthrie simplemente sigue produciendo cosas geniales…

Hace unos días, Scott anunció que Microsoft logró un acuerdo con Pluralsight para que abrieran de forma gratuita su curso en linea de ASP.NET MVC 3, pero solo hasta Marzo 18.

El curso sobre los siguientes temas principalmente:

  • Introducción a ASP.NET MVC 3
  • Razor View Engine (ya no se siente mas el spaguetti-code feeling)
  • Controllers
  • Models
  • NuGet (so cool)
  • Dependency Resolucion

Aprovechen y vean el curso. Llevo poco aprendiendo ASP.NET MVC pero ya me gusta suficiente como para dejar WebForms…

Espero les sirva.

Liga: Curso de ASP.NET MVC 3 gratis

1 2 3 8  Scroll to top