Blazor WASM中PutAsJsonAsync报404但GetFromJsonAsync正常问题求助
Blazor WASM PUT请求404错误排查
我在开发Blazor WASM应用时,调用同一控制器的PutAsJsonAsync接口始终返回404,但同一页面的GetFromJsonAsync调用正常。已经排查过语法和配置,参考了大量示例仍未解决。
控制器代码
using moovpad.Shared; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.AspNetCore.Mvc; namespace moovpad.Server.Controllers { [ApiController] [Route("api/[controller]")] public class m0000auController : ControllerBase { private readonly mpauDbContext db; public string ID; public m0000auController(mpauDbContext db) { this.db = db; } [HttpPut("ID")] public async Task<m0000au> Put(string ID, [FromBody] m0000au moov) { var edit = await db.m0000au.FindAsync(ID); if (edit != null) { edit.uID = moov.uID; edit.moovID01 = moov.moovID01; edit.moovID01 = moov.moovID02; edit.moovID01 = moov.moovID03; edit.moovID01 = moov.moovID04; edit.moovID01 = moov.moovID05; edit.moovID01 = moov.moovID06; edit.moovID01 = moov.moovID07; edit.moovID01 = moov.moovID08; edit.moovID01 = moov.moovID09; edit.moovID01 = moov.moovID10; await db.SaveChangesAsync(); } return edit; } [HttpDelete("id")] public async Task<m0000au> Delete(string id) { var delete = await db.m0000au.FindAsync(id); if (delete != null) { db.m0000au.Remove(delete); await db.SaveChangesAsync(); } return delete; } [HttpPost] public async Task<m0000au> Post([FromBody] m0000au create) { create.uID = ID; EntityEntry<m0000au> moov = await db.m0000au.AddAsync(create); await db.SaveChangesAsync(); return moov.Entity; } [HttpGet] public async Task<m0000au> Get(string ID) { return await Task.Factory.StartNew<m0000au>(() => { if (string.IsNullOrEmpty(ID)) return null; else return db.m0000au.Find(ID); }); } [HttpGet("id")] public async Task<m0000au> Get(Guid id) { return await db.m0000au.FindAsync(id); } } }
Blazor页面调用代码
public async Task Save() { var stg1MoovWrite = false; //var stg2MoovWrite = false; //var stg3MoovWrite = false; //HTTP REQUEST FOR CURRENTLY STORED EXERCISES/MOOVs var storedMoovIDs = new m0000au(); storedMoovIDs = await Http.GetFromJsonAsync<m0000au>($"api/m0000au?ID={Uri.EscapeDataString(sesn.usr.uID)}"); //HTTP PUT DATA - since already have a row in the table with the user's ID as the key if (storedMoovIDs != null) { for (i = 0; i < 10; i++) { if (!stg1MoovWrite) { switch (i) { case 0: if (storedMoovIDs.moovID01 == "n") { // *** TEST CASE WAS PUT INTO THIS LOOP BUT REMOVED FOR POSTING storedMoovIDs.moovID01 = sesn.moov.moovID; var response = await Http.PutAsJsonAsync<m0000au>($"api/m0000au?ID={Uri.EscapeDataString(sesn.usr.uID)}", storedMoovIDs); if (response.IsSuccessStatusCode) stg1MoovWrite = true; } break; } } } } }
排查建议
- 路由匹配不兼容:控制器PUT方法的路由是
[HttpPut("ID")],对应路径为api/m0000au/ID,但你的调用是通过Query参数传ID:api/m0000au?ID=xxx,两者完全不匹配。解决方式二选一:- 修改PUT路由为
[HttpPut],并给ID参数标记[FromQuery],和GET方法保持一致:[HttpPut] public async Task<m0000au> Put([FromQuery] string ID, [FromBody] m0000au moov) - 修改调用URL为路由参数格式,同时调整控制器路由:
// 控制器代码 [HttpPut("{ID}")] public async Task<m0000au> Put([FromRoute] string ID, [FromBody] m0000au moov) // Blazor调用代码 var response = await Http.PutAsJsonAsync<m0000au>($"api/m0000au/{Uri.EscapeDataString(sesn.usr.uID)}", storedMoovIDs);
- 修改PUT路由为
- 参数绑定缺失:当前PUT方法的ID参数未指定绑定源,ASP.NET Core默认会从路由绑定,但你传的是Query参数,导致参数无法匹配,最终路由匹配失败返回404。必须明确标记
[FromQuery]或[FromRoute]。 - 修复数据更新错误:PUT方法里存在重复赋值问题,
moovID02到moovID10都被错误赋值给edit.moovID01,需修正为对应属性:edit.moovID01 = moov.moovID01; edit.moovID02 = moov.moovID02; edit.moovID03 = moov.moovID03; // ... 后续依次对应正确属性 - 直接测试接口:用Postman或浏览器直接发送PUT请求测试,比如
PUT https://localhost:xxxx/api/m0000au?ID=xxx(对应方案1),确认服务器端是否能响应,排除Blazor客户端代码的问题。 - 查看服务器日志:启用ASP.NET Core的请求日志,查看PUT请求的具体路径、参数,确认是否和控制器路由规则匹配。
内容的提问来源于stack exchange,提问作者Ehsan
相关产品推荐
相关产品推荐

