¿Cómo uso HttpWebRequest con el método GET?

Tengo el siguiente código que funciona bien cuando el método es “POST”, pero cambiar a “GET” no funciona:

HttpWebRequest request = null; request = HttpWebRequest.Create(uri) as HttpWebRequest; request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; request.Method = "POST"; // Doesn't work with "GET" request.BeginGetRequestStream(this.RequestCallback, null); 

Obtengo una excepción ProtocolViolationException con el método “GET”.

Edición: Después de echar un vistazo utilizando Reflector, parece que hay una comprobación explícita del método “GET”, si está configurado para que arroje la excepción.

Edit2: Actualicé mi código a lo siguiente, pero todavía produce una excepción cuando llamo a EndGetResponse ()

 if (request.Method == "GET") { request.BeginGetResponse(this.ResponseCallback, state); } else { request.BeginGetRequestStream(this.RequestCallback, state); } 

En mi función, ResponseCallback, tengo esto:

 HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult); 

Que lanza la excepción también.

Responder

El código anterior ahora funciona, me había olvidado de sacar la línea Content-Type que causaba que se lanzara la excepción al final. +1 a tweakt y responder a Jon.

El código de trabajo está ahora abajo:

 HttpWebRequest request = null; request = HttpWebRequest.Create(uri) as HttpWebRequest; request.Method = "GET";// Supports POST too if (request.Method == "GET") { request.BeginGetResponse(this.ResponseCallback, state); } else { request.BeginGetRequestStream(this.RequestCallback, state); } 

Esto se especifica en la documentación . Básicamente, las solicitudes GET no están diseñadas para contener cuerpos, por lo que no hay una razón sensata para llamar a BeginGetRequestStream .

¿Tiene sentido que una solicitud GET envíe un tipo de contenido? ¿Intentaste quitar la tercera línea?

BeginGetRequestStream se usa para obtener una transmisión específica para escribir datos en la solicitud. Esto no es aplicable a las solicitudes GET.

La documentación para el método BeginGetRequestStream establece explícitamente que el método lanzará una excepción ProtocolViolationException si el método es GET o HEAD.

Moral: leer los documentos 😉

Se especifica en la documentación para GetRequestStream que lanzará una excepción ProtocolViolationException si el método es GET. Sin embargo, no puedo encontrar nada en la especificación de HTTP que sugiera que esto sea realmente una violación del protocolo HTTP. Considera esto como un reto.