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

ASP.NET Core MVC调用Web API时出现404方法未找到错误求助

解决ASP.NET Core MVC调用Web API返回404的问题

问题根源

你的404错误是因为请求URL与API的路由规则不匹配,具体分析如下:

API路由定义

你的API方法使用[HttpGet("ParticipantID")],这意味着:

  • 假设你的API控制器带有[Route("api/[controller]")]前缀(ASP.NET Core Web API默认模板通常会添加该前缀),那么该接口的完整可访问路径是:
    GET https://localhost:7194/api/participant/ParticipantID?ParticipantID=xxx
    
    这里的ParticipantID是通过查询参数传递,而非URL路径的一部分。

调用方的请求URL

而你在MVC中拼接的请求URL是:

url = url + "participant/";
// 最终请求URL为 https://localhost:7194/participant/xxx
HttpResponseMessage response = client.GetAsync(url + ParticipantID).Result;

这个URL既缺少API控制器的api/前缀(如果控制器有该配置),也没有匹配API定义的ParticipantID路径段,因此服务器找不到对应的接口方法,返回404。

解决方案(二选一即可)

方案1:修改API路由,让参数成为URL路径的一部分

将API方法的路由特性调整为支持路径参数的形式,更符合REST风格:

// 简洁版:直接用参数作为路径段
[HttpGet("{ParticipantID}")]
public async Task<ActionResult<Participant>> GetParticipantsByParticipantID(long ParticipantID)
{
    var participant_id = await context.Participants.FindAsync(ParticipantID);

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

    return Ok(participant_id);
}

同时调整MVC中的URL拼接逻辑:

url = configuration.GetValue<string>("apiurl:baseurl") + "api/participant/";
HttpResponseMessage response = await client.GetAsync(url + ParticipantID);

如果希望保留ParticipantID路径标识,也可以这样定义API路由:

[HttpGet("ParticipantID/{ParticipantID}")]
public async Task<ActionResult<Participant>> GetParticipantsByParticipantID(long ParticipantID)
{
    // 原有逻辑不变
}

对应的MVC URL拼接改为:

url = configuration.GetValue<string>("apiurl:baseurl") + "api/participant/ParticipantID/";
HttpResponseMessage response = await client.GetAsync(url + ParticipantID);

方案2:修改MVC调用的URL,匹配现有API路由

保持API代码不变,调整MVC中的URL拼接,使其符合API当前的路由规则:

url = configuration.GetValue<string>("apiurl:baseurl") + "api/participant/ParticipantID";
// 通过查询参数传递ParticipantID
HttpResponseMessage response = await client.GetAsync($"{url}?ParticipantID={ParticipantID}");

额外优化建议

  1. 避免同步调用异步方法:使用.Result可能导致线程死锁,建议将MVC的Edit方法改为异步模式:
[HttpGet]
public async Task<IActionResult> Edit(long ParticipantID)
{
    url = configuration.GetValue<string>("apiurl:baseurl") + "api/participant/";
    Participants participant = new Participants();

    HttpResponseMessage response = await client.GetAsync(url + ParticipantID);

    if (response.IsSuccessStatusCode)
    {
        string result = await response.Content.ReadAsStringAsync();
        var data = JsonConvert.DeserializeObject<Participants>(result);
        if (data != null)
        {
            participant = data;
        }
    }

    return View(participant); // 记得将模型传递给视图
}
  1. 确认API控制器的路由前缀:检查你的API控制器是否带有[Route("api/[controller]")]特性,如果没有,需要去掉拼接URL中的api/部分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:45:24