Blog de Francisco Velázquez

otro blog personal

Posts Tagged ‘c#

Mini-ORMs

with one comment

Desde que se publicara Massive, que a mí personalmente me impresionó. Han aparecido algunos mini-orms, como PetaPoco o Dapper.Net (usado en stackoverflow). Realmente lo podríamos llamar la capa de acceso a datos tradicional, pero que con la nueva funcionalidad de C# todo es más fácil. Una evolución de AutoMapper.


public static List<T> AutoMap<T>(this IDataReader dr)
 where T : new()
 {
 Type businessEntityType = typeof(T);
 List<T> entitys = new List<T>();
 Hashtable hashtable = new Hashtable();
 PropertyInfo[] properties = businessEntityType.GetProperties();

 foreach (PropertyInfo info in properties)
 {
 hashtable[info.Name.ToUpper()] = info;
 }

 while (dr.Read())
 {
 T newObject = new T();
 for (int index = 0; index < dr.FieldCount; index++)
 {
 PropertyInfo info = (PropertyInfo)hashtable[dr.GetName(index).ToUpper()];
 if ((info != null) && info.CanWrite)
 {
 info.SetValue(newObject, dr.GetValue(index), null);
 }
 }
 entitys.Add(newObject);
 }
 dr.Close();
 return entitys;
 }

Creo que es esto es otra muestra del rechazo a la over-engineering.

Written by fravelgue

April 6, 2011 at 9:08 pm

Posted in development

Tagged with , ,

IIS7 Request no disponible en Application_Start

leave a comment »

Este estupendo cambio me ha producido una perdida de varias horas al pasar una aplicación a un servidor con IIS7. Por otro lado seré alguna vez capaz de usar la depuración remota.

Written by fravelgue

March 4, 2010 at 11:57 pm

Posted in development

Tagged with , , ,

Basic Authentication en HTTP Post

leave a comment »

string uri = string.Empty, user = string.Empty, password = string.Empty, postData = string.Empty, responseData = string.Empty;
            string encodedAuthorization = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(user + ":" + password));
HttpWebRequest webRequest = WebRequest.Create(uri) as HttpWebRequest;
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.Headers = new WebHeaderCollection();
webRequest.Headers.Add("Authorization: Basic "+encodedAuthorization);

using (StreamWriter rw = new StreamWriter(webRequest.GetRequestStream()))
{
            rw.Write(postData);
}

using (StreamReader sr = new StreamReader(webRequest.GetResponse().GetResponseStream()))
{
            responseData = sr.ReadToEnd();
}

Written by fravelgue

February 10, 2010 at 10:58 pm

Posted in development

Tagged with , , , ,

Enumerados mejorados en C#

leave a comment »

Un par de artículos que explican como extender la funcionalidad de los Enumerados en c#. via.

Written by fravelgue

October 28, 2009 at 11:06 pm

Posted in development

Tagged with , , ,

Enumerados y Atributos

leave a comment »

Siempre me ha encantado la manera en que Gentle.NET maneja los errores, usando enumerados y atributos.

	/// <summary>
	/// This enumeration lists all common error conditions, their severity and a
	/// default error message.
	/// Unspecified errors or errors with no severity attribute are treated as critical.
	/// At this time almost all errors have been brainlessly classified as critical pending
	/// a review at some future time.
	/// </summary>
	public enum Error
	{
		/// <summary>
		/// This error is used when no connection to the database server could be
		/// established. This is usually caused by errors in the connection
		/// string, but can also be due to network or database server problems.
		/// </summary>
		[Level( Severity.Critical ),
		 Message( "The database backend (provider {0}) could not be reached.\r\n" +
		          "Check the connection string: {1}" )]
		DatabaseUnavailable,

		/// <summary>
		/// This error is used when an error in the use of Gentle was detected
		/// (e.g. invalid use of or missing custom attributes). No default message
		/// is provided for this error (if used via the Check class the first
		/// argument will be used as format string for remaining arguments).
		/// </summary>
		[Level( Severity.Error )]
		DeveloperError

Hoy he estado usando esta técnica en un proyecto.  Además he encontrado esta librería que también me ha servido de inspiración.

Written by fravelgue

September 8, 2009 at 4:30 pm

Posted in development

Tagged with , , , ,

Serialización Binaria en .Net: Protocol Buffers

leave a comment »

Debido a un proyecto en el que estoy ahora mismo estoy evaluando la serialización binaria en lugar de la habitual en XML. Parece que la implementación a través de BinaryFormatters no es la más adecuada. Parecen muy interesantes las implementaciones de Protocol Buffers que existen, tanto la de Jon Sket, de la que ya hablamos, tanto com la de Marc Grawell. Podemos ver en que se diferencia en este hilo de stackoverflow.

Written by fravelgue

July 13, 2009 at 12:42 pm

HttpWebRequest Timeout in HTTP Get

leave a comment »

En estos últimos días he tenido un problema bastante curioso. Era una aplicación multi-hilo (50 hilos simultáneos de ejecución) que realizaba peticiones HTTP Get a distintos servidores. El problema es que se presentaban bastante timeouts en las peticiones HTTP y sin embargo el servidor estaba en un correcto funcionamiento.

El código era algo como esto:

public static string Get2(string uri)
{
    string responseData = string.Empty;
    WebRequest request = WebRequest.Create(uri) as HttpWebRequest;
    request.Method = "GET";
    request.Timeout = 35000;
    using(HttpWebResponse response = (HttpWebResponse)request.GetResponse() as HttpWebResponse)
    {
        using(Stream dataStream = response.GetResponseStream ())
        {
            using(StreamReader reader = new StreamReader (dataStream))
            {
                responseData = reader.ReadToEnd();
            }
        }
    }
    return responseData;
}

Tras buscar, encontré bastantes links y este bastante interesante.

El problema era que .NET sólo permite 2 conexiones HTTP a cada sitio, tal y como establece el el protocolo HTTP1.1. Para aumentar este número, lo único que hace falta es incluir esta configuración en el app.config o web.config.

<connectionManagement>
<addaddress="*"maxconnection="40"/>
</connectionManagement>

Written by fravelgue

June 30, 2009 at 1:17 pm