ASP.NET Core 中后台任务的用户会话

3
我了解到在ASP.NET Core中,执行后台任务的首选方式是使用托管服务。
有没有一种方法可以将(用户)会话传递给这个后台工作者?通常,会话是HttpContext的一部分,而在后台任务中不可用...
我知道我可以通过写入数据库来持久化数据,但我也想在内存中缓存一些数据。
3个回答

1
如果这一切都在进程内发生,那么您应该能够直接将ISession对象传递给后台服务,并让它与用户的会话交互,而无需用户的HttpContext存在。
默认的会话实现使用分布式缓存来持久化存储在会话中的信息。然后,每个会话对象只与存储在用户cookie中的会话键进行交互。当正在创建会话对象时,没有直接或间接引用HttpContext。会话存储本身也不以其他方式访问HttpContext。分布式缓存本身也独立于上下文和DI服务范围。

理论上,这应该可以正常工作。您可以使用ISession对象来修改会话,下次用户使用其会话ID进行请求时,更新的信息将等待他们。


1
确认。将ISession的引用存储起来是可行的。只需记得在更改会话变量后调用CommitAsync即可。 - Jack Miller

0

执行后台任务时,不能保证用户会话存在。请从用户会话中封装您的任务所需的数据,并将其传递给后台任务。


1
那可以读取会话变量,但我也需要写入它们。 - Jack Miller

0

正如您所知,会话是基于用户请求的。用户拥有会话!因此,当我们谈论会话时,实际上是指从客户端接收到的最终用户请求!想象一下这样一种情况:您在一个没有用户请求的基于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);
     }
   }

希望能理解,最好的问候 :)


我猜这个方法可以工作,但它看起来很像 ASP.NET MVC 3 中的静态缓存,因此重新实现了 ASP.NET Core 提供的会话缓存。 - Jack Miller
1
是的,亲爱的杰克,我同意你的观点,但我假设他不想实现会话缓存,所以我试图展示一种简单的模式来改变他对使用httpContextAccessor及其成本/收益的思考方式。 - Amir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接