繁体   English   中英

为什么我们每个动作方法都必须调用await _userManager.GetUserAsync(User)?

[英]Why do we have to invoke await _userManager.GetUserAsync(User) per action method?

老实说,我不了解基于asp.net-core的Web应用程序是如何工作的。 现在,我试图一点一点地弄清它在幕后的工作方式。

让我们考虑选择了“ Individual User Account的默认模板。 更精确地在ManageController类中如下。

namespace StackOverflow.Controllers
{
    [Authorize]
    [Route("[controller]/[action]")]
    public class ManageController : Controller
    {
        // others are trimmed for the sake of simplicity 

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> EnableAuthenticator(EnableAuthenticatorViewModel model)
        {
            // ..........

            var user = await _userManager.GetUserAsync(User);
            // ........
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> ResetAuthenticator()
        {
            var user = await _userManager.GetUserAsync(User);
            //.......
        }

        [HttpGet]
        public async Task<IActionResult> GenerateRecoveryCodes()
        {
            var user = await _userManager.GetUserAsync(User);
            // ..........
        }        
}

该声明

var user = await _userManager.GetUserAsync(User);

几乎在每种动作方法中都会发生。

为什么我们每个动作方法都必须调用await _userManager.GetUserAsync(User) 我们为什么不将其作为类财产?

为了使用类属性,您需要一个异步属性 在C#中这是不可能的-Stephen Cleary在这里详细讨论了这个话题。

这是一个有目的的设计决策,因为“异步属性”是矛盾的。 属性获取器应返回当前值; 他们不应该启动后台操作。 而且,“异步设置器”背后的语义还不清楚。

尽管您可以阻止异步代码,但不建议这样做。 有来自斯蒂芬·克利里另一篇关于这一主题在这里

但是,您不应该这样做。 因为当您阻塞异步代码的那一刻,您就首先放弃了异步代码的所有好处。 阻塞线程后,异步处理程序增强的可伸缩性将被取消。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM