簡體   English   中英

ASP.NET 核心后台任務中的用戶 session

[英]User session in background task in ASP.NET Core

我了解到, 用於后台任務的首選 ASP.NET-Core 方式托管服務

有沒有辦法將(用戶) session 傳遞給這個后台工作人員? 通常 session 是HttpContext的一部分,在后台任務中不可用...

我知道我可以通過寫入數據庫來保存數據,但我還想在 memory 中緩存一些數據。

如果這一切都發生在進程中,那么您應該能夠將ISession object 直接傳遞給您的后台服務,並讓它與用戶的 session 交互,而無需用戶的 HttpContext 。

默認的 session 實現是使用分布式緩存來持久化存儲在 session 中的信息。 然后每個 session object 僅與存儲在用戶 cookie 中的 session 密鑰交互。 創建session object 時,不會傳遞對 HttpContext 的直接或間接引用。 session 存儲本身也不以其他方式訪問 HttpContext。 分布式緩存本身也獨立於上下文以及 DI 服務 scope。

所以至少在理論上,這應該可以正常工作。 您可以使用ISession object 來修改 session 並且下次用戶使用他們的 session id 發出請求時,更新的信息將在那里等待他們。

不保證執行后台任務時用戶 session 會存在。 封裝您的任務需要從用戶 session 獲得的數據並將其傳遞給后台任務。

如您所知 session 是基於此用戶請求。 用戶擁有 session,所以當我們談論 session 時。 實際上,我們指向的是從客戶端收到的最終用戶請求。 想象一下,您在基於 aspnetcore 的微服務中有一個沒有用戶請求的后台任務,您永遠不會看到任何要捕獲的會話,因為沒有用戶發送任何請求。 在正常晴天,用戶 session 存在於后台任務中的概率非常低。 但是,如果您有一個后台服務想要將其用作緩存,您應該根據用戶請求執行緩存讀/寫操作。 我強烈建議您避免在后台任務中使用 HttpContext:因為您的任務將不可擴展:與 http 基礎架構緊密耦合。 有一個簡單的 SAMPLE :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.
  }
}

啟動.cs:

//this will add a signleton background task. (you can do it manually or using other tools/strategies.
services.AddSingleton<ICache, BackgroundTaskBasedCache>();

在你的 controller 里面:

    {
   public TestController(ICache cache, IHttpContextAccessor){//fill properties}
     public async Task<IActionResult> ExecuteSomeRequestAction()
     {
         await cache.Write(httpContextAccessor.HttpContext.SessionId, data);
     }
   }

希望理解和最好的問候:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM