c# - 如何修复 HttpErrorResponse 404 未找到

标签 c# angular

我在 Web 控制台上收到错误消息,它显示“http://localhost:5000/api/authregister 的 Http 失败响应:404 未找到”。我尝试在网上寻找解决方案,但没有帮助。如何解决这个问题?

pic1

我尝试查看 Postman 是否使用“GET”并且它确实有效,但是在“POST”上它不会更新数据库并且没有得到任何响应。

pic2

我检查了数据库的更新结果,没有任何变化,我只有 2 个用户名和密码:

pic3

更新:我找到了获取此 IP 地址的原因:

http://localhost:5000/api/authregister

在 baseUrl 上,我在 auth.service.ts 上缺少“/”,但是我现在收到“http://localhost:5000/api/auth/register 的 Http 失败响应:400 错误请求”。这是auth.service.ts:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import {map} from'rxjs/operators';

@Injectable({ //inject to service
  providedIn: 'root'
})
export class AuthService {
  baseUrl = 'http://localhost:5000/api/auth/'; //I added a '/' to the end

constructor(private http: HttpClient) { }

login(model: any) {
  return this.http.post(this.baseUrl + 'login', model)
  .pipe(
    map((response: any) => {
      const user = response;
      if (user) {
        localStorage.setItem('token', user.token);
      }
    })
  )
}

register(model: any) { //need authservice in register component constructor
  return this.http.post(this.baseUrl + 'register', model);
  //return this.http.post(this.baseUrl + 'auth/register', model);
}


}

这是 AuthController.cs

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using DatingApp.API.Data;
using DatingApp.API.Dtos;
using DatingApp.API.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens; //Symmetric Security Keys

namespace DatingApp.API.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
    private readonly IAuthRepository _repo;
    private readonly IConfiguration _config;
    public AuthController(IAuthRepository repo, IConfiguration config)
    {
        _config = config;
        _repo = repo;
    }

    [HttpPost("register")]
    public async Task<IActionResult> Register(UserForRegisterDto userForRegisterDto) //get username and password, [FromBody] gives hint where info is
    {
        userForRegisterDto.Username = userForRegisterDto.Username.ToLower(); //make username lowercase

        if (await _repo.UserExists(userForRegisterDto.Username)) //check if User exist
            return BadRequest("Username already exist"); //BadRequist requires ControllerBase

        var userToCreate = new User
        {
            Username = userForRegisterDto.Username //APIModels
        };

        var createdUser = await _repo.Register(userToCreate, userForRegisterDto.Password);

        return StatusCode(201);
    }

    [HttpPost("login")]
    public async Task<IActionResult> Login(UserForLoginDto userForLoginDto)
    {
        //throw new Exception("Computer says no!");

        var userFromRepo = await _repo.Login(userForLoginDto.Username.ToLower(), userForLoginDto.Password);

        if (userFromRepo == null)
            return Unauthorized();

        var claims = new[]
        {
            new Claim(ClaimTypes.NameIdentifier, userFromRepo.Id.ToString()), //token claims Id
            new Claim(ClaimTypes.Name, userFromRepo.Username) //token claims username
        };

        var key = new SymmetricSecurityKey(Encoding.UTF8
        .GetBytes(_config.GetSection("AppSettings:Token").Value)); //MUST set TOKEN in appsettings.json

        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);

        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(claims),
            Expires = DateTime.Now.AddDays(1),
            SigningCredentials = creds
        };

        var tokenHandler = new JwtSecurityTokenHandler(); //to make token

        var token = tokenHandler.CreateToken(tokenDescriptor);

        return Ok(new {
            token = tokenHandler.WriteToken(token)
        });
    }


}
}

最佳答案

根据您的 Controller 代码,您的 api 路由是 api/auth/register ,所以你只是缺少一个 / 。改为调用http://localhost:5000/api/auth/register你应该有更多的运气。

澄清一下,当你的 Controller 中有这个时:[Route("api/[controller]")]它告诉路由该 Controller 中的每个端点都将以 api/auth 的路由开始。 (换句话说,[controller] 表示 Controller 名称中 Controller 单词之前的部分。

当您使用 [HttpPost("register")] 标记终点方法时它告诉路由引擎您期望收到 POST对附加 /register 的端点的请求到该 Controller 的路线末端。

换句话说api/auth/register将执行public async Task<IActionResult> Register(UserForRegisterDto userForRegisterDto)方法。

如果您检查您的ValuesController您可能会在 Controller 顶部看到相同的属性标签,告诉它使用路线 api/values ,但是当您使用 get 方法时,它可能有一个属性 [HttpGet]这告诉它任何 GET请求api/values应该只执行该方法。无需添加任何路径。

有道理吗?

关于c# - 如何修复 HttpErrorResponse 404 未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56050788/

相关文章:

c# - LINQ 排序 - 前三个需要是不同的制造商

javascript - 如何使用当前的 Form API 将父组件的 FormGroup 传递给其子组件

angular - 如何导入其他模块组件可以识别的一次性全局模块

angular - 如何在 ng serve in angular 后自动让浏览器打开本地主机?

c# - 如何保护在 SignalR 中监听的事件?

AOT的Angular 4动态路由问题

c# - 什么数据结构最好存储数百万数据但占用内存最少

c# - 为高对比度主题重新设计 AvalonDock?

c# - WCF 在运行时更改端点地址

c# - 如何将图像从Unity Android应用程序复制到外部存储?