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 ответа
Установите метод запроса для публикации перед вызовом GetRequestStream
лайк
request.Method = "POST";
using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII))
{
writer.Write("nick=" + username + "&password=" + password);
}
Я предполагаю, что проблема, с которой вы столкнулись, связана с тем фактом (как и другие), что вы выполняете запрос GET вместо запроса POST. Кроме того, я заметил, что фактическое имя для поля пароля на этой странице - "heslo", а не "пароль". Эта опечатка не заставит веб-сервер не возвращать ответ, но вызовет другие проблемы, так как сервер ищет конкретное имя переменной, которое будет опубликовано со значением пароля.
Вы также можете заранее определить общую длину того, что вы публикуете, и установить ее как ContentLength запроса. Смотрите MSDN:
ProtocolViolationException вызывается в нескольких случаях, когда свойства, заданные в классе HttpWebRequest, конфликтуют. Это исключение возникает, если приложение устанавливает для свойства ContentLength и свойства SendChunked значение true, а затем отправляет запрос HTTP GET. Это исключение возникает, если приложение пытается отправить чанк на сервер, который поддерживает только протокол HTTP 1.0, где это не поддерживается. Это исключение возникает, если приложение пытается отправить данные без установки свойства ContentLength, или SendChunked имеет значение false, когда буферизация отключена и для соединения keepalive (свойство KeepAlive имеет значение true).
Вот что работает для меня:
var request = WebRequest.Create(_url);
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential(_userName, _password);