c# - tipo - ¿Cómo uso HttpWebRequest con el método GET?
webrequest post parameters c# (4)
¿Tiene sentido que una solicitud GET envíe un tipo de contenido? ¿Intentó eliminar la tercera línea?
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);
Recibo una excepción ProtocolViolationException
con el método "GET".
Editar: después de echar un vistazo usando Reflector, parece que hay una comprobación explícita para el método "OBTENER", si está configurado para arrojar la excepción.
Edit2: he actualizado mi código a lo siguiente, pero todavía arroja 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);
Lo cual arroja la excepción también.
Responder
El código anterior funciona, olvidé eliminar la línea Content-Type que causaba que se lanzara la excepción al final. +1 para retocar y responder a Jon.
El código de trabajo está ahora debajo:
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);
}
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 del método BeginGetRequestStream establece explícitamente que el método lanzará una ProtocolViolationException si el método es GET o HEAD.
Moral: lee los documentos ;-)
Esto está especificado en la documentación . Básicamente, las solicitudes GET no están destinadas a contener cuerpos, por lo que no hay una razón sensata para llamar a BeginGetRequestStream
.
Se especifica en la documentación para GetRequestStream que lanzará una ProtocolViolationException si el método es GET. Sin embargo, no puedo encontrar nada en la especificación HTTP que sugiera que esto es realmente una violación del protocolo HTTP. Considera esto un desafío.