Asp mvc:IControllerFactory.CreateController和线程

时间:2013-01-13 09:55:54

标签: asp.net-mvc-4

我正在实现一个自定义IControllerFactory来创建我的asp.net mvc控制器。 在这个工厂的CreateController方法中,我依赖于线程的事实 创建控制器,是独一无二的;意味着在调用ReleaseController之前,该线程上没有创建其他Controller。

现在,在重载测试下,我遇到了问题。 假设我在线程1,2,3上创建了控制器,它看起来是新的 在第一个调用之前,在线程1上创建控制器 IControllerFactory.ReleaseController。

这是预期的行为吗? 对控制器的每个请求都在一个单独的线程上处理,对吧? 为什么在调用IControllerFactory的ReleaseController方法之前,同一个线程被重用于不同的请求?

谢谢你的时间, 柯恩

1 个答案:

答案 0 :(得分:2)

  

在这个工厂的CreateController方法中,我依赖于这个事实   创建控制器的线程是唯一的;意思是没有   在ReleaseController之前,在该线程上创建了其他Controller   调用。

你绝对不能依赖这种行为。没有什么可以保证你的。如果你使用异步控制器,事情会变得更糟。

  

这是预期的行为吗?

  

对控制器的每个请求都在一个单独的线程上处理,对吗?

没有

  

如何为不同的请求重用相同的线程,   在调用IControllerFactory的ReleaseController方法之前?

ASP.NET使用线程池来处理请求。因此,例如,从该池中抽取一个线程来为请求提供服务,然后将该线程返回到池中以供重用。所以你可以完全没有相同的线程执行两个完全独立的请求的控制器代码。

绝对不要在线程上依赖ASP.NET应用程序。如果要存储某些按请求的特定信息,则应使用HttpContext存储,而不是线程。如果您想要安全,请忘记ASP.NET应用程序中的线程。