当IIS收到HTTP请求时,它会将请求移交给由一个或多个工作进程提供服务的应用程序池中的请求应用程序。工作进程将从共享线程池(如果需要)生成一个线程来为http请求提供服务。
(i)在web api控制器的上下文中,当收到此请求时,控制器是否被实例化并分配给生成的线程?
(ii)当对同一个api控制器有多个http请求时,每个生成的线程会有多少个控制器实例吗?
(iii)在类级别声明非线程安全资源(dbContext)并在构造函数中实例化然后在类方法中使用的情况。提交和管理交易会有问题吗?
从本质上讲,每个线程是否存在控制器实例的一对一匹配? (我知道使用asp.net,多个线程实际上可以为单个http请求提供服务)。
答案 0 :(得分:4)
(i)在web api控制器的上下文中,此请求是 接收,是控制器实例化并分配给生成的 线? (ii)当对同一个api控制器有多个http请求时, 每个衍生线程会有多少个控制器实例吗?
收到请求时,ControllerFactory或DependencyResolver会创建一个控制器实例。
基本上,主线程创建一个控制器实例,然后在多个线程之间共享同一个实例,直到请求完成。
(iii)在非线程安全的资源的情况下 (dbContext)在类级别声明并在a中实例化 构造函数然后在类方法中使用。会有问题吗? 提交和管理交易?
是的,共享成员或静态不是线程安全的。但是,操作方法中的局部变量是线程安全的。
答案 1 :(得分:1)
逐点回答你的问题:
(一世)。是的
(ⅱ)。不。通常控制器是单件,而不是线程安全的。您创建多个线程来处理多个请求,但它们会使用相同的控制器实例(或服务)
(三)。是。您有责任照顾数据健全性检查或线程安全问题。如果你不这样做,你可以面对各种问题,如脏读,脏车,线程安全......所有类型的线程安全问题。
您可以将控制器视为服务,因此只需通过创建新实例(例如为每个请求创建新的任务处理程序)将传入请求委托给新的子服务或控制器,但仍需要考虑共享资源(如数据库)的线程安全性。