API本地正常,发布后调用UpdateSOSNumber接口报404错误求助
问题分析与解决:API发布后UpdateSOSNumber接口返回404
本地用模拟器测试UpdateSOSNumber接口功能正常,但发布后调用(登录用户ID和传入号码与本地一致)却收到404未找到错误,以下是可能的原因及解决办法:
可能的原因及解决方案
1. 路由前缀不匹配
发布后的API路由前缀可能与本地配置不一致,比如本地控制器上配置了[Route("api/v1/[controller]")],但发布后部署环境的路由前缀被修改,或者客户端请求的URL前缀与实际API路由不匹配。
解决办法:
- 确认API控制器的路由属性,确保控制器类上有正确的路由前缀,比如:
[Route("api/v1/[controller]")] [ApiController] public class UsersController : ControllerBase { // ... 你的方法 } - 核对客户端请求的
AppSettings.UrlApi是否与发布后的API根地址完全一致,包括是否包含api/v1等前缀。
2. URL参数未编码导致路由解析失败
如果numbers参数包含逗号、空格、特殊符号等,直接拼接在URL路径中会导致路由无法正确解析,本地测试可能用的是无特殊字符的号码,所以未暴露问题。
解决办法:
客户端拼接URL时,对numbers参数进行URL编码:
private async Task UpdateSOSNumber(string numbers) { int loginUserId = Convert.ToInt32(await SecureStorage.Default.GetAsync(AppSettings.UserId)); var encodedNumbers = Uri.EscapeDataString(numbers); // 编码特殊字符 using (var httpClient = new HttpClient()) { httpClient.BaseAddress = new Uri(AppSettings.UrlApi); var requestUri = $"api/v1/Users/UpdateSOSNumber/{loginUserId}/{encodedNumbers}"; var response = await httpClient.PutAsync(requestUri, null); } }
3. 部署环境禁用PUT请求
部分服务器(如IIS)可能默认禁用PUT等HTTP方法,导致请求被拦截返回404。
解决办法:
- 如果是IIS部署,检查Web.config中的配置,确保ASP.NET Core模块允许所有HTTP方法:
<system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <!-- 其他配置 --> </system.webServer> - 云服务部署(如Azure App Service)则检查平台配置中的HTTP方法允许列表,确保PUT被启用。
4. 部署环境的路由配置问题
比如IIS的URL重写规则、反向代理配置等可能导致请求路由到错误的地址,或者API的路由中间件配置在发布环境中未正确加载。
解决办法:
- 检查API的Program.cs(或Startup.cs)中是否正确配置了路由中间件:
app.UseRouting(); app.UseAuthorization(); app.MapControllers(); // 确保启用控制器路由 - 查看部署环境的日志,确认请求的完整URL是否到达API服务器,以及路由匹配的情况。
相关代码
API控制器方法
[HttpPut("UpdateSOSNumber/{userId}/{numbers}")] public async Task<IActionResult> UpdateSOSNumber(int userId, string numbers) { UsersEntity user = await _usersRepository.FindByIdAsync(userId); if (user != null) { user.SOSNumber += (string.IsNullOrEmpty(user.SOSNumber) ? "" : ",") + numbers; await _usersRepository.UpdateAsync(user); await _usersRepository.SaveAsync(); return Ok("SOS numbers updated successfully"); } else return NotFound("User not found"); }
客户端调用方法
private async Task UpdateSOSNumber(string numbers) { int loginUserId = Convert.ToInt32(await SecureStorage.Default.GetAsync(AppSettings.UserId)); using (var httpClient = new HttpClient()) { httpClient.BaseAddress = new Uri(AppSettings.UrlApi); var requestUri = $"api/v1/Users/UpdateSOSNumber/{loginUserId}/{numbers}"; var response = await httpClient.PutAsync(requestUri, null); } }
内容的提问来源于stack exchange,提问作者Chris Curt
相关产品推荐
相关产品推荐

