.NET CORE FindByEmailAsync операция была отменена для вызова REST

Я пытаюсь построить приложение с Blazor и.net ядра. У меня есть контроллер учетной записи, который я использую для проверки учетных данных пользователя. Если я запускаю приложение в режиме отладки из VS (IIS) и отправляю учетные данные для входа с моей веб-страницы, то userManger вернет правильного пользователя. Но если я запускаю свое приложение из cmd (dotnet watch run), то userManager.FindByEmailAsync завершится с исключением:

System.OperationCanceledException: операция была отменена.

Это стек вызовов из cmd:

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware [1] Произошло необработанное исключение при выполнении запроса. System.OperationCanceledException: операция была отменена. в System.Threading.CancellationToken.ThrowOperationCanceledException() в Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore9.FindByEmailAsync(String normalizedEmail, CancellationToken cancellationToken) at Microsoft.AspNetCore.Identity.UserManager1.FindByEmailAsync (String email) в ProjectManagement.BlazorClient.Server.Controllers.AccountController.Login(запрос LoginRequest) в C:\Users\lukha\source\repos\ProjectManagement\ProjectManagement.BlazorClient.Server\Controller \ lineler: Account: 43 в Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(преобразователь IActionResultTypeMapper, ObjectMethodExecutor, контроллер объекта, аргументы объекта []) в System.Threading.Tasks.ValueTasc.1.SQL.Sec..Internal.ControllerActionInvoker.InvokeActionMethodAsync () в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync () в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvxtInAnt.Con (State & next, Scope & scope, Object & state, Boolean& isCompleted) в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(контекст ResourceExecutedContext) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvxt & Область State, Boolean & isCompleted) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() в Microsoft.AspNetCore.Builder.RttIntete.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(контекст 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 и вызываю этот контроллер из Почтальона, то все работает нормально. Это код моей страницы:

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

Есть идеи, что не так с моим кодом?

1 ответ

Решение

@lukesss:

Если я запускаю приложение из cmd и вызываю этот контроллер из Почтальона, то все работает нормально

Вы имеете в виду, что ваш Web API работает нормально, не так ли? Ну, нет никаких причин, почему это не должно быть.

Это Блазор Компонент выше? Если это так, вы не должны использовать тег формы Html. Также необходимо добавить атрибут type к элементу button со значением "button".

Теперь, когда вы нажмете на элемент управления кнопки, будет вызван Http.PostJsonAsync, который будет выполнять вызов Ajax (используя Fetch API) для вашего Web API, вместо того, чтобы отправлять сообщение обратно.

Нет тегов формы, нет сообщений обратно в Blazor.

Надеюсь это поможет...

Другие вопросы по тегам