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());
}
È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top