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 }
错误截图:
我使用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
相关产品推荐
相关产品推荐

