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

Postman调用ASP.NET Core Web API POST接口报404 Not Found

问题:POST请求返回404 Not Found

我在Postman中发送POST请求到https://localhost:7252/api/Asset/Create时收到404 Not Found错误,请求体数据如下:

{
    "AssetId":45,
    "Name":"none",
    "Shortname":"n",
    "Description":"not described yet",
    "Unit":"2",
    "CatID":1
}

错误截图:
404ErrorPostman

我使用ASP.NET Core开发Web API,以下是相关代码:

AssetController代码

using Microsoft.AspNetCore.Mvc;
using Internship.DAL.Repositories;
using Internship.Models;
using Internship.DAL;
using Microsoft.AspNetCore.Authorization;

namespace Internship.Controllers
{
    [Authorize(Roles = "Admin")]
    public class AssetController: Controller
    {
        private readonly AssetRepository _assetRepository;
        
        // Constructor to initialize the repository
        public AssetController()
        {
            _assetRepository = new AssetRepository();
        }

        // Action to display all asset details
        [HttpGet("")]
        [HttpGet("Index")]
        public IActionResult Index()
        {
            List<Asset> assets = _assetRepository.GetAllAssets();
            return Ok(assets);
        }

        // Other actions like Create, Edit, Delete can be added here
        // GET: Asset/Create
        [HttpGet("Create")]
        public IActionResult Create()
        {
            return Ok();
        }

        // POST: Asset/Create
        [HttpPost("Create")]
        //[ValidateAntiForgeryToken] not required for API only for MVC
        public IActionResult Create(Asset asset)
        {
            if (ModelState.IsValid)
            {
                _assetRepository.CreateAsset(asset);
                return RedirectToAction(nameof(Index)); // Redirect to the list after creation
            }

            return Ok(asset); // Return to the form with validation errors if any
        }

        [HttpGet("Details/{AssetId}")]
        public IActionResult Details(int AssetId)
        {
            // Get the asset by AssetId from the repository
            Asset asset = _assetRepository.GetAssetById(AssetId);

            if (asset == null)
            {
                return NotFound($"No asset category found with CatID {AssetId}");
            }

            return Ok(asset);
        }

        // GET: Asset/Delete/5
        [HttpGet("Delete/{AssetId}")]
        public IActionResult Delete(int AssetId)
        {
            Asset asset = _assetRepository.GetAssetById(AssetId);

            if (asset == null)
            {
                return NotFound($"No asset found with AssetId {AssetId}");
            }

            return View(asset); // Shows confirmation page
        }

        // POST: Asset/Delete/5
        //[HttpPost, ActionName("Delete")]
        //[ValidateAntiForgeryToken]
        [HttpDelete("Delete/{AssetId}")]
        public IActionResult DeleteConfirmed(int AssetId)
        {
            _assetRepository.DeleteAsset(AssetId);
            return RedirectToAction(nameof(Index));
        }

        [HttpGet("Edit/{AssetId}")]
        public IActionResult Edit(int AssetId)
        {
            var asset = _assetRepository.GetAssetById(AssetId);

            if (asset == null)
            {
                return NotFound();
            }

            return View(asset);
        }

        //[HttpPost]
        //[ValidateAntiForgeryToken]
        [HttpPut("Edit/{AssetId}")]
        public IActionResult Edit(Asset asset)
        {
            if (ModelState.IsValid)
            {
                _assetRepository.UpdateAsset(asset);
                return RedirectToAction(nameof(Index));
            }

            return View(asset);
        }
    }
}

Asset模型类代码

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Internship.Models
{
    public class Asset
    {
        [Key]
        public int AssetId { get; set; }
        [Required]
        [StringLength(100)]
        public string Name { get; set; }

        [Required]
        [StringLength(50)]
        public string ShortName {  get; set; }

        [StringLength(255)]
        public string Description { get; set; }

        [StringLength(50)]
        public string Unit { get; set; }

        [ForeignKey("AssetCategory")]
        public int CatID { get; set; }
    }
}

问题原因及解决办法

1. 路由前缀缺失

控制器未添加[Route("api/[controller]")]特性,导致请求URL中的/api/部分无法匹配到控制器。

解决:在AssetController类上添加路由前缀:

[Authorize(Roles = "Admin")]
[Route("api/[controller]")] // 添加此行
public class AssetController: Controller
{
    // ... 现有代码
}

2. 请求体属性名不匹配

模型中属性为ShortName(首字母大写N),但请求体中写的是Shortname(小写n),会导致模型绑定失败,虽不是404直接原因,但需修正:

修正请求体:

{
    "AssetId":45,
    "Name":"none",
    "ShortName":"n", // 改为ShortName
    "Description":"not described yet",
    "Unit":"2",
    "CatID":1
}

3. API控制器基类错误

Controller是为MVC视图设计的,Web API应继承ControllerBase,避免不必要的视图相关功能:

修改控制器基类:

public class AssetController: ControllerBase // 替换Controller为ControllerBase
{
    // ... 现有代码
}

4. 重定向操作不符合API规范

API中使用RedirectToAction会返回302重定向,不符合RESTful API设计,应返回资源信息:

修改POST Create方法的返回逻辑:

[HttpPost("Create")]
public IActionResult Create(Asset asset)
{
    if (ModelState.IsValid)
    {
        _assetRepository.CreateAsset(asset);
        return CreatedAtAction(nameof(Details), new { AssetId = asset.AssetId }, asset); // 返回创建后的资源信息
    }

    return BadRequest(ModelState); // 返回验证错误详情
}

内容的提问来源于stack exchange,提问作者bibashmanjusubedi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:08:18