2

在我们的项目中,我们使用 aspnetzero 模板。该模板允许简单但抽象地使用hangfire。现在我们想将Hangfire.Console添加到我们的项目中,这将允许我们将日志写入hangfires 仪表板。

为了将日志语句写入仪表板控制台,我们必须访问当前正在运行的作业的 PerformContext。不幸的是,由于 aspnetzero 中的抽象,我们无法注入PerformContext ,因为它会由hangfire计划。我们可以访问的是 hangfire 命名空间和所有它的静态对象。

因此我的问题是:除了将 null 传递给执行方法之外,还有其他方法可以获取 PerformContext 吗?

到目前为止我已经尝试过:

  • 通过使用IServerFilter接口,应该调用OnPerforming方法。但不幸的是,在 aspnetzero 后台作业中并非如此。
  • 我试图覆盖/扩展 aspnetzero 的给定基类BackgroundJob< T >但没有运气。也许有人可以在这个方向给我一个提示。
4

2 回答 2

2

我用JobFilterAttribute 一个IServerFilter.

例子:

[AttributeUsage(AttributeTargets.Class)]
 public class HangFirePerformContextAttribute : JobFilterAttribute, IServerFilter
{
         private static PerformContext _Context;

        public static PerformContext PerformContext
        {
            get
            {
                return new PerformContext(_Context);
            }
        }
        public void OnPerformed(PerformedContext filterContext)
        {
            Context = (PerformContext)filterContext;
            _Context = Context;
        }
        public void OnPerforming(PerformingContext filterContext)
        {
            Context = (PerformContext)filterContext;
            _Context = Context;
        }
}

我创建了一个新班级AsyncBackgroundJobHangFire<TArgs> : AsyncBackgroundJob<TArgs>

示例:

    [HangFirePerformContext]
    public abstract class AsyncBackgroundJobHangFire<TArgs> : AsyncBackgroundJob<TArgs>
    {
        public PerformContext Context { get; set; }

        protected async override Task ExecuteAsync(TArgs args)
        {
            Context = HangFirePerformContextAttribute.PerformContext;
            await ExecuteAsync(args, Context);
        }

        protected abstract Task ExecuteAsync(TArgs args, PerformContext context);
    }

这是工作

在一类工作中,我使用AsyncBackgroundJobHangFire

而de方法是

        [UnitOfWork]
        protected override async Task ExecuteAsync(string args, PerformContext context)
        {
        }
于 2021-04-23T17:12:39.540 回答
0

我也遭受了使用 abp 执行hangfire 作业的痛苦。我不知道如何准确回答您的问题,但我能够PerformingContext通过实现扩展JobFilterAttribute和实现的属性来访问 a IClientFilter, IServerFilter, IElectStateFilter, IApplyStateFilter。界面将取决于您的要求,但我能够以PerformingContext这种方式访问​​。

于 2019-09-04T19:33:35.167 回答