Несколько веб-API и распространенное использование зависаний в .netC#

Место общения программистов C#
Anonymous
Несколько веб-API и распространенное использование зависаний в .net

Сообщение Anonymous »

У меня есть приложение, содержащее несколько проектов веб-API в .net. Я использую MongoDb. Теперь я хочу добавить в это приложение обычное зависание. Другими словами, будет одна база данных Hangfire, и все проекты веб-API будут управлять заданиями через эту базу данных. Для этого я добавил расширение в свою общую библиотеку классов.

Common/HangfireExtensions.cs

Код: Выделить всё

public static class HangfireExtensions
{
public static IServiceCollection AddHangfireServices(this IServiceCollection services, string mongoConnectionString, string dbName, string projectName)
{
GlobalJobFilters.Filters.Add(new AppJobFilterAttribute(projectName));

services.AddHangfire(config =>
{
config.UseMongoStorage(mongoConnectionString, dbName, new MongoStorageOptions
{
MigrationOptions = new MongoMigrationOptions
{
MigrationStrategy = new MigrateMongoMigrationStrategy(),
BackupStrategy = new NoneMongoBackupStrategy()
},
CheckConnection = true,
CheckQueuedJobsStrategy = CheckQueuedJobsStrategy.TailNotificationsCollection
});
});

services.AddHangfireServer(options =>
{
options.Queues = new[] { Constants.AppNumber.ToString() };
});
return services;
}
}
Здесь, используя фильтр, я хотел, чтобы каждый проект веб-API выполнял задания, которые я в нем определил. Но даже несмотря на то, что я использую фильтр, я все равно получаю подобную ошибку, поскольку проекты веб-API пытаются запускать задания, которые не определены в других проектах:

Код: Выделить всё

 Recurring job 'AJobAsync' can't be scheduled due to an error and will be disabled.
Hangfire.Common.JobLoadException: Could not load the job. See inner exception for the details.
---> System.IO.FileNotFoundException: Could not load file or assembly 'A.API, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
Мои коды в проектах A и B следующие:

A. API/Program.cs

Код: Выделить всё

builder.Services.AddHangfireServices(connectionString, hangfireDatabase, "A.API");
app.UseHangfireDashboard();

var jobService = app.Services.GetRequiredService();
RecurringJobs.Initialize(jobService);
A.API/RecurringJobs.cs

Код: Выделить всё

public static class RecurringJobs
{
public static void Initialize(IJobService service)
{
RecurringJob.RemoveIfExists(nameof(service.AJobAsync));

RecurringJob.AddOrUpdate(
recurringJobId: nameof(service.AJobAsync),
methodCall: () => service.AJobAsync(),
cronExpression: "0 */1 * ? * *", // Every 1 minute
queue: Constants.AppNumber.ToString()
);
}
}
A.API/IJobService.cs

Код: Выделить всё

public interface IJobService
{
Task AJobAsync();
}
Предположим, что в этой структуре также есть B.API. Для него также определены определенные задания.
Когда эти два проекта выполняются одновременно, я получаю упомянутую выше ошибку, поскольку он пытается выполнить задания, определенные в них обоих. Моя просьба состоит в том, чтобы только проект A мог выполнять задания, определенные в проекте A, и только проект B должен выполнять задания, определенные в проекте B.

Подробнее здесь: https://stackoverflow.com/questions/790 ... age-in-net

Вернуться в «C#»