Blazor ASP. Net Core 3.1 Web API возвращает ошибку 404 при публикации - PullRequest
0 голосов
/ 30 марта 2020

Я провожу некоторые тесты с приложением Blazor WebAssembly ASP. NET Размещено ядро. Это шаблон в предыдущей версии, который предоставляет решение с тремя проектами: клиент, сервер и общий. В этом решении я использую Entity Framework для доступа к базе данных и Identity Core для выполнения регистрации пользователей и входа в систему.

Для этого я реализовал следующий контроллер.

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

У меня также есть метод регистрации на этом контроллере, но это не относится к делу.

Проблема, с которой мне нужна помощь: в режиме разработки работают все службы (вход в систему, регистрация и получение, которое возвращает только одну строку, доступ к которой осуществляется через "api / Счет"). Однако, когда я публикую sh мой проект, работает только этот сервис Get. Когда я пытаюсь получить доступ к API входа в систему, я получаю ответ 404. Not Found.

Вызов метода входа в систему.

@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...";
    }

}

Я использовал метод PostAsyn c, чтобы проверить, был ли httpResponse успешный в общении. Но я также пытался реализовать метод следующим образом:

async Task FazerLogin()
{
    try
    {
        var loginResult = await http.PostJsonAsync<UserToken>("/api/account/login", userInfo);

        await authStateProvider.Login(loginResult.Token);
        navigation.NavigateTo("/");
    }
    catch (Exception ex)
    {
        Console.Write(ex);
    }
}

Но ошибка остается.

Error occurring when login service call using HttpClient.

Я понимаю, что Blazor WebAssembly ASP. NET Core Hosted - это шаблон в предыдущей версии. Но я считаю, что проблема в ASP. NET Core 3.1.

Единственное отличие, которое я замечаю между сервисами, заключается в том, что работающий сервис возвращает только одну строку. Логин, регистрация и другие контроллеры возвращают Задачу>. Это проблема? Если да, есть ли другой способ реализовать логин?

1 Ответ

0 голосов
/ 02 апреля 2020

Я решил проблему. Я окружил сервис входа в систему попыткой catch и начал возвращать трассировку стека. При этом я заметил, что ошибка была в строке подключения, я не сообщил логин и пароль базы данных. В режиме разработки нет необходимости вводить логин и пароль базы данных, но в производственном процессе это обязательно. Спасибо всем за советы = D

...