我正在开发一个功能,可以从中央银行获取汇率并定期将其写入数据库。我正在使用 Hangfire 来安排作业以特定的时间间隔运行。
当我运行项目时,我可以在“重复作业”选项卡中看到我的作业,并且该作业运行一次,成功将数据写入数据库。但是,之后,它会抛出以下错误。 虽然它会产生此错误,但如果我手动触发该作业,它会起作用,但它不会按预期执行定期写入过程。
我将项目升级到.NET 8.0,并且我的所有包都是最新的。我一开始以为这个错误可能是由于升级造成的,所以我也用.NET 5.0测试了一下,但遇到了同样的错误。
顺便说一句,无论版本是3.0.0.2还是4.0.0.1,错误仍然存在。不管版本如何,似乎都是在寻找4.0.0.0版本并卡在这个版本中。
System.InvalidOperationException: Recurring job can't be scheduled, see inner exception for details.
---> Hangfire.Common.JobLoadException: Could not load the job. See inner exception for the details.
---> System.TypeLoadException: Could not load type 'Manager.Job.ScheduledJobs.ExchangeRateProcess.ExchangeRateJob' from assembly 'Manager.Job.ScheduledJobs, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null'.
at System.Reflection.RuntimeAssembly.GetTypeCore(String typeName, ReadOnlySpan`1 nestedTypeNames, Boolean throwOnError, Boolean ignoreCase)
at System.Reflection.TypeNameParser.GetType(String typeName, ReadOnlySpan`1 nestedTypeNames, String assemblyNameIfAny)
at System.Reflection.TypeNameParser.NamespaceTypeName.ResolveType(TypeNameParser& parser, String containingAssemblyIfAny)
at System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase)
at Hangfire.Common.TypeHelper.TypeResolver(Assembly assembly, String typeName, Boolean ignoreCase)
at System.Reflection.TypeNameParser.GetType(String typeName, ReadOnlySpan`1 nestedTypeNames, String assemblyNameIfAny)
at System.Reflection.TypeNameParser.NamespaceTypeName.ResolveType(TypeNameParser& parser, String containingAssemblyIfAny)
at System.Type.GetType(String typeName, Func`2 assemblyResolver, Func`4 typeResolver, Boolean throwOnError)
at Hangfire.Common.TypeHelper.DefaultTypeResolver(String typeName)
at Hangfire.Storage.InvocationData.DeserializeJob()
--- End of inner exception stack trace ---
at Hangfire.Storage.InvocationData.DeserializeJob()
at Hangfire.RecurringJobEntity..ctor(String recurringJobId, IDictionary`2 recurringJob, ITimeZoneResolver timeZoneResolver, DateTime now)
--- End of inner exception stack trace ---
at Hangfire.Server.RecurringJobScheduler.ScheduleRecurringJob(BackgroundProcessContext context, IStorageConnection connection, String recurringJobId, RecurringJobEntity recurringJob, DateTime now)
这是一个奇怪的情况。以前有人遇到并解决过这个错误吗?
我检查过GAC,但那里的dll通常是系统dll或NuGet包dll。在 C:\Windows\Microsoft.NET ssembly 中找不到它们。
当我使用 dotPeek 反编译特定于应用程序的 dll 时,一切看起来都很好。我的版本是4.0.0.1,一切都是最新的,相关Jobs.ScheduledJobs类库的bin文件夹中的DLL包含Jobs.ScheduledJobs.ExchangeRateProcess.ExchangeRateJob。
为项目中的相关引用启用“复制到本地”选项并没有解决问题。同样,执行 Clean-Rebuild 也没有解决问题。
问题的根本原因是多个作业同时在同一个数据库上运行。连接的数据库中已经有太多数据。为了解决这个问题,我创建了一个新数据库并将作业重定向到它,这解决了问题。