C# 为什么IIS过滤掉使用原始TCP套接字发送的HTTP POST请求,并在写入后立即关闭

C# 为什么IIS过滤掉使用原始TCP套接字发送的HTTP POST请求,并在写入后立即关闭,c#,iis,asp.net-web-api,tcp,C#,Iis,Asp.net Web Api,Tcp,我尝试向简单的.NETWebAPI应用程序发送许多简短的独立http POST请求。在循环中创建请求,并使用新的TCP连接发送每个请求。这里重要的是,每个http请求只写入服务器而不等待任何响应。所以循环是基于操作的: 创建请求 开放式插座 写请求 闭合插座 在这种情况下,托管在IIS 10上的webapi应用程序(ASP.NET MVC 5.2.7)不会接收任何传入请求。控件永远不会转移到ApicController中的相应方法。我注意到,在套接字写入和关闭之间添加额外的睡眠(例如100m

我尝试向简单的.NETWebAPI应用程序发送许多简短的独立http POST请求。在循环中创建请求,并使用新的TCP连接发送每个请求。这里重要的是,每个http请求只写入服务器而不等待任何响应。所以循环是基于操作的:

  • 创建请求
  • 开放式插座
  • 写请求
  • 闭合插座
在这种情况下,托管在IIS 10上的webapi应用程序(ASP.NET MVC 5.2.7)不会接收任何传入请求。控件永远不会转移到ApicController中的相应方法。我注意到,在套接字写入和关闭之间添加额外的睡眠(例如100ms)可以消除这个问题。但缩短睡眠时间会导致丢失请求的数量增加。等待套接字读取(响应)也是一个修复。但这并不令人满意。我无法等待服务器响应或添加额外延迟。 这里有趣的是,创建的请求堆不是问题。即使以这种方式创建的一个请求也不会出现在另一端

这种行为的原因是什么


我在ASP.NET Core 2.1中测试过类似的webapi应用程序。Kestrel按其应有的方式处理所有请求。将这些请求发送到简单的TcpListener服务器也可以工作。

我猜IIS会检测到套接字过早关闭。如果您的问题是延迟,那么,您可以尝试使用异步/等待。Windows Socket API可能会认为您正在使用那些短的实时TCP连接执行DDoS攻击。根据KestReor和TCPListEnter的测试,我认为这不是套接字限制,而是IIS特性。也许这是可以控制的。