ASP.NET中调用AddLike接口点赞产品返回404 Not Found求助
问题描述
实现用户点赞产品并加入点赞列表功能(支持用户多赞、产品多被赞),调用LikeController的AddLike接口(POST请求地址:https://localhost:6001/api/like/{productId})时返回404 Not Found,但数据库中存在对应ID的产品,且JWT授权已正确配置。
相关代码如下:
// 产品与用户实体 public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } [ForeignKey("UserId")] public User User { get; set; } public int UserId { get; set; } } public class User { public int Id { get; set; } public string UserName { get; set; } public byte[] PasswordHash { get; set; } public byte[] PasswordSalt { get; set; } public List<Product> Products { get; set; } public List<Product> LikedProducts { get; set; } = new List<Product>(); } // 控制器中的接口 [HttpPost("{productId}")] public async Task<ActionResult> AddLike(int productId) { var currentUserId = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier)?.Value); var product = await _productRepository.GetProductById(id); var userWhoAddedProduct = await _userRepository.GetUser(product.UserId); if (currentUserId == userWhoAddedProduct.Id) { return BadRequest("You cannot like your own product."); } userWhoAddedProduct.LikedProducts.Add(product); await _context.SaveChangesAsync(); return Ok(); } // 数据库上下文 public class StoreContext : DbContext { public StoreContext(DbContextOptions<StoreContext> options) : base(options) { } public DbSet<Product> Products { get; set; } public DbSet<ProductBrand> ProductBrands { get; set; } public DbSet<ProductType> ProductTypes { get; set; } public DbSet<User> Users { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); if(Database.ProviderName == "Microsoft.EntityFrameworkCore.Sqlite") { foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { var properties = entityType.ClrType.GetProperties().Where(p => p.PropertyType == typeof(decimal)); foreach (var property in properties) { modelBuilder.Entity(entityType.Name).Property(property.Name).HasConversion<double>(); } } } modelBuilder.Entity<Product>() .HasOne<User>(p => p.User) .WithMany(u => u.Products) .HasForeignKey(p => p.UserId); } }
排查建议
- 检查控制器路由特性:确认LikeController类顶部是否添加了
[Route("api/[controller]")]和[ApiController]特性,没有的话路由无法匹配。示例:[Route("api/[controller]")] [ApiController] public class LikeController : ControllerBase { // 接口代码 } - 验证请求URL的合法性:确保请求中的
{productId}是有效整数,避免传入非数字值导致路由解析失败;同时确认项目运行的端口确实是6001,查看启动日志中的服务地址是否和请求地址一致。 - 排查路由冲突:检查其他控制器是否存在相同的路由模板(如
api/like/{id}),导致路由匹配优先级异常。可以给AddLike接口指定更明确的路由,比如改为[HttpPost("add/{productId}")],然后用https://localhost:6001/api/like/add/{productId}测试。 - 检查中间件影响:确认是否有URL重写、路由相关的中间件修改了请求路径,导致接口无法被正确匹配。
- 修复接口代码中的参数错误:接口里的
GetProductById(id)中的id未定义,应该替换为方法参数productId,这会导致后续运行时错误,需提前修复。 - 完善实体关系配置:当前User与Product的点赞多对多关系未配置,EF Core无法正确生成中间表。需在StoreContext的OnModelCreating中添加:
modelBuilder.Entity<User>() .HasMany(u => u.LikedProducts) .WithMany() .UsingEntity(j => j.ToTable("UserLikedProducts"));
内容的提问来源于stack exchange,提问作者szymix1322
相关产品推荐
相关产品推荐

