2009-02-12 13 views
9

Este fragmento de código no funciona; está iniciando sesión en el sitio web que utiliza el protocolo https. ¿Cómo resolver este problema? El código se detiene en cualquier momento y lugar GetRequestStream() diciendo que la excepción no controlada es la violación del protocolo ..HttpWebRequest con https en C#

string username = "user"; 
string password = "pass"; 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://moje.azet.sk/prihlasenie.phtml?KDE=www.azet.sk%2Findex.phtml%3F"); 
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)"; 

Console.WriteLine(request.GetRequestStream()); 

using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII)) 
{ 
    writer.Write("nick=" + username + "&password=" + password); 
} 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
//Retrieve your cookie that id's your session 
//response.Cookies 

using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    Console.WriteLine(reader.ReadToEnd()); 
} 
+2

que no tienen privilegios de edición, pero hay que confundir las variables de usuario y contraseña en el ejemplo de código. Intenté iniciar sesión en el sitio y me consiguieron. – regex

+0

Reemplazado por "usuario" y "pase" – Rytmis

+6

También debe cambiar su contraseña en el sitio ya que las credenciales todavía están en el historial de edición de esta pregunta. –

Respuesta

5

Conjunto método de petición para enviar, antes de llamar a GetRequestStream

como

request.Method = "POST"; 

using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII)) 
{ 
    writer.Write("nick=" + username + "&password=" + password); 
} 
1

También puede ser que desee figura la longitud total de lo que está publicando, de antemano, y establecer eso como la longitud del contenido de la solicitud. Ver MSDN:

Un ProtocolViolationException se lanza en varios casos en los que las propiedades establecidas en la clase HttpWebRequest son contradictorios. Esta excepción se produce si una aplicación establece la propiedad ContentLength y la propiedad SendChunked en true y luego envía una solicitud HTTP GET . Esta excepción se produce si una aplicación intenta enviar fragmentados a un servidor que solo admite el protocolo HTTP 1.0, donde esto no es compatible. Esta excepción se produce si una aplicación intenta enviar datos sin establecer la propiedad ContentLength o SendChunked es falsa cuando el almacenamiento en búfer está deshabilitado y en una conexión keepalive (la propiedad KeepAlive es verdadera).

+0

¿Debería hacer el control "strlen"? – Skuta

+0

@skuta - Aquí hay un ejemplo de msdn en http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.contentlength.aspx – Ramesh

3

Mi conjetura es que el problema que está experimentando es debido al hecho (como otros han aconsejado) que usted está haciendo una petición GET en lugar de una solicitud POST. Además, noté que el nombre real para el campo de contraseña en esa página es "heslo" y no "contraseña". Este error no causará que el servidor web no devuelva una respuesta, pero causará otros problemas ya que el servidor está buscando ese nombre de variable específico que se publicará con el valor de la contraseña.

+0

Thx, tengo un problema más, no estoy seguro si debería hacer otra pregunta. ¿Cómo puedo continuar "obteniendo datos de diferentes páginas del mismo servidor usando la misma" cookie y datos registrados "? – Skuta

+1

@Skuta: vea HttpWebRequest.CookieContainer: http://msdn.microsoft.com/en- us/library/system.net.httpwebrequest.cookiecontainer.aspx – Rytmis

0

Esto es lo que funciona para mí:

var request = WebRequest.Create(_url); 
    request.PreAuthenticate = true; 
    request.Credentials = new NetworkCredential(_userName, _password); 
Cuestiones relacionadas