使用 Json API 间隔 ASP.NET Core MVC 上的数据更新数据库

Update database with Json API data on interval ASP.NET Core MVC

我正在尝试每 5 分钟从 raspberry pi API 获取一次温度读数。

目前,当我刷新主页时,它会为我的每个温度传感器调用 API。页面加载大约需要 3 秒,我可以接受,但我宁愿有某种后台任务,每 5 分钟 运行s 并保存来自 API 调用我的数据数据库。这样我就有了一个很好的温度记录并且可以看到变化。

这就是我想要的 运行 每 5 分钟一次。我对 API 没有太多经验,所以我不确定完成此操作的最佳方法是什么(PS:这意味着 运行 [=27] =] 或第二个 raspberry pi)

foreach (var sensor in TempSensors) //for each one sensor get a reading from the api and save it
{
    var cookieName = api.CookieName;
    var cookieString = api.Cookie;
    var url = "apiurl";
    var baseAddress = new Uri(url);
    var cookieContainer = new CookieContainer();

    using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
    using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
    {
       var message = new HttpRequestMessage(HttpMethod.Get, "/api/" + sensorId + "/read")                      
       message.Headers.Add("Accept", "application/json");

       cookieContainer.Add(baseAddress, new Cookie(cookieName, cookieString));
       HttpResponseMessage response = await client.GetAsync(message.RequestUri); // call the api and get the reading

       if (response.StatusCode == HttpStatusCode.OK)
       {
          var content = await response.Content.ReadAsStringAsync();
          TempReading tr = new TempReading(); // make a new reading
          tr.TempSensorId = sensorId.ToString(); //set its sensor id to the current sensor id     
          tr.TempReadingDate = DateTime.Now; // set the read time to right now
          tr.Value = content.ToString(); // write the reading to a string
          await Create(tr); //add it to the db                            
       }
   }
}

根据您的描述,我建议您可以考虑使用asp.net核心后台服务来实现您的需求。当应用程序启动或每 5 分钟启动一次时,后台服务可以 运行。

您可以将某些内容存储到本地存储中,例如 redis 或其他。然后在这个后台服务中你可以读取它并存储它。

更多关于asp.net核心后台服务的使用方法,可以参考这个article

感谢@Brando 的回复,我实际上决定只使用 quartz 在启动时启动一个重复任务,并且效果很好。我开始使用 Service worker 路线,但它似乎比仅使用 Quartz.Net 包要付出更多的努力。