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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:23:27