views:

5554

answers:

3

This piece of code doesn't work; it's logging in into website which is using https protocol. How to solve this problem? The code stops at "GetRequestStream()" anytime anywhere saying that protocol violation exception is unhandled..

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());
}
+3  A: 

Set request method to post, before calling GetRequestStream

like

request.Method = "POST";

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

You might also want to figure out the total length of what you're posting, beforehand, and set that as the ContentLength of the request. See MSDN:

A ProtocolViolationException is thrown in several cases when the properties set on the HttpWebRequest class are conflicting. This exception occurs if an application sets the ContentLength property and the SendChunked property to true, and then sends an HTTP GET request. This exception occurs if an application tries to send chunked to a server that only supports HTTP 1.0 protocol, where this is not supported. This exception occurs if an application tries to send data without setting the ContentLength property or the SendChunked is false when buffering is disabled and on a keepalive connection (the KeepAlive property is true).

Rytmis
should I just do the "strlen" check?
Skuta
@skuta - Here is a sample from msdn at http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.contentlength.aspx
Ramesh
+1  A: 

My guess is that the issue you are experiencing is due to the fact (like others have advised) that you are doing a GET request instead of a POST request. Additionally, I noticed that the actual name for the password field on that page is "heslo" and not "password". This typo won't cause the web server to not return a response, but it will cause other issues since the server is looking for that specific variable name to be posted with the password value.

regex
Thx, I got one more issue, not sure if i should make another question.. How do I continue to "get data from different pages from same server using same "loggged cookie and data"??
Skuta
@Skuta: See HttpWebRequest.CookieContainer: http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.cookiecontainer.aspx
Rytmis