HttpWebRequest par https en C #
-
23-08-2019 - |
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());
}
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);