2012-03-30 22 views
24

Tôi đang phát triển một trang web cần có một yêu cầu HTTP Post và đọc nó vào một mảng byte để xử lý tiếp. Tôi đang bị mắc kẹt về cách làm điều này, và tôi đang bối rối về cách tốt nhất để thực hiện là gì. Đây là mã của tôi cho đến thời điểm này:Đọc Http Yêu cầu vào mảng Byte

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; 

     } 
     } 

Tôi đang kiểm tra độ dài yêu cầu và tổng số byte bằng 128. Bây giờ, tôi chỉ cần sử dụng đối tượng Luồng để đưa nó vào định dạng byte []? Tôi có đi đúng hướng không? Không chắc chắn cách tiếp tục. Bất cứ lời khuyên nào cũng tuyệt vời cả. Tôi cần nhận toàn bộ yêu cầu HTTP vào trường byte [].

Cảm ơn!

Trả lời

50

Cách đơn giản nhất là sao chép nó vào MemoryStream - sau đó gọi ToArray nếu bạn cần.

Nếu bạn đang sử dụng .NET 4, đó là thực sự dễ dàng:

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

EDIT: Nếu bạn không sử dụng NET 4, bạn có thể tạo triển khai thực hiện của riêng bạn CopyTo. Dưới đây là một phiên bản đóng vai trò như một phương pháp khuyến nông:

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

Tôi không có .CopyTo? – Encryption

+0

Tôi làm cách nào để sử dụng luồng bộ nhớ mà không có tùy chọn .CopyTo? – Encryption

+0

@Encryption: Bạn có thể thực hiện một cái gì đó rất giống mình - Tôi sẽ chỉnh sửa nó trong một phút ... –

0
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

Mã tốt, nhưng nó giả định dữ liệu được tìm nạp là dữ liệu chuỗi. Nếu nó là một tập tin hoặc một cái gì đó khác mà cần thiết để được giữ như byte, điều này sẽ không phải là cách để làm điều đó. Tôi sẽ không bỏ phiếu lên cũng không xuống trên này, mặc dù. – vapcguy

12

Bạn chỉ có thể sử dụng WebClient cho rằng ...

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

đâu .. là địa chỉ URL cho dữ liệu.

+0

Lưu ý rằng 'DownloadData' sẽ không bao giờ ném ngoại lệ cho 4xx và 5xx – Nathan

0

Tôi có một chức năng nào đó, bằng cách gửi trong dòng phản ứng:

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

Vì bạn có Stream str = curContext.Request.InputStream;, bạn có thể sau đó chỉ cần làm:

byte[] bytes = ReadFully(str); 

Nếu bạn đã làm điều này:

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

Bạn sẽ gọi theo cách này:

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