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!
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);
}
}
Vous pouvez simplement utiliser WebClient pour cela ...
WebClient c = new WebClient();
byte [] responseData = c.DownloadData(..)
Où ..
est l'adresse URL pour les données.
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());
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();
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();
}
}