如何在所有请求之间创建共享对象?

时间:2019-12-07 09:48:58

标签: c# asp.net .net asp.net-core .net-core

我是后端开发的初学者。我有一个简单的.Net Core Web API应用程序。我想存储一个整数以计算调用的请求量。

因此,每一次接听电话,我都将counter加1。但是counter由于构造函数调用而将每个请求重新初始化为0。如何在所有请求中创建共享的counter,以便计算被叫请求的数量。

我的简化班是这样:

[ApiController]
[Route("/")]
public class WeatherForecastController : ControllerBase
{
   DataContext _context;
   int counter ;
   public WeatherForecastController(DataContext context){
        counter = 0;  //initialized with 0
        _context = context;
    }


    [HttpGet]
    public string Get()
    {
        counter++; //every time 0 to 1
        .....
        .....
    }

    [HttpPost(".....")]
    public async Task UploadFile([FromForm] string ...)
    {
        counter++; //every time 0 to 1
        .....
        .....
    }


    [HttpGet("....")]
    public string Get2(string ...)
    {
        counter++; //every time 0 to 1
        .....
        .....
    }

    [HttpPost(".....")]
    public async Task Post4([FromForm] string ...)
    {
        counter++; //every time 0 to 1
        .....
        .....
    }

}

2 个答案:

答案 0 :(得分:3)

我认为以下代码可以为您提供帮助,您可以通过将变量定义为静态来实现

[ApiController]
[Route("/")]
public class WeatherForecastController : ControllerBase
{
  DataContext _context;
  static int counter = 0;
  public WeatherForecastController(DataContext context){
    _context = context;
  }


  [HttpGet]
  public string Get()
  {
    counter++; 
  }

  [HttpPost("UploadFile")]
  public async Task UploadFile()
  {
    counter++;
  }
}

答案 1 :(得分:0)

主要问题是控制器本身的工作方式。

根据我所知,只有当提出请求时,控制器的生命周期才会被丢弃。

IE:当向/ api / controller发出请求时,会旋转一个新实例来处理该请求,然后将其丢弃。

您想要做的是保持某种形式的持久性。我建议您使用一种日志记录工具,将其注入到控制器中,以记录该日志已被访问,然后您可以从中提取调用它的次数。 或者在您的上下文中有一个模型,只要对控制器进行调用,就可以对其进行更新。

与仅在其中粘贴静态变量相比,这两种方法都是线程安全的