Blog de Francisco Velázquez

otro blog personal

Posts Tagged ‘http

Simple HTTP GET en C#

leave a comment »

La verdad es que, a veces, cosas sencillas se hacen  complicadas en .NET y en mi opinión esta es una de ellas. Nada que objetar a que un framework tiene que ser lo menos restrictivo posible, pero en este caso no encuentro el sentido de que un error HTTP tenga que lanzar una excepción, yo personalmente la definiría como excepción vexing. Y bueno como estamos para ayudar pues con esta pequeña función todo será un poco más sencillo.

        public static int Get(string uri, int timeout, out string response)
        {
            int statusCode = -1;
            response = string.Empty;

            HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;
            request.KeepAlive = false;
            request.Timeout = timeout;

            try
            {
                using (HttpWebResponse res = (HttpWebResponse)request.GetResponse() as HttpWebResponse)
                {
                    statusCode = (int)res.StatusCode;
                    using (Stream dataStream = res.GetResponseStream())
                    {
                        using (StreamReader reader = new StreamReader(dataStream))
                        {
                            response = reader.ReadToEnd();
                        }
                    }
                }
            }
            catch (WebException wex)
            {
                //http://msdn.microsoft.com/en-us/library/es54hw8e.aspx
                if (wex.Status == WebExceptionStatus.ProtocolError)
                {
                    // If status is WebExceptionStatus.ProtocolError,
                    // there has been a protocol error and a WebResponse
                    // should exist. Display the protocol error.
                    using (HttpWebResponse res = wex.Response as HttpWebResponse)
                    {
                        if (res != null)
                        {
                            statusCode = (int)res.StatusCode;

                            using (Stream s = wex.Response.GetResponseStream())
                            using (StreamReader reader = new StreamReader(s))
                            {
                                response = reader.ReadToEnd();
                            }
                        }
                        else
                        {   // no http status code available
                            throw wex;
                        }
                    }
                }
                else
                {   // no http status code available
                    throw wex;
                }
            }

            return statusCode;
        }

Cuanto más veo ese código, menos me gusta como está diseñado.
Un par de enlaces.

Written by fravelgue

July 19, 2011 at 7:27 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 , , , ,

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