c# asp.net httpcontext system.web

c# - Leer solicitud de HTTP en la matriz de bytes



asp.net httpcontext (5)

La forma más sencilla es copiarlo en un MemoryStream , luego llamar a ToArray si es necesario.

Si estás usando .NET 4, eso es muy fácil:

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

EDITAR: Si no está utilizando .NET 4, puede crear su propia implementación de CopyTo. Aquí hay una versión que actúa como un método de extensión:

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

Estoy desarrollando una página web que necesita tomar una solicitud de publicación HTTP y leerla en una matriz de bytes para su posterior procesamiento. Estoy un poco atascado en cómo hacer esto, y estoy perplejo en cuál es la mejor manera de lograrlo. Aquí está mi código hasta ahora:

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

Estoy comprobando la longitud de la solicitud y sus bytes totales, que es igual a 128. ¿Ahora solo necesito usar un objeto Stream para ponerlo en formato byte []? ¿Voy en la dirección correcta? No estoy seguro de como proceder. Cualquier consejo sería genial. Necesito obtener la solicitud HTTP completa en el campo byte [].

¡Gracias!


Puedes usar WebClient para eso ...

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

Donde .. es la dirección URL de los datos.


Tengo una función que lo hace, enviando el flujo de respuesta:

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

Ya que tienes Stream str = curContext.Request.InputStream; , entonces podrías simplemente hacer:

byte[] bytes = ReadFully(str);

Si hubieras hecho esto:

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

Lo llamarías así:

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


Uso MemoryStream y 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();


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