设置后台作业后,HangFire出现问题,但打开HangFire仪表板时,会看到以下异常
System.IO.FileNotFoundException:无法加载文件或程序集“DynamicProxyGenAssembly2、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。
所有接口都是使用AutoFac为DI注册的。,我将在startup.cs中设置以下内容
我在启动中有以下代码
GlobalConfiguration.Configuration.UseSqlServerStorage("Hangfire");
app.UseHangfireDashboard();
app.UseHangfireServer();
我有下面的ocde去舒勒的工作
public class ScheduleAppService : IScheduleAppService
{
private readonly IRunCommandAppService _runCommandAppService;
public ScheduleAppService(IRepository<Schedule> repository, IAdHocTemplateRunnerAppService adHocTemplateRunner) : base(repository)
{
_adHocTemplateRunner = adHocTemplateRunner;
}
public async Task CreateSchedule(ScheduleDto schedule)
{
input.Schedule.JobId = BackgroundJob.Schedule(
() => _runCommandAppService.AddTemplate(
new Template{ RunId = Guid.NewGuid().ToString(), TemplateId = schedule.Id }), schedule.Start);
}
}
正在调用的代码在这里
public class RunCommandAppService : IRunCommandAppService
{
private readonly IRepository<Template> _templateRepo;
public RunCommandAppService (IRepository<Template> templateRepo)
{
_templateRepo = templateRepo;
}
public void AddTemplate(Template input)
{
try
{
Run(input);
}
finally
{
SetRunComplate(input.RunId);
}
}
发布于 2017-06-04 14:50:11
可能与您的上下文不同,但我认为仍然值得在这里添加:
-Hangfire服务器作为Windows服务运行;
运行在-Hangfire MVC 5应用程序之上的ASP.NET仪表板;
-jobs实际上正在运行,但是仪表板一直在显示一个FileNotFoundException;
解决方案:在仪表板应用程序中添加了对缺少的程序集(即:'DynamicProxyGenAssembly2')的引用。
@reggieboyYEAH以同样的方式报道和解决了同样的问题。
发布于 2018-06-11 07:45:35
我也有同样的问题。但是我尝试将包含BackgroundJob.Enqueue
的方法移到vm类中。当我想要调用这个方法时,我将新建一个vm类。然后使用vm调用该方法。这将是一次成功。我认为原因是两个对象同时使用了一些资源。不管怎么说它都能跑。我希望这能帮到你。
我的例外如下:
warn: Hangfire.AutomaticRetryAttribute[0]
Failed to process the job '15': an exception occurred. Retry attempt 3 of 10 will be performed in 00:01:01.
`System.IO.FileNotFoundException: 未能加载文件或程序集“DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。
文件名:“DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”
在 System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type)
在 System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName)
在 System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase)
在 Hangfire.Storage.InvocationData.Deserialize()
=== 预绑定状态信息 ===
日志: DisplayName = DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
日志: Appbase = file:///D:/Code/Test/bin/Debug/net461/
日志: 初始 PrivatePath = NULL
调用程序集: Hangfire.Core, Version=1.6.19.0, Culture=neutral, PublicKeyToken=null。`
===
日志: 此绑定从 default 加载上下文开始。
日志: 正在使用应用程序配置文件: D:\Code\Test\bin\Debug\net461\ Test.exe.Config
日志: 使用主机配置文件:
日志: 使用 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config 的计算机配置文件。
日志: 此时没有为引用应用策略(私有、自定义、分部或基于位置的程序集绑定)。
日志: 相同的绑定已出现过,因 hr = 0x80070002 而失败。
发布于 2016-12-04 06:05:34
input.Schedule.JobId = BackgroundJob.Schedule<IAdHocTemplateRunnerAppService >(
x =>
x.AddTemplate (new Template{ RunId = Guid.NewGuid().ToString(), TemplateId = schedule.Id }), input.Schedule.Start);
https://stackoverflow.com/questions/39991196
复制相似问题