Question

Ce morceau de code ne fonctionne pas; il est la connexion dans le site Web qui utilise le protocole https. Comment résoudre ce problème? Le code arrête à tout moment GetRequestStream() dire que partout exception de violation du protocole est unhandled ..

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());
}
Était-ce utile?

La solution

Définir la méthode de requête à la poste, avant d'appeler GetRequestStream

comme

request.Method = "POST";

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

Autres conseils

Je pense que le problème que vous rencontrez est dû au fait (comme d'autres ont conseillé) que vous faites une requête GET au lieu d'une requête POST. De plus, je remarque que le nom réel du champ de mot de passe sur cette page est « heslo » et non « mot de passe ». Cette faute de frappe ne causera pas le serveur Web de ne pas renvoyer une réponse, mais il causera d'autres problèmes car le serveur est à la recherche de ce nom de variable spécifique à la valeur affichée par mot de passe.

Vous pouvez également déterminer la longueur totale de ce que vous publiez, au préalable, et définir que la ContentLength de la demande. Voir MSDN :

  

A ProtocolViolationException est jeté dans plusieurs cas, lorsque les propriétés définies sur le   HttpWebRequest classe sont contradictoires. Cette exception se produit si une application définit la   la propriété et la propriété ContentLength SendChunked true, et envoie ensuite un HTTP GET   demande. Cette exception se produit si une application tente d'envoyer Chunked à un serveur   ne prend en charge le protocole HTTP 1.0, si cela n'a pas été pris en charge. Cette exception se produit si un   application tente d'envoyer des données sans définir la propriété ContentLength ou   SendChunked est faux lorsque ce tampon est désactivé et une connexion keepalive (la   propriété KeepAlive est vrai).

Voici ce qui fonctionne pour moi:

    var request = WebRequest.Create(_url);
    request.PreAuthenticate = true;
    request.Credentials = new NetworkCredential(_userName, _password);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top