如何在不解析C#请求流的情况下根据内容长度拒绝和发布HTTP帖子?

时间:2013-05-20 06:01:17

标签: c# http post http-headers httpwebrequest

某些第三方通过HTTP Post将数据发布到我们的网页。我想为HTTP帖子设置一个限制为1 Kb,如果它高于1 Kb我需要拒绝HTTP帖子。我不想读取整个请求流来查找内容长度。无论如何我可以在不读取整个请求流的情况下进行验证吗?

1 个答案:

答案 0 :(得分:2)

取决于内容长度是否在标题中。如果是,您只需抓取(例如HttpRequest.ContentLength)。但是,他们不必指定。

否则,你可以读取第一个1K和1个额外字节:

 byte[] data = new byte[1025];
 int length = 0;
 using (var stream =  request.GetBufferlessInputSream())
 {
     while (length < validData.Length)
     {
         int bytesRead = stream.Read(data, length, data.Length - length);
         if (bytesRead == 0)
         {
             break;
         }
         length += bytesRead;
     }
 }
 if (length > 1024)
 {
     // Client sent more than 1024 bytes of data!
 }
 // Otherwise, use the first "length" bytes of data

请注意,data的大小为1025,因此我们尝试读取的字节比我们允许客户端发送的字节多一个。

如果客户端发送的数量超过1K,我们仍会读取第一个1K - 但我们只会读取一个不必要的字节。我们不会永远读书。