Pregunta

Esta pieza de código no funciona; que está en el registro en el sitio Web que está utilizando 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 ..

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());
}
¿Fue útil?

Solución

Conjunto método de solicitud para publicar, antes de llamar a GetRequestStream

como

request.Method = "POST";

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

Otros consejos

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, me di cuenta de que el nombre real para el campo de la contraseña en esa página es "heslo" y no "contraseña". Esta errata no hará que el servidor web para que no devolver una respuesta, pero va a causar otros problemas ya que el servidor está en busca de ese nombre de la variable específica para ser publicado con el valor de la contraseña.

También puede ser que desee averiguar la longitud total de lo que estás enviando, de antemano, y establecer que a medida que la ContentLength de la solicitud. Ver MSDN :

  

A ProtocolViolationException se lanza en varios casos en los que las propiedades establecidas en el   HttpWebRequest clase son contradictorios. Esta excepción se produce si una aplicación establece la   ContentLength propiedad y la propiedad SendChunked en true y, a continuación, envía un HTTP GET   solicitud. Esta excepción se produce si una aplicación intenta enviar fragmentada a un servidor que   solamente soporta el protocolo HTTP 1.0, cuando esto no es compatible. Esta excepción se produce si una   aplicación intenta enviar datos sin establecer la propiedad ContentLength o la   SendChunked es falsa cuando el búfer está desactivado y en una conexión de mantenimiento de conexión (la   propiedad KeepAlive es cierto).

Esto es lo que funciona para mí:

    var request = WebRequest.Create(_url);
    request.PreAuthenticate = true;
    request.Credentials = new NetworkCredential(_userName, _password);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top