【问题标题】:Task scheduling for ASP.NET with access to HttpContext可访问 HttpContext 的 ASP.NET 任务调度
【发布时间】:2019-10-14 22:43:58
【问题描述】:

首先,我的目标是实现任务调度,任务是每天创建当前网页的离线HTML文件。

我尝试过 Quartz.NET,但它似乎不合适,因为 Job 类无法访问 HttpContext。由于页面内容高度依赖服务器端数据,并且在生成离线文件时有很多客户端编辑,如果不直接访问“现成”HttpContext,这些可能会非常复杂。

对我有什么建议和想法吗?

(我使用的是早期版本的 ASP.NET 而不是 Core,因此也不考虑 HttpContextAccessor。)

【问题讨论】:

    标签: asp.net vb.net scheduled-tasks httpcontext


    【解决方案1】:

    在创建Job 时,您可以访问HttpContext,您可以提供从HttpContextJobBuilder 的所有信息。

    代码取自https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/more-about-jobs.html

    代码在 c# 中,我希望你能在 vb.net 中做同样的事情

    // define the job and tie it to our DumbJob class
    
    IJobDetail job = JobBuilder.Create<DumbJob>()
        .WithIdentity("myJob", "group1")
        .UsingJobData("jobSays", "Hello World!") // key value (put required key and value from HttpContext)
        .UsingJobData("myFloatValue", 3.141f)
        .Build();
    

    这是一个在作业执行期间从 JobDataMap 获取数据的快速示例:

    从 JobDataMap 中获取值

    public class DumbJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            JobKey key = context.JobDetail.Key;
    
            JobDataMap dataMap = context.JobDetail.JobDataMap;
    
            string jobSays = dataMap.GetString("jobSays");
            float myFloatValue = dataMap.GetFloat("myFloatValue");
    
            await Console.Error.WriteLineAsync("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
        }
    }
    

    【讨论】:

    • 页面的内容总是根据来自服务器的数据更新,这就是我打算做的目的 - 请参阅问题的第一段。因此,访问 HttpContext 的过程应该在作业的执行中,而不是在任务调度器的启动中。否则,每一个下载的文件都会完全一样,毫无意义。
    猜你喜欢
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2011-08-23
    相关资源
    最近更新 更多