使用 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 包要付出更多的努力。
我正在尝试每 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 包要付出更多的努力。