为什么 HttpContext.Session 状态更改为已处置?

ily*_*rol 1 c# asp.net-core-3.1

我正在尝试存储从会话中的外部 api 获取的令牌。

与此相关的代码片段;

        [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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

HttpContext.Session.SetValue("令牌", "测试");

在此部分中,它不会发生任何错误,但第二个相同的代码行在 GetToken() 之后给出错误。

相关错误

System.ObjectDisposeException:'IFeatureCollection 已被释放。对象名称:“集合”。

还有 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;
        }
Run Code Online (Sandbox Code Playgroud)

pin*_*x33 5

问题是你正在使用async void. 这些承诺无法被遵守,而且它们的语义最终与正常的Task. 您的处理很早就发生了,因为基础设施只是假设您的Post方法已经完成(它无法告诉其他情况)。

将 的签名更改Post为:

public async Task Post()
Run Code Online (Sandbox Code Playgroud)

请注意,async void应仅限于事件处理程序。