已取消REST调用的.NET CORE FindByEmailAsync操作



我正在尝试使用blazor和.net内核构建应用程序。我有一个帐户控制器,我正在使用它来验证用户凭据。如果我在VS(IIS(的调试中运行应用程序,并从我的网页发送登录凭据,那么userManger将返回正确的用户。但如果我从cmd(dotnet watch run(运行我的应用程序,那么userManager.FindByEmailAsync将以异常结束:

System.OperationCanceledException:操作已取消。

这是来自cmd:的调用堆栈

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]执行请求时发生未经处理的异常。System.OperationCanceledException:操作已取消。位于System.Threading.CancellationToken.SthrowOperationCanceledException((位于Microsoft.AspNetCore.Identity。EntityFrameworkCore.UserStore9.FindByEmailAsync(String normalizedEmail, CancellationToken cancellationToken) at Microsoft.AspNetCore.Identity.UserManager1.FindByEmailAsync(字符串电子邮件(在C:\Users\lukha\source\repos\ProjectManagement\ProjectManager.BlazorClient.Server\Controllers\AccountController.Login(登录请求(位于Microsoft.AspNetCore.Mvc.Interal.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper映射程序、ObjectMethodExecutor执行程序、Object控制器、Object[]参数(位于System.Threading.Tasks.ValueTask`1.get_Result((位于Microsoft.AspNetCore.Mvc.Interal.ControllerActionInvoker.IInvokeActionMethodAsync((位于Microsoft.AspNetCore.Mvc.Interal.ControllerActionInvoker.InvokeNextActionFilterAsync((位于Microsoft.AspNetCore.Mvc.Interal.ControllerActionInvoker.Rethrow(ActionExecutedContext上下文(位于Microsoft.AspNetCore.Mvc.Interal.ControllerActionInvoker.Next(状态和下一个,作用域和作用域,对象和状态,布尔值和isCompleted(位于Microsoft.AspNetCore.Mvc.Interal.ControllerActionInvoker.InvokeInnerFilterAsync((位于Microsoft.AspNetCore.Mvc.Interal.ResourceInvoker.InvokeNextResourceFilter((位于Microsoft.AspNetCore.Mvc.Interal.ResourceInvoker.Rethrow(ResourceExecutedContext上下文(位于Microsoft.AspNetCore.Mvc.Interal.ResourceInvoker.Next(状态和下一个,作用域和作用域,对象和状态,布尔值和isCompleted(位于Microsoft.AspNetCore.Mvc.Interface.ResourceInvoker.InvokeFilterPipelineAsync((位于Microsoft.AspNetCore.Mvc.Interface.ResourceInvoker.InvokeAsync((位于Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext HttpContext(位于Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.IInvoke(HttpContext上下文(

这是我的控制器代码:

[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});
}
}

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

@lukess:

如果我从cmd运行应用程序,并从Postman调用此控制器然后一切正常

你的意思是你的Web API工作得很好,不是吗?没有理由不这样做。

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

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

没有表单标签,没有回Blazor的帖子。

希望这能帮助。。。

最新更新