[C#] Webrequest opbouw met multipart/form-data contenttype

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • pillejunior
  • Registratie: Oktober 2009
  • Laatst online: 08-08 12:25
Ben aan het proberen om via C# een HTTPWebrequest op te bouwen voor de volgende pagina:

http://mijn.knltb.nl/tabid/164/default.aspx

zodat ik automatisch iemand zijn KNLTB tennisrating kan opvragen als hij zijn lidnummer opgeeft ipv dat helemaal via de KNLTB site te doen wat nogal omslachtig is.

Nu heb ik nog nooit een webrequest proberen op te bouwen waar de contenttype van het type multipart/form-data. En het lukt me niet om een POST te doen met een lidnummer richting de server en dan de rating en clubgegevens terug te krijgen.

Heb met Fiddler al geprobeerd om de webrequest na te bouwen en hij lijkt al heel erg op elkaar maar toch lukt het me niet. Zou iemand me in de goede richting kunnen wijzen. Krijg namelijk gewoon elke keer de startpagina weer terug zonder ingevulde gegevens en ook geen resultateten. Hieronder de code zover ik die al heb:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
                request = (HttpWebRequest)WebRequest.Create("http://mijn.knltb.nl/tabid/164/default.aspx");

                request.Method = "POST";
                request.KeepAlive = true;
                request.Referer = "http://mijn.knltb.nl/tabid/164/default.aspx";                
                request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.5.21022; InfoPath.2; MS-RTC LM 8; .NET CLR 3.5.30729; .NET CLR 3.0.30618)";
                request.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-silverlight-2-b2, application/x-shockwave-flash, */*";
                request.Headers.Add("Pragma", "no-cache");
                request.Headers.Add("Accept-Language", "nl");
                request.Headers.Add("UA-CPU", "x86");
                request.ProtocolVersion = HttpVersion.Version10;
                request.ServicePoint.Expect100Continue = false;                
                request.CookieContainer = new CookieContainer();                
                request.CookieContainer.Add(response.Cookies);
                
                string boundary = Guid.NewGuid().ToString().Replace("-", "");
                request.ContentType = "multipart/form-data; boundary=-----------------------------" + boundary;

                System.IO.MemoryStream postData = new System.IO.MemoryStream();
                string newLine = "\r\n";
                System.IO.StreamWriter sw = new System.IO.StreamWriter(postData);              
              
                sw.Write("-----------------------------" + boundary + newLine);
                sw.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}{2}{1}",
                     "dnn$ctr530$Spelersprofiel$txtBondsnummer",
                    newLine,
                    "12996188");

                sw.Write("-----------------------------" + boundary + newLine);
                sw.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}{2}{1}",
                     "__dnnVariable",
                    newLine,
                    "");

                sw.Write("-----------------------------{0}--{1}", boundary, newLine);
                sw.Flush();

                request.ContentLength = postData.Length;
                using (System.IO.Stream s = request.GetRequestStream())
                    postData.WriteTo(s);
                postData.Close();

                request.Proxy.Credentials = cache;

                response = (HttpWebResponse)request.GetResponse();

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 08:24

gorgi_19

Kruimeltjes zijn weer op :9

Ik vraag me af of je de viewstate niet nodig hebt om het geheel voor elkaar te krijgen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • pillejunior
  • Registratie: Oktober 2009
  • Laatst online: 08-08 12:25
Ben ondertussen ook al verder gegaan met uitproberen. En heb nu alle variabelen zoals viewstate, eventtarget, eventargument etc ook even snel in de code erbij geprogrammeerd. Zie hieronder maar ook dit maakt geen verschil:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
                sw.Write("-----------------------------" + boundary + newLine);
                sw.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}{2}{1}",
                     "__EVENTTARGET",
                    newLine,
                    "dnn$ctr530$Spelersprofiel$btnZoek");

                sw.Write("-----------------------------" + boundary + newLine);
                sw.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}{2}{1}",
                     "__EVENTARGUMENT",
                    newLine,
                    "");

                sw.Write("-----------------------------" + boundary + newLine);
                sw.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}{2}{1}",
                     "__VIEWSTATE",
                    newLine,
                    "/wEPDwUJMjgzMDU3ODk3D2QWBmYPFgIeBFRleHQFPjwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+ZAIBD2QWDAIBDxYCHgdWaXNpYmxlaGQCAg8WAh4HY29udGVudAUqRMOpIFNlcnZpY2VwYWdpbmEgdm9vciBsZWRlbiB2YW4gZGUgS05MVEIuZAIDDxYCHwIFGUtOTFRCLCBUZW5uaXMsIE1pam4gS05MVEJkAgQPFgIfAgUUQ29weXJpZ2h0IDIwMDkgS05MVEJkAgUPFgQfAmQfAWhkAgYPFgIfAgUKTWlqbiBLTkxUQmQCAg9kFgICAQ9kFgICBA9kFgJmD2QWAmYPZBYCAgEPZBYGAgEPDxYCHwFoZGQCAw9kFgICAg8WAh8BaGQCBQ9kFgICAQ8PZBYCHglvbmtleWRvd24FbXJldHVybiBfX2Rubl9LZXlEb3duKCcxMycsICdqYXZhc2NyaXB0Ol9fZG9Qb3N0QmFjayglMjdkbm4kY3RyNTMwJFNwZWxlcnNwcm9maWVsJGJ0blpvZWslMjcsJTI3JTI3KScsIGV2ZW50KTsWAgIBD2QWAgIBD2QWCgILDw8WAh4LTmF2aWdhdGVVcmwF4gFqYXZhc2NyaXB0OnBvcHVwQ2FsKCdDYWwnLCdkbm5fY3RyNTMwX1NwZWxlcnNwcm9maWVsX3R4dERhdHVtVmFuYWYnLCdkLU0teXl5eScsJ2phbnVhcmksZmVicnVhcmksbWFhcnQsYXByaWwsbWVpLGp1bmksanVsaSxhdWd1c3R1cyxzZXB0ZW1iZXIsb2t0b2Jlcixub3ZlbWJlcixkZWNlbWJlcicsJ3pvLG1hLGRpLHdvLGRvLHZyLHphJywnVmFuZGFhZycsJ1NsdWl0ZW4nLCdLYWxlbmRlcicsMSk7ZGQCDQ8PZBYCHgdvbmNsaWNrBSxqYXZhc2NyaXB0OndpbmRvdy5kb2N1bWVudC5mb3Jtc1swXS5yZXNldCgpO2QCFQ9kFgICAw9kFgJmD2QWAmYPZBYCAgEPPCsACwBkAhcPZBYCAgMPZBYCZg9kFgJmD2QWBgIBD2QWAmYPZBYCZg9kFgICAQ88KwALAGQCAw9kFgJmD2QWAmYPZBYCAgEPPCsACwBkAgcPDxYEHwRkHwAFMFZyYWdlbiBvdmVyIGhldCBEeW5hbWlzY2hlIFNwZWVsc3Rlcmt0ZSBTeXN0ZWVtP2RkAhkPZBYCAgMPZBYCZg9kFgJmD2QWAgIBDzwrAAsAZGSXPaK/JawTI+3phW0Ots6luO9xUQ==");

                sw.Write("-----------------------------" + boundary + newLine);
                sw.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}{2}{1}",
                     "dnn$ctr530$Spelersprofiel$txtBondsnummer",
                    newLine,
                    "12996188");

                sw.Write("-----------------------------" + boundary + newLine);
                sw.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}{2}{1}",
                     "dnn$ctr530$Spelersprofiel$txtDatumVanaf",
                    newLine,
                    "08-11-2008");

                sw.Write("-----------------------------" + boundary + newLine);
                sw.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}{2}{1}",
                     "ScrollTop",
                    newLine,
                    "");

                sw.Write("-----------------------------" + boundary + newLine);
                sw.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}{2}{1}",
                     "__dnnVariable",
                    newLine,
                    "");

Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 17-09 20:37

BM

Moderator Spielerij
Als je die viewstate nodig hebt, kom je dan niet in de problemen als je die hergebruikt (vrij zeker van wel). Zover ik weet is een viewstate uniek voor elke request, en zullen formposts afgekeurd worden als de viewstate niet goed is.

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • pillejunior
  • Registratie: Oktober 2009
  • Laatst online: 08-08 12:25
Heb nu even een snel stukje gecodeerd om de viewstate uit te lezen en mee te geven:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                WebClient wc = new WebClient();
                wc.Proxy.Credentials = cache;
                Stream st = wc.OpenRead("http://mijn.knltb.nl/tabid/164/default.aspx");
                StreamReader sr = new StreamReader(st);
                string line = sr.ReadToEnd(); 
                string viewState = String.Empty;

                if (line.IndexOf("__VIEWSTATE") != -1) // found line
                {
                    sr.Close();
                    st.Close();
                    int startIndex = line.IndexOf("value=") + 7;
                    int endIndex = line.IndexOf("\"", startIndex);
                    int count = endIndex - startIndex;
                    viewState = line.Substring(startIndex, count);
                }


maar als ik deze meegeef via de request krijg ik helaas nog steeds hetzelfde resultaat als tevoren. De startpagina zonder ingevulde waardes.

Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Zou goed kunnen dat ze een controle hebben op hun post requests. Dus dat er alleen post data geaccepteerd wordt als de request van hun eigen site afkomt.

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Knap vervelend voor de mensen die een firewall of proxy hebben die de referer eruit filtert. :X Maar goed, je kan altijd even een fake referer meesturen.

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • pillejunior
  • Registratie: Oktober 2009
  • Laatst online: 08-08 12:25
Zoals in de eerste post te zien is stuur ik ook een referer mee. Namelijk die van hun eigen site. Dus zoals gezegd een soort van fake dan. Kan me wel voorstellen dat ze niet overspoeld willen worden met request zoals de mijne. Kunnen ze dat afvangen en blokkeren?

Zo niet doe ik dan nog iets fout bij mijn request of ziet die er naar jullie kennis van multipart/form-data posts goed uit?

Acties:
  • 0 Henk 'm!

Verwijderd

Bij de meeste sites worden session variabelen gezet en meestal na inloggen. Je moet dus eerst een request kunnen doen om in te loggen, waarna de sessionvariabelen gezet worden. Deze data wordt in de CookieContainer gezet. Bij je 2de verzoek geef je de CookieContainer weer mee.

string sLoginUrl = @"http://www.eensite.nl&user=piet&password=piet";
string sGrabUrl = @"http://www.eensite.nl/nr=123456"

// used to build entire input
StringBuilder sb = new StringBuilder();

// used on each read operation
byte[] buf = new byte[8192];

// Deze is nodig omdat sessionvariabelen hierin worden opgeslagen!!
CookieContainer cookieContainer = new CookieContainer();

// prepare the web page we will be asking for
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sLoginUrl);
request.CookieContainer = cookieContainer;
request.Method = "GET";

// get our sessionvariables in our cookiecontainer
HttpWebResponse res = (HttpWebResponse)request.GetResponse();
res.Close();

// Then grab the content of the desired page
request = (HttpWebRequest)HttpWebRequest.Create(sUrl);
request.CookieContainer = cookieContainer;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();


// we will read data via the response stream
Stream resStream = response.GetResponseStream();
string responseEncoding = response.ContentEncoding.Trim();

string tempString = null;
int count = 0;

do
{
// fill the buffer with data
count = resStream.Read(buf, 0, buf.Length);

// make sure we read some data
if (count != 0)
{
// translate from bytes to ASCII text
tempString = Encoding.ASCII.GetString(buf, 0, count);

// continue building the string
sb.Append(tempString);
}
}
while (count > 0); // any more data to read?

string shtml = sb.ToString();

Acties:
  • 0 Henk 'm!

  • pillejunior
  • Registratie: Oktober 2009
  • Laatst online: 08-08 12:25
ook laatste tip had ik toevallig al gedaan via de volgende code maar ook geen resultaat:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
               HttpWebRequest request = (HttpWebRequest)WebRequest.Create  ("http://mijn.knltb.nl/tabid/164/default.aspx");
                request.Method = "GET";
                request.CookieContainer = new CookieContainer();
                request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.5.21022; InfoPath.2; MS-RTC LM 8; .NET CLR 3.5.30729; .NET CLR 3.0.30618)";
                request.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-silverlight-2-b2, application/x-shockwave-flash, */*";
                request.Headers.Add("Accept-Language", "nl");
                request.Headers.Add("UA-CPU", "x86");
                request.ProtocolVersion = HttpVersion.Version10;
                request.KeepAlive = true;

                request.Proxy.Credentials = cache;

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();


en dan
C#:
1
2
3
4
5
6
7
8
9
10
11
12
                request.Method = "POST";
                request.KeepAlive = true;
                request.Referer = "http://mijn.knltb.nl/tabid/164/default.aspx";                
                request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.5.21022; InfoPath.2; MS-RTC LM 8; .NET CLR 3.5.30729; .NET CLR 3.0.30618)";
                request.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-silverlight-2-b2, application/x-shockwave-flash, */*";
                request.Headers.Add("Pragma", "no-cache");
                request.Headers.Add("Accept-Language", "nl");
                request.Headers.Add("UA-CPU", "x86");
                request.ProtocolVersion = HttpVersion.Version10;
                request.ServicePoint.Expect100Continue = false;                
                request.CookieContainer = new CookieContainer();                
 >>>>>>>>request.CookieContainer.Add(response.Cookies);<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Pagina: 1