将Http Request读入Byte数组
我正在开发一个需要获取HTTP Post请求并将其读入字节数组以进行进一步处理的网页。 我有点坚持如何做到这一点,我很难理解什么是最好的方法。 这是我到目前为止的代码:
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 []字段。
谢谢!
最简单的方法是将其复制到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); } }
您可以使用WebClient …
WebClient c = new WebClient(); byte [] responseData = c.DownloadData(..)
其中..
是数据的URL地址。
我有一个function,通过发送响应流:
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());
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(); } }
我使用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();
- 为什么我从VirtualPathUtility ToAbsolute获得一些具有某些路径的HttpException?
- 如何使用linq查询ASP.NET MVC 5entity framework填充视图模型
- 如何在autopostback上保持滚动位置?
- 如何将自定义角色添加到ASP.NET Core
- ASP.Net 4.5模型绑定按导航属性排序
- 成功登录后,User.Identity.IsAuthenticated为false
- ASP.Net:用户控制内容区域,显然可行,但我需要一些细节
- 替换Microsoft Data Access ApplicationBlocks已过时的SqlHelper类
- ASP.NET是否可以使用Eval()调用Server Tag中的方法?