none
Blazor ASP.Net Core 3.1 web API retornando erro 404 quando publicado RRS feed

  • 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?

    segunda-feira, 30 de março de 2020 17:14

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.
    quinta-feira, 2 de abril de 2020 13:05
  • 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


    quarta-feira, 20 de maio de 2020 20:09