HttpWebRequest с https в C#

этот фрагмент кода не работает; он входит на веб-сайт, который использует протокол https. Как решить эту проблему? Код останавливается на GetRequestStream() в любое время в любом месте, говоря, что исключение нарушения протокола необработано..

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());
}

4 ответов


установить метод запроса для post перед вызовом GetRequestStream

как

request.Method = "POST";

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

Я предполагаю, что проблема, которую вы испытываете, связана с тем фактом (как и другие советовали), что вы делаете запрос GET вместо запроса POST. Кроме того, я заметил, что фактическое имя поля пароля на этой странице - "heslo", а не "password". Эта опечатка не приведет к тому, что веб-сервер не вернет ответ, но это вызовет другие проблемы, так как сервер ищет имя конкретной переменной для публикации со значением пароля.


вы также можете выяснить общую длину того, что вы публикуете, заранее и установить это как ContentLength запроса. См.MSDN:

в ProtocolViolationException выдается в нескольких случаях, когда свойства, установленные в Класс HttpWebRequest конфликтует. Это исключение возникает, если приложение устанавливает ContentLength свойство и sendchunked свойство true, а затем отправляет HTTP GET запрос. Это исключение происходит, если приложение пытается отправить chunked на сервер, который поддерживает только протокол HTTP 1.0, где это не поддерживается. это исключение возникает, если приложение пытается отправить данные без установки свойства ContentLength или SendChunked имеет значение false, когда буферизация отключена и при подключении keepalive ( Свойство KeepAlive имеет значение true).


вот что работает для меня:

    var request = WebRequest.Create(_url);
    request.PreAuthenticate = true;
    request.Credentials = new NetworkCredential(_userName, _password);