Прочитать запрос Http в массив байтов - PullRequest
30 голосов
/ 30 марта 2012

Я разрабатываю веб-страницу, которая должна принять HTTP Post Request и прочитать его в байтовый массив для дальнейшей обработки. Я как бы застрял на том, как это сделать, и нахожусь в тупике от того, что лучший способ сделать. Вот мой код:

 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;

         }
       }

Я проверяю длину запроса и его общее количество байтов, равное 128. Теперь мне просто нужно использовать объект Stream, чтобы перевести его в формат byte []? Я иду в правильном направлении? Не уверен, как поступить. Будем признательны любому совету. Мне нужно получить весь HTTP-запрос в поле byte [].

Спасибо!

Ответы [ 5 ]

56 голосов
/ 30 марта 2012

Самый простой способ - скопировать его в MemoryStream - затем позвонить ToArray, если вам нужно.

Если вы используете .NET 4, это действительно просто:

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

РЕДАКТИРОВАТЬ: Если вы не используете .NET 4, вы можете создать свою собственную реализацию CopyTo.Вот версия, которая действует как метод расширения:

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);
    }
}
17 голосов
/ 02 апреля 2012

Вы можете просто использовать WebClient для этого ...

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

Где .. - это URL-адрес данных.

1 голос
/ 31 марта 2018

Я использую MemoryStream и 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();
1 голос
/ 16 октября 2017

У меня есть функция, которая делает это, отправляя в потоке ответов:

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);
    }
}

Так как у вас есть Stream str = curContext.Request.InputStream;, вы можете просто сделать:

byte[] bytes = ReadFully(str);

Если вы сделали это:

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

Вы бы назвали это так:

byte[] bytes = ReadFully(resp.GetResponseStream());
0 голосов
/ 30 марта 2012
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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...