Не работает задача hangfire
Всем привет. Недавно мне пришлось использовать hangfire для запуска определённой задачи.
При запуске задачи я получаю вот такое исключение в самом планировщике:
Failed
An exception occurred during processing of a background job.
System.InvalidOperationException
A suitable constructor for type 'SMSServicePanel.GetInfoForResourseService' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.
System.InvalidOperationException: A suitable constructor for type 'SMSServicePanel.GetInfoForResourseService' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider provider, Type type)
at Hangfire.AspNetCore.AspNetCoreJobActivatorScope.Resolve(Type type)
at Hangfire.Server.CoreBackgroundJobPerformer.Perform(PerformContext context)
at Hangfire.Server.BackgroundJobPerformer.<>c__DisplayClass9_0.<PerformJobWithFilters>b__0()
at Hangfire.Server.BackgroundJobPerformer.InvokePerformFilter(IServerFilter filter, PerformingContext preContext, Func`1 continuation)
at Hangfire.Server.BackgroundJobPerformer.<>c__DisplayClass9_1.<PerformJobWithFilters>b__2()
at Hangfire.Server.BackgroundJobPerformer.PerformJobWithFilters(PerformContext context, IEnumerable`1 filters)
at Hangfire.Server.BackgroundJobPerformer.Perform(PerformContext context)
at Hangfire.Server.Worker.PerformJob(BackgroundProcessContext context, IStorageConnection connection, String jobId)
Вот код всей задачи:
public class jsonserialize
{
public string name { get; set; }
public string count { get; set; }
}
public class GetInfoForResourseService
{
public EFUserDBContext db;
public IInfoWithPanelRepository infoWithPanelRepository;
GetInfoForResourseService(EFUserDBContext db, IInfoWithPanelRepository infoWithPanelRepository)
{
this.db = db;
this.infoWithPanelRepository = infoWithPanelRepository;
}
private async Task<String> Request()
{
var appSettingsJson = AppSettingsJson.GetAppSettings();
var ip = appSettingsJson["SMSServiceIP"];
var apikey = appSettingsJson["ApiKeySMSService"];
WebRequest request = WebRequest.Create($"http://{ip}/stubs/monitors_ajax.php");
request.Method = "POST"; // для отправки используется метод Post
// данные для отправки
string data = $"api_key={apikey}";
// преобразуем данные в массив байтов
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(data);
// устанавливаем тип содержимого - параметр ContentType
request.ContentType = "application/x-www-form-urlencoded";
// Устанавливаем заголовок Content-Length запроса - свойство ContentLength
request.ContentLength = byteArray.Length;
//записываем данные в поток запроса
using (Stream dataStream = request.GetRequestStream())
{
dataStream.Write(byteArray, 0, byteArray.Length);
}
WebResponse response = await request.GetResponseAsync();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
string result = reader.ReadToEnd();
response.Close();
return result;
}
public async Task GetInfo()
{
var jsonstring = await Request();
Root result = JsonConvert.DeserializeObject<Root>(jsonstring);
var resourselist = new List<jsonserialize>();
foreach (var item in result.unprocessed_requests)
{
var addedItem = new jsonserialize() { name = item.server_name, count = item.requests_count };
resourselist.Add(addedItem);
}
var json = System.Text.Json.JsonSerializer.Serialize(resourselist);
InfoWithPanel info = await db.Infos.FirstOrDefaultAsync();
if (info == null)
{
var addedinfo = new InfoWithPanel() { Resourses = json, LastUpdate = DateTime.Now };
infoWithPanelRepository.Create(addedinfo);
}
else
{
var updatedinfo = new InfoWithPanel() { id = info.id, Resourses = json, LastUpdate = DateTime.Now };
infoWithPanelRepository.Update(updatedinfo);
}
return;
}
}
}
Ответы (1 шт):
Автор решения: AofA Group
→ Ссылка
Спасибо ребятам из комментариев. Я присвоил конструктору модификатор доступности public и теперь всё заработало.
