You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:42:52