web-dev-qa-db-fra.com

Lire la requête HTTP dans un tableau d'octets

Je développe une page Web qui doit prendre une requête de publication HTTP et la lire dans un tableau d'octets pour un traitement ultérieur. Je suis un peu coincé sur la façon de faire cela, et je suis perplexe sur la meilleure façon d'accomplir. Voici mon code jusqu'à présent:

 public override void ProcessRequest(HttpContext curContext)
    {
        if (curContext != null)
        {
            int totalBytes = curContext.Request.TotalBytes;
            string encoding = curContext.Request.ContentEncoding.ToString();
            int reqLength = curContext.Request.ContentLength;
            long inputLength = curContext.Request.InputStream.Length;
            Stream str = curContext.Request.InputStream;

         }
       }

Je vérifie la longueur de la demande et son nombre total d'octets, ce qui équivaut à 128. Maintenant, dois-je simplement utiliser un objet Stream pour le convertir au format octet []? Est-ce que je vais dans la bonne direction? Je ne sais pas comment procéder. Tout conseil serait bon. Je dois obtenir la requête HTTP complète dans le champ byte [].

Merci!

29
Encryption

Le moyen le plus simple est de le copier dans une MemoryStream - puis appelez ToArray si vous en avez besoin.

Si vous utilisez .NET 4, c'est très simple:

MemoryStream ms = new MemoryStream();
curContext.Request.InputStream.CopyTo(ms);
// If you need it...
byte[] data = ms.ToArray();

EDIT: Si vous n'utilisez pas .NET 4, vous pouvez créer votre propre implémentation de CopyTo. Voici une version qui agit comme une méthode d'extension:

public static void CopyTo(this Stream source, Stream destination)
{
    // TODO: Argument validation
    byte[] buffer = new byte[16384]; // For example...
    int bytesRead;
    while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0)
    {
        destination.Write(buffer, 0, bytesRead);
    }
}
55
Jon Skeet

Vous pouvez simplement utiliser WebClient pour cela ...

WebClient c = new WebClient();
byte [] responseData = c.DownloadData(..)

.. est l'adresse URL pour les données.

16
feroze

J'ai une fonction qui le fait, en envoyant le flux de réponse:

private byte[] ReadFully(Stream input)
{
    try
    {
        int bytesBuffer = 1024;
        byte[] buffer = new byte[bytesBuffer];
        using (MemoryStream ms = new MemoryStream())
        {
            int readBytes;
            while ((readBytes = input.Read(buffer, 0, buffer.Length)) > 0)
            {
               ms.Write(buffer, 0, readBytes);
            }
            return ms.ToArray();
        }
    }
    catch (Exception ex)
    {
        // Exception handling here:  Response.Write("Ex.: " + ex.Message);
    }
}

Puisque vous avez Stream str = curContext.Request.InputStream;, vous pouvez alors simplement faire:

byte[] bytes = ReadFully(str);

Si vous aviez fait ceci:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(someUri);
req.Credentials = CredentialCache.DefaultCredentials;
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

Vous l'appelleriez de cette façon:

byte[] bytes = ReadFully(resp.GetResponseStream());
1
vapcguy

J'utilise MemoryStream et Response.GetResponseStream().CopyTo(stream)

HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
myRequest.Method = "GET";
WebResponse myResponse = myRequest.GetResponse();
MemoryStream ms = new MemoryStream();
myResponse.GetResponseStream().CopyTo(ms);
byte[] data = ms.ToArray();
0
Phong Tran
class WebFetch
{
static void Main(string[] args)
{
    // used to build entire input
    StringBuilder sb = new StringBuilder();

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

    // prepare the web page we will be asking for
    HttpWebRequest request = (HttpWebRequest)
        WebRequest.Create(@"http://www.google.com/search?q=google");

    // execute the request
    HttpWebResponse response = (HttpWebResponse)
        request.GetResponse();

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

    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?

    // print out page source
    Console.WriteLine(sb.ToString());
    Console.Read();
    }
}
0
Dasarp