如何在c#中不解析请求流的情况下拒绝基于内容长度的HTTP post

本文关键字:拒绝 情况下 于内容 post HTTP 请求 | 更新日期: 2023-09-27 18:14:26

一些第三方通过HTTP Post向我们的网页发布数据。我想为HTTP帖子设置一个限制,比如1 Kb,如果超过1 Kb,我需要拒绝HTTP帖子。我不想读取整个请求流来找出内容长度。我是否可以在不读取整个请求流的情况下验证?

如何在c#中不解析请求流的情况下拒绝基于内容长度的HTTP post

这取决于内容长度是否在标题中。如果是,你可以直接获取它(例如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的数据,但是我们只会读取一个不必要的字节。我们不会一直读下去的。