将会话变量用于Hangfire重复作业

时间:2018-04-17 19:00:06

标签: asp.net hangfire

我已将 hangfire 集成到Asp.net网络应用程序中,并尝试将会话变量用于Hangfire Recurring Job,如下所示:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        HangfireSyncServices objSync = new HangfireSyncServices();

        var options = new DashboardOptions
        {
            Authorization = new[] { new CustomAuthorizationFilter() }
        };
        app.UseHangfireDashboard("/hangfire", options);

        app.UseHangfireServer();

        //Recurring Job
        RecurringJob.AddOrUpdate("ADDRESS_SYNC", () => objSync.ADDRESS_SYNC(), Cron.MinuteInterval(30));

    }
}

我的“HangfireSyncServices”课程如下:

public partial class HangfireSyncServices : APIPageClass
{
    public void ADDRESS_SYNC()
    {
        string userName = Convert.ToString(Session[Constants.Sessions.LoggedInUser]).ToUpper();
                //Exception throwing on above statement..
        //........Rest code.......
    }
}

public abstract class APIPageClass : System.Web.UI.Page
{
    //common property & methods...
}

但是我在获取“userName”值时遇到如下运行时异常: 只有在配置文件或Page指令中将enableSessionState设置为true时,才能使用会话状态。还请确保System.Web.SessionStateModule或自定义会话状态模块包含在 应用程序配置中的部分。

我尝试使用此LINK&来解决上述错误其他解决方案也未能解决。任何人都可以帮我解决这个问题。

提前致谢,
西仁

1 个答案:

答案 0 :(得分:0)

Hangfire工作不会在与asp.net相同的环境中运行,它拥有自己的线程池。实际上,如果您的hangfire池中有多个服务器,则Hang​​fire作业甚至可能在与排队作业的服务器不同的服务器上执行。

您希望从作业中访问的任何数据都需要作为方法参数传入。例如:

public partial class HangfireSyncServices //: APIPageClass <- you can't do this..
{
    public void ADDRESS_SYNC(string userName)
    {
        //........Rest code.......
    }
}

string userName = Convert.ToString(Session[Constants.Sessions.LoggedInUser]).ToUpper();
RecurringJob.AddOrUpdate("ADDRESS_SYNC", () => objSync.ADDRESS_SYNC(userName), Cron.MinuteInterval(30));

请注意,执行上述操作会创建一个定期执行的任务,该任务将始终针对同一个用户执行,该用户是触发创建该作业的Web请求的用户。

下一个问题:您正在尝试在服务器启动时创建此作业,因此还没有会话。您只在Web请求正在进行时才会收到会话。我无法帮助你,因为我不知道你真正想要做什么。