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

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,两者完全不匹配。解决方式二选一:
    1. 修改PUT路由为[HttpPut],并给ID参数标记[FromQuery],和GET方法保持一致:
      [HttpPut]
      public async Task<m0000au> Put([FromQuery] string ID, [FromBody] m0000au moov)
      
    2. 修改调用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方法的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:35:01