ASP.NET是多线程的(它如何执行请求)

时间:2009-01-12 14:01:48

标签: asp.net multithreading

这可能是一个愚蠢的问题,但是;

如果我有两个人在同一时间登录我的网站,服务器端代码会一个接一个地执行,还是会在不同的线程中同时执行?

我对网站登录时的拒绝服务攻击感到好奇。服务器是否因为它有大量登录队列而变慢,或者因为它有10亿个同时登录而变慢!

4 个答案:

答案 0 :(得分:18)

这与ASP.NET本身无关(我对该领域知之甚少),但通常是Web服务器。大多数Web服务器使用线程(或进程)来处理请求,因此基本上,无论您使用哪些代码片段并行执行这两个连接。当然,如果您访问数据库或其他已放置锁定的后端系统,只允许一个会话执行查询,您可能已隐式序列化所有请求。

Web服务器通常具有最小和最大数量的工作程序,这些工作程序已调整为当前硬件(CPU,内存等)。如果这些请求耗尽,新请求将排队等待工作人员可用,或者直到达到待处理请求的最大队列长度,此时它忽略新连接,有效地拒绝服务(如果这是故意的,则称为拒绝服务或DoS攻击。)

所以,根据你的意思,它是一个组合,它是大量的同时请求填满队列。

答案 1 :(得分:3)

应该使用线程池。请注意,它们仍然在同一个应用程序中,因此静态变量等应用程序级项目仍然在它们之间共享。

答案 2 :(得分:1)

来自this article

  

记住ISAPI是多线程的,因此请求将通过ApplicationDomainFactory.Create()返回的引用进入多个线程。清单1显示了反汇编来自IsapiRuntime.ProcessRequest方法的代码,它接收ISAPI ecb对象和服务器类型作为参数。该方法是线程安全的,因此多个ISAPI线程可以安全地同时调用这个返回的对象实例。“

所以是的,在DOS攻击的情况下,由于连接数量很大,它会很慢

答案 3 :(得分:1)

正如其他人所说,大多数网络服务器使用多个进程或线程(更好)一次为多个请求提供服务。特别是,您可以使用最大排队请求数和最大工作进程数设置每个ASP.NET应用程序池。每个进程最多有多个线程(不可配置的AFAIK,我可能错了),并且以先进先出的方式处理传入的请求。

此外,ASP.NET为每个会话处理一个请求 - 但恶意用户可以打开任意数量的会话。

多次登录可能会袭击数据库,并可能在网络服务器本身之前将其瘫痪。

据我所知,除了设置排队请求的最大数量(等待处理)之外,没有内置的方法来限制ASP.NET请求。理想情况下,这个数字应该非常小。您可以使用性能计数器监视排队的ASP.NET请求的数量。假设您发现,在高峰流量时,此数字为100.您可以更新应用程序,以便在此数字大于100时拒绝登录尝试,以便数据库不会被命中(从未这样做,只是一个想法)。 p>