Avatar billede montago Praktikant
05. oktober 2007 - 23:38 Der er 6 kommentarer og
1 løsning

Læse POST-body og send den videre med HttpWebRequest

Jeg er igang med at lave en side som kan modtage et http-POST, som jo bekendt har sine data i http-body'en

Jeg har ingen anelse om hvad der er i denne body og er også ligeglad med det... jeg har dog muligheden for at læse ContentType og ContentEncoding og bruge disse når jeg skal sende min POST videre

--- en slags proxy ---

[Side] --> "POST" --> [min proxy] --> "POST" --> destination
-----------//DATA//--------------------//DATA//-------------


Mit største problem er at jeg altid for rodet rundt i Streams, StreamReaders/Writers og CharBuffere og skidt og kanel... så jeg vil bare gerne betale mig fra det med 200 solide point :)

skal bruge et eksempel som virker
Avatar billede montago Praktikant
05. oktober 2007 - 23:41 #1
på Default.aspx.cs siden har jeg prøvet mig lidt frem med


else if (Method.Equals("POST"))
{
    Stream PostBody = Request.BinaryRead(Request.TotalBytes);
    string ContentEncoding = Request.ContentEncoding.ToString();
    string ContentType = Request.ContentType;

    Gadget.PostWebPage(path, QString, PostBody, ContentEncoding, ContentType);
}

som sender videre til ...

private static string PostWebPage(string strURI, Gadget gadget, MemoryStream PostBody, string ContentEncoding, string ContentType)
    {
        string strHTML = gadget.GadgetHTML;
        Uri objURI = new Uri(strURI);

        HttpWebRequest objWebRequest = (HttpWebRequest)WebRequest.Create(objURI);
        objWebRequest.Method = "POST";
        objWebRequest.ContentLength = PostBody.Length;
        objWebRequest.ContentType = ContentType;

        using (StreamWriter myWriter = new StreamWriter(objWebRequest.GetRequestStream()))
        {
            myWriter.Write(PostBody,0,PostBody.Length);
        }

        try
        {
            HttpWebResponse objWebResponse = (HttpWebResponse)objWebRequest.GetResponse();
            using (StreamReader objStreamReader = new StreamReader(objWebResponse.GetResponseStream()))
            {
                strHTML = objStreamReader.ReadToEnd();
            }

            //Update the position
            gadget.gadgetpath = objURI.PathAndQuery;
            gadget.pathparts = objURI.Segments;

            //Fix Urls
            strHTML = FixGadgetURLs(strHTML, gadget);
            strHTML = FixGadgetForms(strHTML, gadget);
        }
        catch (WebException ex)
        {
            strHTML = "last request returned 404 :" + ex.Message + "<hr>" + strHTML;
        }
        return strHTML;
    }


Men dette virker jo ik !
Avatar billede nielle Nybegynder
06. oktober 2007 - 11:43 #2
Hmmm, der er jo et par stedet hvor du forsøger at lave nogle ulovlige casts.

Kan du ikke lige starte med at fortælle hvordan du definere Method og Request variablene. Normalt plejer Method at være en metode i Request, men det ser den ikke ud til at være her?
Avatar billede montago Praktikant
06. oktober 2007 - 23:17 #3
Method = Request.ServerVariables["Method"] ... dvs endten "POST" eller "GET"

Request er ASP object
Avatar billede montago Praktikant
06. oktober 2007 - 23:19 #4
Som jeg har læst mig til... bruger man Char[] når man sender en POST over HttpWebRequest

Request.BinaryRead kan vidst kun skrive til Byte[]... såe...har leget lidt med casts... men der er jo nogle fejl
Avatar billede nielle Nybegynder
07. oktober 2007 - 12:12 #5
Kan det ikke gøres sådan her?

        if (Request.ServerVariables["Method"] == "POST")
        {
            byte[] postBody = Request.BinaryRead(Request.TotalBytes);

            Uri objURI = new Uri(strURI);

            HttpWebRequest objWebRequest = (HttpWebRequest)WebRequest.Create(objURI);
            objWebRequest.Method = "POST";
            objWebRequest.ContentLength = postBody.Length;
            objWebRequest.ContentType = ContentType;
            // Måske: objWebRequest.ContentType = "application/x-www-form-urlencoded";

            Stream requestStream = objWebRequest.GetRequestStream();
            requestStream.Write(postBody, 0, postBody.Length);
            requestStream.Close();
        }
Avatar billede montago Praktikant
07. oktober 2007 - 13:31 #6
YEAH !!

det virker !

send et svar :)
Avatar billede nielle Nybegynder
07. oktober 2007 - 16:01 #7
Svar :^)
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