【问题标题】:Return ActionResult OR Task from function从函数返回 ActionResult OR Task
【发布时间】:2021-06-22 21:22:33
【问题描述】:

以下代码用于检查用户的身份验证状态。如果用户通过身份验证,它会重定向到前端端点,这是一个同步的RedirectResult。如果用户不是,则需要调用HttpContext.ChallengeAsync函数,该函数返回一个Task

public async Task<dynamic> Authorize()
{
    if (HttpContext.User.Identity.IsAuthenticated)
    {
        return Redirect("/authorize");
    }

    return await ChallengeAsync();
}

public async Task<dynamic> ChallengeAsync()
{
    var authenticationProperties = new AuthenticationProperties
    {
        RedirectUri = "/authorize",
        Items =
        {
            { "scheme", "oidc" },
            { "returnUrl", "/authorize" }
        }
    };
    return HttpContext.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, authenticationProperties);
}

过去几年我一直在 TypeScript Land,所以我想返回 IActionResult | TaskTask&lt;IActionResult&gt; | Task 之类的东西,但我认为这在 C# 中是不可能的。

我使用的代码是 hack。它通常可以工作,但有时(通常是第一次)会抛出错误

{"stateMachine":{"1__state":3,"t__builder":{

This SO question 说这很可能会发生,因为我没有等待应该等待的事情。我可以等待ChallengeAsync 并返回Task,但这会以我无法解开的方式混淆Authorize 函数中的类型。

【问题讨论】:

  • 您正在从异步方法返回一个未等待的任务——当然它会以这种方式序列化。否则你会期待什么?将asyncChallengeAsync 中取出,如下所示:public Task&lt;dynamic&gt; ChallengeAsync()。然后确保调用者等待它。
  • 你能不返回ChallengeResult吗? ChallengeAsync 方法返回的 Task 并不是要传递回浏览器/客户端。
  • 在 C# 中没有像 Typescript 联合类型这样的东西。您可以使用 Task.FromResult 在重定向案例中返回已完成的任务。
  • 感谢@Damien_The_Unbeliever!这条对你来说微不足道的信息对我来说似乎是无价的。当您派遣前端人员完成全栈工作时,就会发生这种情况。 ????

标签: c# asynchronous asp.net-core-webapi


【解决方案1】:

我刚刚遇到了这个问题,但我使用基本控制器的 Challenge 操作助手解决了它。

public IActionResult Authorize()
{
    if (HttpContext.User.Identity.IsAuthenticated)
    {
        return Redirect("/authorize");
    }

    return Challenge(new AuthenticationProperties
    {
        RedirectUri = "/authorize",
        Items =
        {
            { "scheme", "oidc" },
            { "returnUrl", "/authorize" }
        }
    }, OpenIdConnectDefaults.AuthenticationScheme)
}

【讨论】:

    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2016-10-05
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多