大家好。我最近不得不使用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;
}
}
}
谢谢评论里的小伙伴。我给了构造函数一个公共可访问性修饰符,现在一切正常。