HttpWebRequest con https in C #
-
23-08-2019 - |
Domanda
Questo pezzo di codice non funziona; è login nel sito web che utilizza il protocollo HTTPS. Come risolvere questo problema? Il codice si ferma a GetRequestStream()
qualsiasi momento ovunque dicendo che un'eccezione di violazione di protocollo è gestita ..
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());
}
Soluzione
Imposta metodo di richiesta di inviare, prima di chiamare GetRequestStream
come
request.Method = "POST";
using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII))
{
writer.Write("nick=" + username + "&password=" + password);
}
Altri suggerimenti
La mia ipotesi è che il problema riscontrato è dovuto al fatto (come altri hanno consigliato) che si sta facendo una richiesta GET invece di una richiesta POST. Inoltre, ho notato che il nome effettivo per il campo della password in quella pagina è "Heslo" e non "password". Questo errore di battitura non causerà il server web di non restituire una risposta, ma sarà causare altri problemi dal momento che il server è in cerca di quello specifico nome di variabile per essere pubblicato con il valore della password.
Si potrebbe anche voler capire la lunghezza totale di ciò che si sta inviando, in anticipo, e impostare che come ContentLength della richiesta. Vedere MSDN :
Un ProtocolViolationException è gettato in diversi casi quando le proprietà impostate sulla HttpWebRequest classe sono in conflitto. Questa eccezione si verifica se un'applicazione imposta il Proprietà ContentLength e la proprietà SendChunked true, e quindi invia un HTTP GET richiesta. Questa eccezione si verifica se un'applicazione tenta di inviare Chunked a un server che supporta solo il protocollo HTTP 1.0, in cui questo non è supportato. Questa eccezione si verifica se un un'applicazione tenta di inviare i dati senza impostare la proprietà ContentLength o del SendChunked è falsa quando il buffering è disattivato e su una connessione keepalive (la proprietà KeepAlive è vero).
Ecco ciò che funziona per me:
var request = WebRequest.Create(_url);
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential(_userName, _password);