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=xxxParticipantID是通过查询参数传递,而非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}");
额外优化建议
- 避免同步调用异步方法:使用
.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); // 记得将模型传递给视图 }
- 确认API控制器的路由前缀:检查你的API控制器是否带有
[Route("api/[controller]")]特性,如果没有,需要去掉拼接URL中的api/部分。
内容的提问来源于stack exchange,提问作者Mirza Fariad
相关产品推荐
相关产品推荐

