Blazor ASP.Net Core 3.1 web API 发布时返回 404 错误
Blazor ASP.Net Core 3.1 web API returning 404 error when published
我正在使用托管的 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" });
}
}
我也有在这个控制器上的注册方法,但这不是重点
我需要帮助的问题:在开发模式下,所有服务都可以正常工作(登录、注册和获取其中 return 只有一个字符串,在 "api/account" 中访问)。但是,当我发布我的项目时,只有 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...";
}
}
我使用PostAsync 方法检查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);
}
}
但错误依旧。
我了解到 Blazor WebAssembly ASP.NET Core Hosted 是以前版本中的模板。但我相信问题出在 ASP.NET Core 3.1.
我注意到这些服务之间的唯一区别是工作的服务 return 只有一个字符串。登录、注册等控制器return一个Task>。这是问题吗?如果是这样,还有其他方法可以实现登录吗?
我解决了这个问题。我用 try catch 包围了登录服务,并开始 return 堆栈跟踪。之后我注意到错误出在连接字符串中,我没有告知数据库登录名和密码。在开发模式下,不需要输入数据库登录名和密码,但在生产中这是强制性的。谢谢大家的指点=D
我正在使用托管的 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" });
}
}
我也有在这个控制器上的注册方法,但这不是重点
我需要帮助的问题:在开发模式下,所有服务都可以正常工作(登录、注册和获取其中 return 只有一个字符串,在 "api/account" 中访问)。但是,当我发布我的项目时,只有 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...";
}
}
我使用PostAsync 方法检查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);
}
}
但错误依旧。
我了解到 Blazor WebAssembly ASP.NET Core Hosted 是以前版本中的模板。但我相信问题出在 ASP.NET Core 3.1.
我注意到这些服务之间的唯一区别是工作的服务 return 只有一个字符串。登录、注册等控制器return一个Task>。这是问题吗?如果是这样,还有其他方法可以实现登录吗?
我解决了这个问题。我用 try catch 包围了登录服务,并开始 return 堆栈跟踪。之后我注意到错误出在连接字符串中,我没有告知数据库登录名和密码。在开发模式下,不需要输入数据库登录名和密码,但在生产中这是强制性的。谢谢大家的指点=D