2009-02-12 5 views
9

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

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

Я не редактировать привилегированности, но вы должны запутать имя пользователя и пароль переменные в примере кода. Я просто попробовал войти на сайт, и они меня забрали. – regex

+0

Заменили их «пользователем» и «пропуском» – Rytmis

+6

Вы также должны изменить свой пароль на сайте, так как учетные данные все еще находятся в истории изменений этого вопроса. –

ответ

5

Установить метод запроса на сообщение, перед вызовом GetRequestStream

как

request.Method = "POST"; 

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

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

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

+0

Должен ли я просто выполнить проверку «strlen»? – Skuta

+0

@skuta - Вот пример из msdn по адресу http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.contentlength.aspx – Ramesh

3

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

+0

Thx, у меня есть еще одна проблема, не уверен, что я должен сделайте еще один вопрос. Как мне продолжить «получать данные с разных страниц с одного и того же сервера с помощью тех же« зарегистрированных файлов cookie и данных »? – Skuta

+1

@Skuta: см. HttpWebRequest.CookieContainer: http://msdn.microsoft.com/en- нас/библиотека/system.net.httpwebrequest.cookiecontainer.aspx – Rytmis

0

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

var request = WebRequest.Create(_url); 
    request.PreAuthenticate = true; 
    request.Credentials = new NetworkCredential(_userName, _password); 
Смежные вопросы