1

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

4

1 回答 1

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——但我们只会读取一个不必要的字节。我们不会一直读下去。

于 2013-05-20T06:07:41.673 回答