Inquiridor
Blazor ASP.Net Core 3.1 web API retornando erro 404 quando publicado

Pergunta
-
Estou fazendo alguns testes com o Blazor WebAssembly App ASP.NET Core Hosted. Este é um modelo em uma versão preview, que fornece uma solução com três projetos, sendo o cliente, o servidor e o compartilhado. Nesta solução, estou usando o Entity Framework para acessar o banco de dados e o Identity Core para realizar o registro e o login do usuário.
Para isso, implementei o seguinte controlador.using BlazorAutoComplete.Shared.Models; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using System.Threading.Tasks; [Route("api/[controller]")] [ApiController] public class AccountController : ControllerBase { private readonly UserManager<IdentityUser> _userManager; private readonly SignInManager<IdentityUser> _signInManager; private readonly IConfiguration _configuration; public AccountController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager, IConfiguration configuration) { this._userManager = userManager; this._signInManager = signInManager; this._configuration = configuration; } [HttpGet] public string Get() { return $"AccountController :: {DateTime.Now.ToShortDateString()}"; } [HttpPost("Login")] public async Task<ActionResult<UserToken>> Login([FromBody] UserInfo userInfo) { var result = await _signInManager.PasswordSignInAsync(userInfo.Email, userInfo.Password, isPersistent: false, lockoutOnFailure: false); if (result.Succeeded) { return await GenerateTokenAsync(userInfo); } else { return BadRequest(new { message = "Login inválido" }); } }
Eu também tenho o método de registro neste controlador, mas isso não vem ao caso.
O problema em que preciso de ajuda: no modo de desenvolvimento, todos os serviços funcionam (login, registro e Get, que retorna apenas uma string, acessada em "api/account"). No entanto, quando publico meu projeto, apenas esse serviço Get funciona. Quando tento acessar a API de login, recebo uma resposta 404 No Found.
A chamada do método de login:@inject HttpClient http @inject NavigationManager navigation @inject TokenAuthenticationProvider authStateProvider async Task FazerLogin() { try { var loginAsJson = JsonSerializer.Serialize(userInfo); var httpResponse = await http.PostAsync("api/account/login", new StringContent(loginAsJson, Encoding.UTF8, "application/json")); if (httpResponse.IsSuccessStatusCode) { var responseAsString = await httpResponse.Content.ReadAsStringAsync(); var loginResult = JsonSerializer.Deserialize<UserToken>(responseAsString, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); await authStateProvider.Login(loginResult.Token); navigation.NavigateTo("/"); } else { loginFalhou = true; Mensagem = $"Não foi possível realizar o login do usuário. (Erro: {httpResponse.StatusCode})"; } } catch (Exception) { loginFalhou = true; Mensagem = $"Não foi possível realizar o login do usuário..."; } }
Entendo que o ASP.NET Core Hosted do Blazor WebAssembly é um modelo em uma versão preview. Mas acredito que o problema eseja no ASP.NET Core 3.1.
A única diferença que noto entre os serviços é que o serviço que funciona retorna apenas uma string. O login, registro e outros controladores retornam uma Task<ActionResult<T>>. Esse é o problema? Se sim, existe outra maneira de implementar o login?
Todas as Respostas
-
Problema resolvido. Circundei o serviço de login com um try catch e passei a retornar o stack trace da exceção. Com isso, vi que estava ocorrendo erro na string de conexão, pois eu não havia informado o login e senha do banco de dados. Afinal, em modo de desenvolvimento, usando o IIS Express, não é necessário que login e senha sejam informados, mas em produção precisa. Ajustando a string de conexão o serviço passou a funcionar.
-
Utilize o try catch com valores, por exemplo:
try { código } catch(Exception ex) { Mensagem.Text = ex.ToString(); }
Tem certeza que o server está configurado para o Core 3.1?
Espero ter ajudado. Se ajudei, favor marcar no fórum falando que foi útil.
Mauricio Junior - Comunidade www.ecode10.com
- Editado Mauricio-Junior quarta-feira, 20 de maio de 2020 20:09