Blazor ASP.Net Core 3.1 Web API 在发布时返回 404 错误
Posted
技术标签:
【中文标题】Blazor ASP.Net Core 3.1 Web API 在发布时返回 404 错误【英文标题】:Blazor ASP.Net Core 3.1 web API returning 404 error when published 【发布时间】:2020-07-10 22:46:28 【问题描述】:我正在使用托管的 Blazor WebAssembly App ASP.NET 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/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 中。
我注意到服务之间的唯一区别是有效的服务只返回一个字符串。登录、注册和其他控制器返回一个Task>。这是问题吗?如果是这样,有没有另一种方式来实现登录?
【问题讨论】:
如何调用 GET 和 Login 方法? GET - localhost:91/api/Account POST - localhost:91/api/Account/Login 正如您所说,这是“开发”和“生产”之间的区别。你没有详细说明。什么叫“生产”?你如何在开发中运行它?什么个人资料? 开发模式是当我使用 IIS Express 通过 Visual Studio 运行代码并调试代码时。对于生产模式,我将应用程序发布在一个文件夹中,并使用本地 IIS 创建了一个网站,遵循 Microsoft 在其文档中的提示 -> docs.microsoft.com/pt-br/aspnet/core/host-and-deploy/iis/…。 你试过 PostMan 来测试/调查你的 API 吗? 【参考方案1】:我解决了这个问题。我用 try catch 包围了登录服务并开始返回堆栈跟踪。我注意到错误出现在连接字符串中,我没有通知数据库登录名和密码。在开发模式下,不需要输入数据库登录名和密码,但在生产中这是强制性的。谢谢大家的提示=D
【讨论】:
以上是关于Blazor ASP.Net Core 3.1 Web API 在发布时返回 404 错误的主要内容,如果未能解决你的问题,请参考以下文章
Asp.NET Core进阶 第四篇 Asp.Net Core Blazor框架
在 ASP.NET Core 站点中实现 Blazor - 组件不在视图中呈现
Blazor - WebAssembly ASP.NET Core 托管模型