WebAPI控制器重用

本文关键字:控制器 WebAPI | 更新日期: 2023-09-27 17:58:38

假设我的ASP.NET WebAPI应用程序中有以下ApiController:

class MyApiController : ApiController
{
    private string str;
     [HttpGet]
    public string SetStr(string str)
    {
        this.str = str;
        MaybeSleep(); // Some executions take longer, some don't.
        return this.str;
    }
}

(现实有点复杂,但这应该是最重要的)

这在我的环境和某些其他环境中运行良好,即使在服务器负载很重的情况下也总是返回输入值。

然而,在两种环境中,str有时会在set和return之间"神奇地"更改,即使没有太多的服务器负载。但是,它总是更改为在那个时候发送到服务器的值,只是不总是在这个请求中发送的值。

所以,我的问题是:

  • ApiController重用是我所期望的行为吗?还是应该为服务器处理的每一个请求创建、使用和销毁一个新的ApiControl
  • 这种行为是否取决于ASP.NET版本、IIS版本和/或Web.config设置
  • Microsoft是否提供了有关私有ApiController变量行为的文档
  • 或者这可能是某个.NET或ASP.NET版本中的已知错误

WebAPI控制器重用

请求不应修改控制器的状态。从entry方法到任何其他调用的方法,都可以根据需要传递参数,因此无需根据请求修改控制器对象本身。

如果在整个请求中需要维护某些状态,但无法将参数传递给其他方法,那么最好在HttpContext上执行,因为这始终是特定于请求的。(即便如此,这种情况可能也不太常见。)

取而代之的是:

public string SetStr(string str)
{
    this.str = str;
    MaybeSleep(); // Some executions take longer, some don't.
    return this.str;
}

这个:

public string SetStr(string str)
{
    HttpContext.Items["str"] = str; //I'd declare a constant for "str"
    MaybeSleep(); 
    return HttpContext.Items["str"];
}

ApiController重复使用是我所期望的行为吗是否应该为每个服务器处理的单个请求?

收到请求后,ControllerFactory或DependencyResolver会创建一个新的控制器实例。

基本上,主线程创建一个控制器实例,然后在多个线程之间共享同一实例,直到请求完成。

由于第一个假设不正确,问题的其余部分不再相关

理想情况下,若您执行长时间运行的进程,您希望使用一个调度程序,这样它就不会冻结UI。

您可以在Scott Hanselman的博客上阅读更多信息-如何在ASP.NET 中运行后台任务