【问题标题】:How to get the PerformContext from hangfire API如何从hangfire API 获取 PerformContext
【发布时间】:2020-01-01 18:20:13
【问题描述】:

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

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

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

到目前为止我所做的尝试:

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

【问题讨论】:

    标签: aspnetboilerplate hangfire abp hangfire-console


    【解决方案1】:

    我使用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)
            {
            }
    

    【讨论】:

    • 再补充一点,你可以把它放在你的hangfire启动/配置附近的某个地方(至少在.NET框架上!)GlobalConfiguration.Configuration.UseFilter(new HangFirePerformContextAttribute());
    【解决方案2】:

    我在使用 abp 的 hangfire 作业实施时也遇到了麻烦。我不知道如何准确回答您的问题,但我能够通过实现扩展JobFilterAttribute 并实现IClientFilter, IServerFilter, IElectStateFilter, IApplyStateFilter 的属性来访问PerformingContext。接口取决于您的要求,但我可以通过这种方式访问​​PerformingContext

    【讨论】:

    • 这是作为答案发布的,但它不会尝试回答问题。应该是评论。
    • 没有样本,你说的话不容易推理。这很可能是评论而不是真正的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 2012-02-02
    • 2019-02-28
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多