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——Asp.net core的新前端框架

Blazor - WebAssembly ASP.NET Core 托管模型

.NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新

从 ASP.NET Core Blazor 中的 .NET 方法调用 JavaScript 函数