**
System.InvalidOperationException: 'Невозможно определить информацию о сериализации для c => c.LastRunTime.TimeOfDay.Add(new TimeSpan(0, c.RunInterval, 0)).'**
Ниже мой код
Код: Выделить всё
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
using Configuration;
using DeviceManagement.Models;
using DeviceManagement.Util;
using Microsoft.Extensions.Hosting;
using MongoDB.Driver;
namespace DeviceManagement.Services
{
public class CronConfigService : BaseService, IHostedService, IDisposable
{
private readonly CancellationTokenSource _cts = new CancellationTokenSource();
private readonly Dictionary _nextRunTimes = new Dictionary();
private readonly CronHistoryService _cronHistoryService;
public CronConfigService(Setting setting, IHttpContextAccessor context, User user, CronHistoryService cronHistoryService)
: base(setting, context, user)
{
InitializeNextRunTimes();
_cronHistoryService = cronHistoryService;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
await RunCronJobs();
}
public async Task StopAsync(CancellationToken cancellationToken)
{
_cts.Cancel();
}
public void Dispose()
{
_cts.Dispose();
}
private async Task RunCronJobs()
{
while (!_cts.IsCancellationRequested)
{
var now = DateTime.Now;
var dueConfigs = await GetDueCronConfigs(now);
foreach (var config in dueConfigs)
{
try
{
await RunCronJob(config);
CreateCronHistory(config, null);
}
catch (Exception ex)
{
CreateCronHistory(config, ex.Message);
}
}
}
}
private async Task GetDueCronConfigs(DateTime now)
{
var cronConfigCollection = Database.GetCollection("CronConfig");
var filter = Builders.Filter.Or(
Builders.Filter.Eq(c => c.RunTime, now.TimeOfDay),
Builders.Filter.And(
Builders.Filter.Lt(c => c.LastRunTime.TimeOfDay.Add(new TimeSpan(0, c.RunInterval, 0)), now.TimeOfDay)
)
);
return await cronConfigCollection.Find(filter).ToListAsync();
}
private async Task RunCronJob(CronConfig config)
{
var httpClient = new HttpClient();
var response = await httpClient.PostAsync(config.Url, new StringContent(config.Payload.ToString()));
if (!response.IsSuccessStatusCode)
{
throw new Exception($"Failed to run cron job: {response.StatusCode}");
}
}
private void CreateCronHistory(CronConfig config, string error)
{
var history = new CronHistory
{
Cron = config.Code,
Error = error,
OtherInfo = $"Ran at {DateTime.Now}"
};
_cronHistoryService.Save(new List { history });
}
private void InitializeNextRunTimes()
{
var cronConfigs = Database.GetCollection("CronConfig").Find(FilterDefinition.Empty).ToList();
foreach (var config in cronConfigs)
{
_nextRunTimes[config.Code] = DateTime.Now.Add(new TimeSpan(0, config.RunInterval, 0));
}
}
}
}
Я добавил [BsonRepresentation(BsonType.String)]
в свойства, возможно, это будет сериализовано
Подробнее здесь: https://stackoverflow.com/questions/790 ... on-informa