Avatar billede mjall0w Nybegynder
08. oktober 2010 - 19:17 Der er 6 kommentarer og
2 løsninger

WebException ved POST og brug af HttpProtocol 1.1

Hey,
jeg har et program der foretager HTTP POST's og GET's.
Problemet er at jeg får en exception ved brug af HttpProtocol 1.1, men ikke ved brug af 1.0.
Den forekommer kun ved brug af POST, og ikke GET. Dog virker POST på nogle sider med 1.1, desværre ikke på den side jeg skal foretage mine POST's
Derudover kan min POST heller ikke loade mere end 7982 tegn efter den har lavet sin POST (testet med 1.0). Resten af indholdet bliver simpelthen ikke streamet.

Min kode ser ud som følgende,
            byte[] buffer = Encoding.ASCII.GetBytes(post);
           
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);

            request.Timeout = 20000;
            request.UserAgent = "Useragent";
            request.ProtocolVersion = HttpVersion.Version11;
            request.AllowWriteStreamBuffering = false;
            request.AllowAutoRedirect = true;

            request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";

            request.ContentType = "application/x-www-form-urlencoded";
            request.Referer = referer;
            request.KeepAlive = true;

            request.Method = WebRequestMethods.Http.Post;

            request.ContentLength = buffer.Length;

            Stream PostData = request.GetRequestStream();

            PostData.Write(buffer, 0, buffer.Length);
            PostData.Close();
           
            HttpWebResponse WebResp = (HttpWebResponse)request.GetResponse();
           
            Stream Answer = WebResp.GetResponseStream();
            Answer.ReadTimeout = 20000;
            StreamReader _Answer = new StreamReader(Answer);
           
            _referer = WebResp.ResponseUri.ToString();
            string vystup = _Answer.ReadToEnd();


            _Answer.Close();
            Answer.Close();


            html = vystup;

Håber der er hjælp at hente derude, har siddet og bikset med det i flere dage nu.

Tak.
Avatar billede arne_v Ekspert
09. oktober 2010 - 01:56 #1
Hvad ser du hvis du sniffer på trafikken.
Avatar billede mjall0w Nybegynder
09. oktober 2010 - 16:02 #2
Min request header er,
POST /post.php HTTP/1.0
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Content-Type: application/x-www-form-urlencoded
Referer: http://thesite.com/post.php
Host: thesite.com
Cookie: PHPSESSID=14726750abfbd46725764cfb650706d6
Content-Length: 162
Connection: Keep-Alive

og svar headeren er,
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 09 Oct 2010 13:57:51 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: close
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache


Var det det som du var interesseret i ?

Undrer mig virkeligt at HTTP.PROTOCOL11 ikke virker til lige netop den host jeg prøver, når det gør til samtlige andre jeg har prøvet at teste det på.
Avatar billede mjall0w Nybegynder
10. oktober 2010 - 12:41 #3
arne_v, det var en god pointe det med at sniffe trafikken. Fandt frem til at den stoppede ved Except-100,
så ved at tilføje,
HttpWebrequest.ServicePoint.Expect100Continue = false;
blev det løst med at jeg ikke kunne foretage POSTS.
Nu kan den bare ikke streame min post når mit contest er "langt".

System.IO.IOException: Der kunne ikke læses data fra transportforbindelsen: Forbindelsen blev lukket. ved System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size) ved System.IO.StreamReader.ReadBuffer() ved System.IO.StreamReader.ReadToEnd()
Avatar billede Syska Mester
10. oktober 2010 - 19:32 #4
Det med længden lyder som en Web.Config setting måske.

Men hvor lang tid kører den og hvad er det præcist du prøver på, synes jeg ikke helt fremgår af dit spørgsmål udover dine fejl du har fået og næsten løst nu.

mvh
Avatar billede mjall0w Nybegynder
10. oktober 2010 - 22:03 #5
Prøver på at lave en posts på en website. Har lavet posts i http 1.0 hvor der var en max. længde på 7982.
Det er blevet løst nu, og posts virker også med protocol 1.1
Dog får jeg det problem nu, når længden er for lang af responsens fra min posts den smider en exception som lyder,

System.IO.IOException: Der kunne ikke læses data fra transportforbindelsen: Forbindelsen blev lukket. ved System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size) ved System.IO.StreamReader.ReadBuffer() ved System.IO.StreamReader.ReadToEnd()

Så problemet er faktisk at før kunne den ikke læse mere end 7982 tegn efter en respons, nu smider den bare en exception i stedet for, som er ovenstående. Den smider ikke nogen exception hvis post responsens fra siden ikke indeholder så mange tegn.
Avatar billede mjall0w Nybegynder
14. oktober 2010 - 10:32 #6
Hold k*ft det har været et helvede..
Har prøvet at ændre alle headers, prøve diverse metoder at streame på og ja lagt alt for mange timer i det.
Men anyway, fandt heldigvis en løsning.

Ved at bruge GZIP encoding i min header,
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");

og derefter encode mit gzip respons om til UTF8 kom det til at virke.

Benyttede mig af dette eksempel,
http://www.west-wind.com/Weblog/posts/102969.aspx

arne_v, hvis du smider et svar vil jeg tildele dig lidt point, du fik mig hen på rette spor med at sniffe trafikken op.
Avatar billede arne_v Ekspert
14. oktober 2010 - 17:33 #7
ok
Avatar billede mjall0w Nybegynder
14. oktober 2010 - 18:09 #8
lukker nu
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester