.NET CORE FindByEmailAsync 操作因 REST 调用而被取消

.NET CORE FindByEmailAsync operation was canceled for REST call

我正在尝试使用 blazor 和 .net 核心构建应用程序。 我有用于用户凭据验证的帐户控制器。如果我 运行 从 VS (IIS) 调试应用程序并从我的网页发送登录凭据,那么 userManger 将 return 更正用户。但是,如果我 运行 来自 cmd (dotnet watch 运行) 的应用程序,那么 userManager.FindByEmailAsync 将以异常结束:

System.OperationCanceledException: The operation was canceled.

这是来自 cmd 的调用堆栈:

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1] An unhandled exception has occurred while executing the request. System.OperationCanceledException: The operation was canceled. at System.Threading.CancellationToken.ThrowOperationCanceledException() at Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore9.FindByEmailAsync(String normalizedEmail, CancellationToken cancellationToken) at Microsoft.AspNetCore.Identity.UserManager1.FindByEmailAsync(String email) at ProjectManagement.BlazorClient.Server.Controllers.AccountController.Login(LoginRequest request) in C:\Users\lukha\source\repos\ProjectManagement\ProjectManagement.BlazorClient.Server\Controllers\AccountController.cs:line 43 at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at System.Threading.Tasks.ValueTask`1.get_Result() at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync() at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync() at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext) at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

这是我的控制器代码:

[Route("api/[controller]")]
[ApiController]
public class AccountController : ControllerBase
{
    private readonly SignInManager<ApplicationUser> _signInManager;
    private readonly UserManager<ApplicationUser> _userManager;
    public AccountController(
        UserManager<ApplicationUser> userManager,
        SignInManager<ApplicationUser> signInManager,
        ILoggerFactory loggerFactory
    )
    {
        _signInManager = signInManager;
        _userManager = userManager;
    }

    [HttpPost("[action]")]
    [AllowAnonymous]
    public async Task<IActionResult> Login([FromBody]LoginRequest request)
    {
        var user = await _userManager.FindByEmailAsync(request.UserName);
    }        
}

编辑: 如果我从 cmd 运行 应用程序并从 Postman 调用这个控制器,那么一切正常。这是我的页面代码:

<form>
  <div>
    <label>Email: </label>
    <input required name="email" bind="@email" />
  </div>
  <div>
    <label>Password: </label>
    <input required type="password" name="password" bind="@password" />
  </div>
<button onclick=@(() => ButtonLogin_click())>Login</button>
</form>

@functions{
  string email;
  string password;

  protected async Task ButtonLogin_click()
  {
    var result = await Http.PostJsonAsync<object>("api/account/Login", new LoginRequest { UserEmail = email, Password = password});
  }
}

知道我的代码有什么问题吗?

@lukesss:

If I run application from cmd and I call this controller from Postman then everything works fine

你的意思是你是 Web API 工作正常,不是吗?嗯,没有理由不应该。

这是上面的 Blazor 组件吗?如果是,则不得使用 Html 表单标记。您还必须将 type 属性添加到值为 "button" 的按钮元素。

现在,当您点击按钮控件时,将调用 Http.PostJsonAsync,对您的 Web API 执行 Ajax 调用(使用 Fetch API),而不是制作 post 回来。

没有表单标签,Blazor 中没有 post。

希望这对您有所帮助...