C# 如何修复未找到的HttpErrorResponse 404

C# 如何修复未找到的HttpErrorResponse 404,c#,angular,C#,Angular,我在web控制台上收到错误消息,它显示“Http失败响应:404未找到”。我试着在网上寻找解决方案,但毫无帮助。如何解决此问题 我试着看看Postman是否和“GET”一起工作,它确实工作了,但在“POST”上它不会更新数据库,也不会得到任何响应 我检查了数据库的更新结果,没有任何更改,我只有2个用户名和密码: 更新:我找到了获取此ip地址的原因: 在baseUrl上,我在auth.service.ts上缺少一个“/”,但是现在我得到了“Http失败响应:400错误请求”。这里是auth

我在web控制台上收到错误消息,它显示“Http失败响应:404未找到”。我试着在网上寻找解决方案,但毫无帮助。如何解决此问题

我试着看看Postman是否和“GET”一起工作,它确实工作了,但在“POST”上它不会更新数据库,也不会得到任何响应

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

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

在baseUrl上,我在auth.service.ts上缺少一个“/”,但是现在我得到了“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)
        });
    }


}
}
使用系统;
使用System.IdentityModel.Tokens.Jwt;
使用System.Security.Claims;
使用系统文本;
使用System.Threading.Tasks;
使用DatingApp.API.Data;
使用DatingApp.API.Dtos;
使用DatingApp.API.Models;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.Extensions.Configuration;
使用Microsoft.IdentityModel.Tokens//对称安全密钥
命名空间DatingApp.API.Controllers
{
[路由(“api/[控制器]”)]
[ApiController]
公共类AuthController:ControllerBase
{
私有只读IAuthRepository\u repo;
专用只读IConfiguration\u config;
公共AuthController(IAuthRepository repo,IConfiguration配置)
{
_config=config;
_回购=回购;
}
[HttpPost(“注册”)]
public async Task Register(UserForRegisterDto UserForRegisterDto)//获取用户名和密码,[FromBody]提示信息的位置
{
userForRegisterDto.Username=userForRegisterDto.Username.ToLower();//使用户名小写
if(wait _repo.UserExists(userForRegisterDto.Username))//检查用户是否存在
返回BadRequest(“用户名已存在”);//BadRequest需要ControllerBase
var userToCreate=新用户
{
Username=userForRegisterDto.Username//APIModels
};
var createdUser=wait _repo.Register(userToCreate,userForRegisterDto.Password);
返回状态码(201);
}
[HttpPost(“登录”)]
公共异步任务登录(UserForLoginTo UserForLoginTo)
{
//抛出新异常(“计算机说不!”);
var userFromRepo=wait _repo.Login(userForLoginDto.Username.ToLower(),userForLoginDto.Password);
if(userFromRepo==null)
未经授权返回();
风险值索赔=新[]
{
新声明(ClaimTypes.NameIdentifier,userFromRepo.Id.ToString()),//令牌声明Id
新声明(ClaimTypes.Name,userFromRepo.Username)//令牌声明用户名
};
var key=new SymmetricSecurityKey(Encoding.UTF8
.GetBytes(_config.GetSection(“AppSettings:Token”).Value));//必须在AppSettings.json中设置Token
var creds=新的签名凭证(key,SecurityAlgorithms.HmacSha512Signature);
var tokenDescriptor=新的SecurityTokenDescriptor
{
主题=新的索赔实体(索赔),
Expires=DateTime.Now.AddDays(1),
签名凭证=信誉
};
var tokenHandler=new JwtSecurityTokenHandler();//生成令牌
var token=tokenHandler.CreateToken(tokenDescriptor);
返回Ok(新的{
token=tokenHandler.WriteToken(令牌)
});
}
}
}

根据控制器代码,您的api路由是
api/auth/register
,因此您缺少一个
/
。将其更改为call
http://localhost:5000/api/auth/register
你应该有更多的运气

为了澄清这一点,当您的控制器中有以下内容时:
[路由(“api/[控制器]”)”)
它告诉路由,该控制器中的每个端点将以
api/auth
路由开始(换句话说
[控制器]
表示
控制器
单词之前的控制器名称部分

然后,当您使用
[HttpPost(“register”)]
标记端点方法时,它告诉路由引擎,您希望在端点上接收
POST
请求,该端点将
/register
附加到该控制器的路由末端

因此,换句话说,
api/auth/register
将执行
公共异步任务寄存器(UserForRegisterDto UserForRegisterDto)
方法

如果您检查
ValuesController
,您可能会在控制器顶部看到相同的属性标记,告诉它使用路由
api/values
,但是当您使用get方法时,它可能有一个属性
[HttpGet]
它告诉它对
api/values
的任何
GET
请求都应该执行该方法。不需要对路径进行任何添加


有意义吗?

显而易见的答案是服务器没有与
api/authregister
您在路由/控制器中为端点配置了什么?我在描述中添加了AuthController.cs,您可以检查。是否要将其更改为:[route(“api/[controller]/”)]?@AlexH我更新了答案,提供了更多关于路由属性标记如何工作的详细信息。我在上文中添加了/,但显然我仍然存在相同的问题。好的,我现在看到了问题,预期的url是。但它没有显示/。那么为什么不在此处添加/呢?我发现了为什么我在描述中添加了错误的url为什么我得到它,但是现在我有一个400错误的错误请求。我应该提出一个新的问题吗?