如何从hangfire API 获取 PerformContext
Posted
技术标签:
【中文标题】如何从hangfire API 获取 PerformContext【英文标题】:How to get the PerformContext from hangfire API 【发布时间】: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,但没有成功。也许有人可以在这个方向上给我一个提示。【问题讨论】:
【参考方案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
。
【讨论】:
这是作为答案发布的,但它不会尝试回答问题。应该是评论。 没有样本,你说的话不容易推理。这很可能是评论而不是真正的答案。以上是关于如何从hangfire API 获取 PerformContext的主要内容,如果未能解决你的问题,请参考以下文章