2008-10-31 23 views
28

tengo el siguiente código, que funciona muy bien cuando el método es "POST", pero cambiando a "GET" no funciona:¿Cómo uso HttpWebRequest con el método GET

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); 

Puedo obtener un ProtocolViolationException excepción con el método "GET".

Editar: Después de echar un vistazo utilizando Reflector, parece que hay una comprobación explícita para el método "OBTENER", si está configurado para que arroje la excepción.

Edit2: He actualizado mi código a la siguiente, pero todavía se produce una excepción cuando llamo 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); 

Lo cual arroja la excepción también.

respuesta

El código anterior funciona ahora, me había olvidado de sacar la línea Content-Type que estaba causando la excepción de ser arrojado al final. +1 a tweakt & respuesta a Jon.

El código de trabajo está ahora por debajo de:

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); 
} 
+0

¿Sigue siendo una excepción de ProtocolViolation? ¿Puedes producir un programa corto pero completo que demuestre el problema? ¿Has mirado el cable (por ejemplo, con Wireshark) para ver qué está sucediendo? –

+0

Gracias por las actualizaciones ... eso solucionó mi problema también. – TravisWhidden

+0

Esos dos métodos son completamente diferentes: 'BeginGetResponse' es para hacer la solicitud web, mientras' BeginGetRequestStream' es para escribir los datos en la transmisión. –

Respuesta

12

Esto es specified in the documentation. Básicamente, las solicitudes GET no están destinadas a contener cuerpos, por lo que no hay motivos razonables para llamar al BeginGetRequestStream.

+1

OK, está bien, ¿cómo uso HttpWebRequest con el método GET? Realmente no quiero tener 2 rutas lógicas dependiendo de si es GET/POST (usando WebClient para GET). –

+1

Solo busca la secuencia de solicitud si tienes un cuerpo. Si tienes un cuerpo y estás haciendo una solicitud GET, tu error está en otra parte. –

+0

No hay cuerpo, pero sí necesito obtener la secuencia de solicitud, ya que obtengo el resultado de una API de REST. –

5

¿Tiene sentido para una solicitud GET para enviar un Content-Type? ¿Intentó eliminar la tercera línea?

+0

cuando se trata de phone7, en particular, esta es una respuesta relevante. el hecho de configurar contentType en una solicitud GET dará como resultado una excepción de violación de protocolo al completar la solicitud. –

1

BeginGetRequestStream se utiliza para obtener una secuencia específica para escribir datos en la solicitud. Esto no es aplicable a las solicitudes GET.

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

Moral: leer los documentos ;-)

1

Se especifica en la documentación de la GetRequestStream que va a lanzar una ProtocolViolationException si el método es GET. Sin embargo, no puedo encontrar nada en el HTTP spec para sugerir que esto es realmente una violación del protocolo HTTP. Considera esto un desafío.

Cuestiones relacionadas