Avatar billede nielsbrinch Nybegynder
07. juni 2004 - 14:31 Der er 12 kommentarer og
1 løsning

Hent alt, inklusive headeren fra et WebRequest

Jeg har her et almindeligt web request, som i øvrigt fungerer.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

request.Method = "POST";
request.UserAgent = userAgent;
request.ContentType = contentType;
request.Headers.Add(name, headerValue);

Stream outStream = request.GetRequestStream();
StreamWriter writer = new StreamWriter(outStream, Encoding.UTF8);
using (writer)
{
  writer.Write(requestText);
}

Mit spørgsmål er: Hvordan kan jeg få fat i alt jeg sender, inklusive headeren. Jeg vil altså ikke hente de forskellige headerværdier ud én ad gangen. Jeg vil have følgende:

Altså noget i den retning:

POST /fakepath HTTP/1.1
Host: www.tempuri.org
Content-Length: 420
User-Agent: Kalamari

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<root>
  <ib>bo</ib>
</root>
Avatar billede arne_v Ekspert
07. juni 2004 - 14:44 #1
Du skifter til direkte socket !

        TcpClient client = new TcpClient("www.xxx.dk", 80);
        StreamWriter wrt = new StreamWriter(client.GetStream());
        StreamReader rdr = new StreamReader(client.GetStream());
        wrt.WriteLine("GET /dir/foobar.html HTTP/1.1");
        wrt.WriteLine("Host: www.xxx.dk");
        wrt.WriteLine("");
        wrt.Flush();

og så læser du bare fra rdr !
Avatar billede arne_v Ekspert
07. juni 2004 - 14:46 #2
wrt.close();
        string line;
        while((line = rdr.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }
        rdr.Close();
        client.Close();
       
eller noget i den retning.
Avatar billede nielsbrinch Nybegynder
07. juni 2004 - 14:49 #3
Tjah, så har jeg selvfølgelig den fulde kontrol ... men jeg er egentligt alligevel interesseret i at kende header ud fra et HttpWebRequest. Men det er måske ikke muligt? Ikke fordi jeg vil have fuld styring, mere fordi jeg vil kunne fortælle dem jeg requester til, præcis hvordan mit request kommer til at se ud.
Avatar billede arne_v Ekspert
07. juni 2004 - 14:53 #4
Sorry - jeg læste forkert.

Det var fuld request du ville have ikke fuld respons.
Avatar billede nielsbrinch Nybegynder
07. juni 2004 - 14:56 #5
Jamen det er også en underlig situation. Jeg kan godt forstå du læste forkert. Tænk at jeg ikke engang kan få at vide hvad jeg selv sender.
Avatar billede arne_v Ekspert
07. juni 2004 - 14:56 #6
Det tror jeg er svært med HttpWebRequest.

Eneste mulighed skulel være hvis man kunne snige en egen Socket implementation ind
og den kunne jeg ihvertfald ikke lige inde i docs.

Jeg kan se 2 muligheder.

1)  som beskrevet selv sende det hele manuelt

2)  sætte et lille go between program ind    client---spy utility---server
    som viser både request og response

(Apache Axis web service toolkit kommer med sådan et værktøj)
Avatar billede nielsbrinch Nybegynder
07. juni 2004 - 15:09 #7
Jaja, det kan ikke være ligetil alt sammen. Din løsning 1 løser jo problemet. Tak.
Avatar billede nielsbrinch Nybegynder
07. juni 2004 - 15:31 #8
Jeg får denne fejl når jeg prøver at læse fra rdr:

Cannot access a disposed object named "System.Net.Sockets.NetworkStream". Object name: "System.Net.Sockets.NetworkStream".

while((line = rdr.ReadLine()) != null) <--- her kaster den sin Exception
{
  responseText += line;
}

Siger det dig noget?
Avatar billede arne_v Ekspert
07. juni 2004 - 15:46 #9
socket'en må være blevet lukket inden.

Kalder du client.Close inden ?

Prøv evt. at flytte wrt.Close ned nedenfor.
Avatar billede nielsbrinch Nybegynder
07. juni 2004 - 15:52 #10
Det hjalp at flytte wrt.Close nedenunder, selvom det egentligt ikke giver mening, synes jeg. Jeg modtager godt nok 403-fejl fra det sted jeg requester, men det er vist en anden sag. Svar!
Avatar billede arne_v Ekspert
07. juni 2004 - 15:53 #11
Følgende ser ud til at virke (bortset fra at det kniber lidt med EOF detection):

using System;
using System.Net.Sockets;
using System.IO;

class MainClass
{
    public static void Main(string[] args)
    {
        TcpClient client = new TcpClient("www.microsoft.com", 80);
        StreamWriter wrt = new StreamWriter(client.GetStream());
        StreamReader rdr = new StreamReader(client.GetStream());
        wrt.WriteLine("GET / HTTP/1.1");
        wrt.WriteLine("Host: www.microsoft.com");
        wrt.WriteLine("");
        wrt.Flush();
        string line;
        while((line = rdr.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }
        wrt.Close();
        rdr.Close();
        client.Close();
    }
}
Avatar billede arne_v Ekspert
07. juni 2004 - 15:53 #12
svar
Avatar billede arne_v Ekspert
07. juni 2004 - 15:55 #13
Og det sidste EOF detection fixes med:

using System;
using System.Net.Sockets;
using System.IO;

class MainClass
{
    public static void Main(string[] args)
    {
        TcpClient client = new TcpClient("www.microsoft.com", 80);
        StreamWriter wrt = new StreamWriter(client.GetStream());
        StreamReader rdr = new StreamReader(client.GetStream());
        wrt.WriteLine("GET / HTTP/1.1");
        wrt.WriteLine("Host: www.microsoft.com");
        wrt.WriteLine("Connection: close");
        wrt.WriteLine("");
        wrt.Flush();
        string line;
        while((line = rdr.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }
        wrt.Close();
        rdr.Close();
        client.Close();
    }
}
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