0

First, I apologize for the english ability ^^

target: I want POST a data to a Login website. but the data contain a value (the value different after refresh website) that i must GET from website. So, i do 'GET' method first, and get the value, then i do 'POST' method & i get the error 'This property cannot be set after writing has started.' in 'content-length'

My code:

         HttpWebRequest wr = HttpWebRequest.Create("https://www.fshare.vn/login") as HttpWebRequest;
        wr.KeepAlive = true;

        // get the value
        HttpWebResponse wrep = wr.GetResponse() as HttpWebResponse;
        Stream streamReponse = wrep.GetResponseStream();
        StreamReader reader = new StreamReader(streamReponse);
        string httpDoc = reader.ReadToEnd();
        string fs_csrt = getfs_csrf(httpDoc);

        wr.CookieContainer = new CookieContainer();
        wr.CookieContainer.Add(wrep.Cookies);

        reader.Close();
        streamReponse.Close();
        wrep.Close();


        // Post into website

        string postDataString = @"POST /login fs_csrf={0}
                            &LoginForm%5Bemail%5D=abcd%40yahoo.com.vn
                            &LoginForm%5Bpassword%5D=abcd
                            &LoginForm%5Bcheckloginpopup%5D=0
                            &LoginForm%5BrememberMe%5D=0
                            &yt0=%C4%90%C4%83ng+nh%E1%BA%ADp
                            ";
        postDataString = string.Format(postDataString, fs_csrt);
        MessageBox.Show("I will post: " + postDataString);

        byte[] postDatabyte = Encoding.ASCII.GetBytes(postDataString);



        wr.UserAgent = "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36";
        wr.Method = "POST";
        wr.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        wr.KeepAlive = true;
        wr.ContentType = "application/x-www-form-urlencoded";
        //wr.ContentLength = postDatabyte.Length;

        Stream stream = wr.GetRequestStream();
        stream.Write(postDatabyte, 0, postDatabyte.Length);
        stream.Close();

        // get the result
        HttpWebResponse wrep2 = wr.GetResponse() as HttpWebResponse;
        Stream streamReponse2 = wrep2.GetResponseStream();
        StreamReader reader2 = new StreamReader(streamReponse2);
        string httpDoc2 = reader2.ReadToEnd();

        Clipboard.SetText(httpDoc2);
        MessageBox.Show("Post done");   

Please help me T_T

Duy Bùi
  • 3
  • 3

1 Answers1

0

You are getting that error because request Type Get can not have body.

You should create another request object by invoking Create method of HttpWebRequest and then use that object to post the data.

HttpWebRequest anotherWR = HttpWebRequest.Create("https://www.fshare.vn/login") as HttpWebRequest;
anotherWR.UserAgent = "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36";
anotherWR.Method = "POST";
anotherWR.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
anotherWR.KeepAlive = true;
anotherWR.ContentType = "application/x-www-form-urlencoded";
Stream stream = wr.GetRequestStream();
stream.Write(postDatabyte, 0, postDatabyte.Length);
stream.Close();

...
...
...
//and your logic...
Jenish Rabadiya
  • 6,708
  • 6
  • 33
  • 62
  • no, if re-create the request, the VALUE i need get will change :( – Duy Bùi Jun 12 '17 at 04:05
  • Nothing is getting stored in request object! which value are you talking about? – Jenish Rabadiya Jun 12 '17 at 04:06
  • each time i access 'fshare.vn', i get a 'fs_csrt' value: the fs_csrt use to login website. But fs_csrt will be change when i create new resquest – Duy Bùi Jun 12 '17 at 04:10
  • You don't require to download form html first and then do post the form. you can directly do it if you know where to post the form (form url). Have a look at [here](https://stackoverflow.com/a/1274137/1505865) – Jenish Rabadiya Jun 12 '17 at 04:26