Asp.net 会话和线程

Asp.net 会话和线程,asp.net,session,multithreading,Asp.net,Session,Multithreading,无法找到对此的最终答案,当与ASP.NET MVC2应用程序建立客户端会话时,我假设线程池中的特定线程会处理该请求。同一线程是否总是处理该会话的所有后续请求?所以从理论上讲,如果会话id被弄乱了,选择了错误的线程,那么任何会话级别的数据都会丢失? 谢谢否。每个请求都可以由不同的线程处理。这意味着页面上的各种资源可以由不同的线程处理。或者,它们可能在同一台上处理。由工作进程和iis来决定是否值得创建一个新线程,或者最好等到一个线程可用时再创建 页面将由一个线程呈现,然后图像、样式表和Java脚本可

无法找到对此的最终答案,当与ASP.NET MVC2应用程序建立客户端会话时,我假设线程池中的特定线程会处理该请求。同一线程是否总是处理该会话的所有后续请求?所以从理论上讲,如果会话id被弄乱了,选择了错误的线程,那么任何会话级别的数据都会丢失?
谢谢

否。每个请求都可以由不同的线程处理。这意味着页面上的各种资源可以由不同的线程处理。或者,它们可能在同一台上处理。由工作进程和iis来决定是否值得创建一个新线程,或者最好等到一个线程可用时再创建

页面将由一个线程呈现,然后图像、样式表和Java脚本可以在同一个线程或其他线程上处理。这是ASP.NET和web编程无状态本质的基础。不过,它允许您在不同的服务器甚至不同的域之间对所有请求进行负载平衡

这就引出了您关于会话状态的问题。您不应该在请求之间丢失会话ID。如果你是的话,就有严重的问题了。或者您可能处于web场/集群的情况下,其中一个请求将发送到一台服务器,下一个请求通过某种负载平衡路由到另一台服务器


在负载平衡的场景中,您必须有一些方法来保持会话状态。最常见的两种方法是保存到数据库和分布式缓存。后者是我首选的方法,因为会话数据本质上是临时的,不属于持久数据库。

简言之,不,不属于IIS(我不能保证Visual Studio中的“Cassini”web开发服务器,但我也怀疑这一点)

通过向视图中添加以下内容,可以演示线程的更改:

<%= System.Threading.Thread.CurrentThread.ManagedThreadId %>

现在从你的浏览器中反复点击页面(或者从2个或3个浏览器中点击),你会看到它不时地变化


话虽如此,在这样一个简单的场景中,您可能经常会看到同一个线程为请求提供服务,因为ASP.NET不值得创建超过其需要的线程,但一旦开始加载服务器,您将看到多个线程。

我不确定线程方面会如何导致会话ID混乱。你能再解释一下你的想法吗?