从放置在单独任务中的静态方法访问HttpContext.Session时出现以下错误:
尚未为此应用程序或请求配置会话。
我使用this article来实现对控制器外部HttpContext的访问
从控制器中,我调用了用于检索图像数据的静态方法:
public static void CreateDummyGallery(Gallery gallery)
{
Logger.LogDebug(LogModule.Dummy, $"Starting gallery creation.");
Task.Factory.StartNew(() =>
{
try
{
List<DummyPicture> pictures;
using (var context = new MyzeumContext())
{
int top = 10;
pictures = context.DummyPictures.FromSql($"SELECT * FROM dummypictures ORDER BY RAND() LIMIT {top}").ToList();
}
Logger.LogDebug(LogModule.Dummy, $"Starting retrieving images.");
Parallel.ForEach(pictures, picture => {
using (WebClient client = new WebClient())
{
}
});
Logger.LogDebug(LogModule.Dummy, $"Done retrieving images.");
}
catch(Exception e)
{
Logger.LogError(LogModule.Server, e.Message, e);
}
});
}
在Logger.LogDebug()中出现问题,因为这是我访问HttpContext的地方:
public void LogDebug(LogModule module, string message, Exception stackTrace = null)
{
Log record = new Log();
record.Module = module;
record.ThreadId = Environment.CurrentManagedThreadId;
record.SessionId = HttpContextHelper.Current?.Session?.Id;
record.Message = message;
record.Logged = DateTime.UtcNow;
if(stackTrace != null)
{
record.Message += $" :{stackTrace.StackTrace}";
}
queue.Enqueue(record);
}
99%的问题发生在任务内部的第一次呼叫中:
Logger.LogDebug(LogModule.Dummy, $"Starting retrieving images.");
但是,在应用程序启动后,整个任务块就可以正常工作,并且不会引发任何异常。按照以下要求开始问题。