Volendo ci puoi fare un dll in modo da usarla anche in vb.net.
codice:
public class ReaderContex<T> : DbContext where T : EntityBase
{
string _databasePath;
public DbSet<T> Info { get; set; }
public DbSet<TimeConfiguration> TimeConfigurations { get; set; }
public DbSet<ReadInfo> ReadInfo { get; set; }
public ReaderContex(string databasePath) { _databasePath = databasePath; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite($"Data Source={ _databasePath}");
}
public static bool Update(string URL, string _databasePath, Func<ReaderContex<T>, DateTime, List<T>, bool> Function, TimeSpan? SetDefaultTime=null)
{
bool result = false; SetDefaultTime = SetDefaultTime == null ? new TimeSpan(1, 0, 0) : SetDefaultTime;
try {
InitDB(_databasePath);
using (var ctx = new ReaderContex<T>(_databasePath)) {
var lastRecord = ctx.ReadInfo.OrderByDescending(o => o.Date).FirstOrDefault();
var lastUpdate = lastRecord == null ? DateTime.MinValue : lastRecord.Date;
var actualTime = ctx.TimeConfigurations.ToList().FirstOrDefault(f => f.From.TimeOfDay <= DateTime.Now.TimeOfDay && f.To.TimeOfDay > DateTime.Now.TimeOfDay);
var DefaultTime = actualTime == null ? SetDefaultTime.Value : actualTime.Frequency.TimeOfDay;
if (DateTime.Now > lastUpdate.Add(DefaultTime)) {
var request = HttpWebRequest.Create(URL);
request.ContentType = "text/json";
request.Method = "GET";
var httpResponse = (HttpWebResponse)request.GetResponse();
var StreamReader = new System.IO.StreamReader(httpResponse.GetResponseStream());
var responseText = StreamReader.ReadToEnd();
List<T> covidClassList = JsonConvert.DeserializeObject<List<T>>(responseText);
var needUpdate = Function(ctx, lastUpdate, covidClassList);
if (needUpdate)
ctx.ReadInfo.Add(new ReadInfo() { Date = DateTime.Now, Update = needUpdate });
ctx.SaveChanges();
return needUpdate;}}
} catch { } return result;
}
public static bool InitDB(string databasePath)
{
bool result = false;
try { using (var ctx = new ReaderContex<T>(databasePath)) {
ctx.Database.EnsureCreated();
if (!ctx.TimeConfigurations.Any()){
ctx.TimeConfigurations.Add(new TimeConfiguration(){
Frequency = DateTime.Now.Date.Add(new TimeSpan(0, 1, 0)),
From = DateTime.Now.Date.Add(new TimeSpan(18, 0, 0)),
To = DateTime.Now.Date.Add(new TimeSpan(20, 0, 0))
}); ctx.SaveChanges();}} result = true;} catch { } return result;
}
}
[Table("ReadingsList")]
public class ReadInfo : EntityBase
{
public DateTime Date { get; set; }
public bool Update { get; set; }
}
[Table("Configuration")]
public class TimeConfiguration : EntityBase
{
public DateTime From { get; set; }
public DateTime To { get; set; }
public DateTime Frequency { get; set; }
}
public class EntityBase
{
[Key]
public int Id { get; set; }
}
In InitDB() puoi vedere come aggiungo Fasce orarie (puoi farlo da qualsiasi punto). Lo faccio per avere sempre almeno una fascia oraria.
Mentre Update si occupa di controllare se deve aggiornare oppure no in base al tempo e alla frequenza di aggiornamento, e passa alla funzione data nei parametri dal chiamante il contexto, la data dell'ultimo aggiornamento e la lista di nuovi dati appena ottenuti dalla sorgente json, poi dentro la webapi li tratti come vuoi. In questo esempio cancello i vecchi dati e li riscrivo tutti, ma puoi fare in tanti modi. Una volta restituito true alla funzione verra scritto il log di ultimo aggiornamento (ovviamente se restituisci false non vuoi che venga registrato questo aggiornamento).