我了解到在ASP.NET Core中,执行后台任务的首选方式是使用托管服务。
有没有一种方法可以将(用户)会话传递给这个后台工作者?通常,会话是HttpContext的一部分,而在后台任务中不可用...
我知道我可以通过写入数据库来持久化数据,但我也想在内存中缓存一些数据。
有没有一种方法可以将(用户)会话传递给这个后台工作者?通常,会话是HttpContext的一部分,而在后台任务中不可用...
我知道我可以通过写入数据库来持久化数据,但我也想在内存中缓存一些数据。
执行后台任务时,不能保证用户会话存在。请从用户会话中封装您的任务所需的数据,并将其传递给后台任务。
正如您所知,会话是基于用户请求的。用户拥有会话!因此,当我们谈论会话时,实际上是指从客户端接收到的最终用户请求!想象一下这样一种情况:您在一个没有用户请求的基于aspnetcore的微服务中有一个后台任务。您永远不会看到任何会话可供捕获,因为没有用户发送任何请求。 在普通的晴朗日子里,后台任务中存在用户会话的概率非常低。 但是! 如果您有一个后台服务,希望将其用作缓存,则应按用户请求执行缓存读/写操作。我强烈建议您避免在后台任务中使用HttpContext,因为您的任务将无法扩展,并且与http基础架构紧密耦合。 这里有一个简单的示例:D以更清楚地说明:
public interface ICache {
Task Write(string uniqueIdentifier, object data);
Task<object> Read(string uniqueIdentifier);
}
public class BackgroundTaskBasedCache : ICache {
public void Init()
{
//Initialize your background operations.
}
//IO bound
public async Task Write(string sessionId, object data)
{
//write inside your cache.
}
public async Task<object> Read(string sessionId)
{
//read from your cache.
return new object();//for test.
}
}
startup.cs:
//this will add a signleton background task. (you can do it manually or using other tools/strategies.
services.AddSingleton<ICache, BackgroundTaskBasedCache>();
在你的控制器内:
{
public TestController(ICache cache, IHttpContextAccessor){//fill properties}
public async Task<IActionResult> ExecuteSomeRequestAction()
{
await cache.Write(httpContextAccessor.HttpContext.SessionId, data);
}
}
希望能理解,最好的问候 :)
ISession
的引用存储起来是可行的。只需记得在更改会话变量后调用CommitAsync
即可。 - Jack Miller