2010-10-20 93 views
68

Acabo de recibir esta excepción (ProtocolViolationException) en mi aplicación .NET 2.0 (que se ejecuta en el emulador estándar de Windows Mobile 6). Lo que me confunde es que, hasta donde yo sé, no he agregado ningún cuerpo de contenido, a menos que lo haya hecho inadvertidamente de alguna manera. Mi código está debajo (muy simple). ¿Hay algo más que deba hacer para convencer a .NET de que solo se trata de un http GET?No puedo enviar un cuerpo de contenido con este tipo de verbo

Gracias, Brian

//run get and grab response 
WebRequest request = WebRequest.Create(get.AbsoluteUri + args); 
request.Method = "GET"; 
Stream stream = request.GetRequestStream();   // <= explodes here 
XmlTextReader reader = new XmlTextReader(stream); 

Respuesta

111

no consiguen la corriente de petición de, sencillamente. Las solicitudes GET no normalmente tienen cuerpos (aunque es not technically prohibited by HTTP) y WebRequest no lo admite, pero para eso sirve la llamada GetRequestStream, que proporciona los datos del cuerpo para la solicitud.

Teniendo en cuenta que usted está tratando de leer de la corriente, que me parece que realmente desea obtener la respuesta y leer la secuencia de respuesta a partir de que:

WebRequest request = WebRequest.Create(get.AbsoluteUri + args); 
request.Method = "GET"; 
using (WebResponse response = request.GetResponse()) 
{ 
    using (Stream stream = response.GetResponseStream()) 
    { 
     XmlTextReader reader = new XmlTextReader(stream); 
     ... 
    } 
} 
+0

De hecho, eso es exactamente lo que quería hacer. Gracias. –

+10

Técnicamente, las solicitudes GET pueden tener cuerpos, pero .NET no admite la generación de solicitudes GET con cuerpos. http://stackoverflow.com/questions/2064281/sending-post-data-with-get-request-valid – mhud

+1

@mhud: Gracias, editaré. –

2

Porque no lo hiciste no especifique el encabezado

He añadido un ejemplo extendido:

var request = (HttpWebRequest)WebRequest.Create(strServer + strURL.Split('&')[1].ToString()); 

Cabecera (ref solicitud, p_Method);

Y el método Header:

private void Header(ref HttpWebRequest p_request, string p_Method) 
{ 
    p_request.ContentType = "application/x-www-form-urlencoded"; 
    p_request.Method = p_Method; 
    p_request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE)"; 
    p_request.Host = strServer.Split('/')[2].ToString(); 
    p_request.Accept = "*/*"; 
    if (String.IsNullOrEmpty(strURLReferer)) 
    { 
     p_request.Referer = strServer; 
    } 
    else 
    { 
     p_request.Referer = strURLReferer; 
    } 
    p_request.Headers.Add("Accept-Language", "en-us\r\n"); 
    p_request.Headers.Add("UA-CPU", "x86 \r\n"); 
    p_request.Headers.Add("Cache-Control", "no-cache\r\n"); 
    p_request.KeepAlive = true; 
} 
-3

establezca el tipo de solicitud de contenido antes de leer la secuencia de respuesta;

request.ContentType = "text/xml"; 
Cuestiones relacionadas