Вопрос

Этот фрагмент кода не работает;это вход на сайт, использующий протокол 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());
}
Это было полезно?

Решение

Установите метод запроса для публикации перед вызовом GetRequestStream.

нравиться

request.Method = "POST";

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

Другие советы

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

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

Протоколвиолитация Exception бросается в нескольких случаях, когда свойства, установленные на классе httpwebrequest, противоречивы.Это исключение происходит, если приложение устанавливает свойство ContentLength и свойство SendChunked на True, а затем отправляет запрос HTTP GET.Это исключение возникает, если приложение пытается отправить кучу на сервер, который поддерживает только протокол HTTP 1.0, где это не поддерживается. Это исключение происходит, если приложение пытается отправить данные без настройки свойства ContentLength Или SendChunked является ложным при отключении буферизации и на подключении к Keepalive (свойство Keepalive верно).

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

    var request = WebRequest.Create(_url);
    request.PreAuthenticate = true;
    request.Credentials = new NetworkCredential(_userName, _password);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top