簡體   English   中英

為什么 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.

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