[英].Net 6 - Razor Pages - Problems with HttpContext.Session
[英]Why is HttpContext.Session status changing to disposed?
我正在嘗試將我從外部 api 獲得的令牌存儲在 session 上。
與此相關的代碼片段;
[HttpPost]
public async void Post()
{
if (HttpContext.Session.GetValue<User>("Token") == null)
{
HttpContext.Session.SetValue("Token", "test");
var res = await _loginBusiness.GetToken();
HttpContext.Session.SetValue("Token", res);
}
}
HttpContext.Session.SetValue("Token", "test");
在這部分中,它不會發生任何錯誤,但第二個相同的代碼行在 GetToken() 之后給出錯誤。
相關錯誤
System.ObjectDisposedException: 'IFeatureCollection 已被釋放。 Object 名稱:“收藏”。
還有GetToken():
public async Task<User> GetToken()
{
String url = "login/login";
var client = httpClientFactory.CreateClient("VoiceScope");
var postRes = await client.PostAsync<User>(new UserLogin(), url);
return postRes;
}
我不確定是否使用 HttpContext。 您在 asp.net 內核中有 IHttpContextAccessor。 我認為對於商店令牌,您可以使用它
public class UserContext
{
public UserContext(IHttpContextAccessor context)
{
Token = GetAccessToken(context);
}
private static string GetAccessToken(IHttpContextAccessor contextAccessor)
{
var identity = (ClaimsIdentity)contextAccessor?.HttpContext?.User?.Identity;
return identity?.Claims.FirstOrDefault(x => x.Type == "token")?.Value;
}
public string Token { get; }
}
然后,將這些人員添加到您的 DI 中,例如 scope object 並通過 ServiceProvider 在控制器中使用它。
問題是您使用的是async void
。 這些承諾不能被觀察到,它們的語義最終與正常的Task
有很大不同。 您的處置很早就發生了,因為基礎設施只是假設您的Post
方法已經完成(它無法判斷其他情況)。
將Post
的簽名更改為:
public async Task Post()
請注意async void
應僅限於事件處理程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.