2010-03-19 15 views
5

No tengo idea. Estoy tratando de obtener XML de un servicio REST en una aplicación que estoy creando para Windows Phone. Siempre tengo una excepción en la siguiente línea:¿Por qué recibo ProtocolViolationException cuando trato de usar HttpWebRequest?

HttpWebResponse response = request.EndGetResponse(ar) as HttpWebResponse; 

He la siguiente configuración (ignorar el mal url, es sólo un ejemplo ..)

HttpWebRequest request = WebRequest.Create("https://domain.chargify.com/customers.xml") as HttpWebRequest; 
NetworkCredential credentials = new NetworkCredential("appkeyhere", "password"); 
request.Credentials = credentials; 
request.Method = "GET"; 
request.ContentType = "text/xml"; 
request.BeginGetResponse(new AsyncCallback(SomeCallback), request); 
... 
private void SomeCallback(IAsyncResult ar) { 
    HttpWebRequest request = ar.AsyncState as HttpWebRequest; 
    HttpWebResponse response = request.EndGetResponse(ar) as HttpWebResponse; 
    StreamReader reader = new StreamReader(response.GetResponseStream()); 
    XElement xmlResult = XElement.Parse(reader.ReadToEnd()); 
    ... 
} 

La excepción es la siguiente:

System.Net.ProtocolViolationException was unhandled 
Message=ProtocolViolationException 
    StackTrace: 
     at System.Net.Browser.ClientHttpWebRequest.PrepareAndSendRequest(String method, Uri requestUri, Stream requestBodyStream, WebHeaderCollection headerCollection, CookieContainer cookieContainer) 
     at System.Net.Browser.ClientHttpWebRequest.BeginGetResponseImplementation() 
     at System.Net.Browser.ClientHttpWebRequest.InternalBeginGetResponse(AsyncCallback callback, Object state) 
     at System.Net.Browser.AsyncHelper.BeginOnUI(BeginMethod beginMethod, AsyncCallback callback, Object state) 
     at System.Net.Browser.ClientHttpWebRequest.BeginGetResponse(AsyncCallback callback, Object state) 
     at ChargifyWPA.MainPage.button1_Click(Object sender, RoutedEventArgs e) 
     at System.Windows.Controls.Primitives.ButtonBase.OnClick() 
     at System.Windows.Controls.Button.OnClick() 
     at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e) 
     at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e) 
     at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName) 

¿Alguien tiene alguna idea? Es https, no http ... ¿eso está causando el problema? Gracias.

+0

favor publique la excepción completa y muéstrenos dónde se produce la excepción. Además, en SomeCallback, debe colocar sus instancias IDisposable en el uso de bloques. HttpWebResponse, StreamReader e incluso Stream deben estar en bloques 'using', o se perderán recursos. –

+0

Agregué la excepción a mi pregunta ... y la modifiqué para usar bloques "usando", lo cual está bien. El problema todavía ocurre. – djbyter

+0

No estoy seguro si este es el lugar correcto para solicitarlo, pero ¿podría agregar la etiqueta de Windows-Phone-7 a esta publicación? – CACuzcatlan

Respuesta

8

Apuesto a que este problema se debe a que está configurando el encabezado 'ContentType', pero no proporciona contenido en su solicitud. Tenga en cuenta que se produce una excepción de protocolo al intentar crear la solicitud.

Probablemente desee establecer el encabezado 'Aceptar' en "texto/xml" en lugar del encabezado de tipo de contenido.

+0

Este fue el problema. Gracias Paul. – djbyter

0

Aparentemente, la causa más común de este error en el escritorio estos días es un servidor web que requiere SSL en lugar de autenticación TLS. Vea todos los comentarios en this article explaining troubleshooting options for various .NET 2 HTTP errors. Parece que su proyecto Chargify.NET con licencia de MIT en CodePlex ya es using this work-around ("SecurityProtocolType.Ssl3").

Otras opciones para intentar desde another article circa 2008 están volviendo a HTTP/1.0 o deshabilitan Keep-Alive.

Asegúrese de probar this answer, eliminando la inicialización de ContentType.

15

Este no es su problema, pero podría ayudar a otra persona. Me encontré con esto porque estaba llamando a BeginGetRequestStream() en una solicitud GET. Por supuesto, eso no es necesario y debería haber estado llamando a BeginGetResponse(). Error tonto, pero lo habría averiguado mucho más rápido si el mensaje de error hubiera sido más útil.

1

"ContentType" encabezado con "GET" provoca la excepción si está presente en la solicitud de En API Azure Tabla RESTO se requiere para codificar ContentType en la cabecera de autenticación sin embargo - utilizar cadena vacía para "ContentType" de cabecera del GET

Cuestiones relacionadas