会话和线程

时间:2010-07-23 08:46:53

标签: asp.net session multithreading

当建立到ASP.NET MVC2应用程序的客户端会话时,我无法找到明确的答案我假设来自线程池的特定线程处理该请求。同一个线程是否始终处理该会话的所有后续请求?所以从理论上讲,如果会话ID被搞砸了并且选择了错误的线程,那么任何会话级数据都会丢失? 感谢

2 个答案:

答案 0 :(得分:3)

简而言之,不,不是在IIS下(我不能在Visual Studio中担保“Cassini”Web开发服务器,但我也对此表示怀疑)

您可以通过将以下内容添加到视图来演示线程更改:

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

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

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

答案 1 :(得分:2)

没有。每个请求都可以由不同的线程处理。这意味着页面上的各种资源可以由不同的线程处理。或者他们可能会在同一个人处理。由工作者进程和iis来决定是否值得创建一个新线程或更好地等待一个线程可用。

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

这将我们带到关于会话状态的问题。您不应该在请求之间丢失会话ID。如果你是,那么严重的是错的。或者您可能处于Web场/群集状态,其中一个请求将发送到一个服务器,而下一个请求通过某种负载平衡路由到另一个服务器。

在负载均衡的情况下,您必须有一些持久化会话状态的方法。两种最常用的方法是保存到数据库和分布式缓存。后者是我首选的方法,因为会话数据本质上是一个临时的东西,并不属于持久数据库。