我已将 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&来解决上述错误其他解决方案也未能解决。任何人都可以帮我解决这个问题。
提前致谢,
西仁
答案 0 :(得分:0)
Hangfire工作不会在与asp.net相同的环境中运行,它拥有自己的线程池。实际上,如果您的hangfire池中有多个服务器,则Hangfire作业甚至可能在与排队作业的服务器不同的服务器上执行。
您希望从作业中访问的任何数据都需要作为方法参数传入。例如:
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请求正在进行时才会收到会话。我无法帮助你,因为我不知道你真正想要做什么。