部署至Azure的Azure Functions返回404 Not Found错误求助
检查访问路径的正确性
本地测试的路由cities/{idCity:int}在Azure部署后,默认需要加上函数应用的域名前缀和/api路由前缀,完整访问路径应为https://<你的函数应用名>.azurewebsites.net/api/cities/1。不要手动拼接路径,直接在Azure门户的函数详情页点击「获取函数URL」复制完整地址测试。若你在host.json中修改了默认路由前缀(比如移除/api),需对应调整访问路径。确认函数的启用状态与触发器注册
登录Azure门户进入函数应用,检查FindCityById函数的状态为「已启用」,且触发器类型显示为HTTP触发器。查看「监控」日志:如果日志中无请求记录,说明请求未到达函数,大概率是路径错误;如果有请求记录但返回404,继续排查后续点。修正DbContext的实例化方式
你当前在构造函数中手动new AppDbContext()的方式存在问题:Azure环境下可能因配置加载失败导致DbContext初始化异常,进而函数无法正常启动,表现为404。正确做法是通过依赖注入管理DbContext和CityService:public class CityFunction { private readonly CityService _cityService; // 构造函数注入依赖 public CityFunction(CityService cityService) { _cityService = cityService; } private JsonSerializerOptions GetJsonSerializerOptions() { return new JsonSerializerOptions { WriteIndented = true, ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles, }; } [FunctionName("FindCityById")] public async Task<IActionResult> FindCityById( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "cities/{idCity:int}")] HttpRequest req, int idCity, ILogger log ) { var city = await _cityService.FindCityById(idCity); var jsonSerializerOptions = GetJsonSerializerOptions(); var jsonResponse = JsonSerializer.Serialize(city, jsonSerializerOptions); return city != null ? new ContentResult { Content = jsonResponse, ContentType = "application/json", StatusCode = 200, } : new NotFoundResult(); } }同时在启动类中注册服务(以.NET 6+的Program.cs为例):
var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureServices(services => { // 注册DbContext,从环境变量读取连接字符串 services.AddDbContext<AppDbContext>(options => options.UseNpgsql(Environment.GetEnvironmentVariable("PostgresConnection"))); // 注册CityService services.AddScoped<CityService>(); }) .Build(); host.Run();验证连接字符串配置
在Azure门户的函数应用「配置」中,确认已添加PostgreSQL的连接字符串,名称与DbContext中使用的一致。本地测试可能依赖appsettings.json,但Azure环境下需通过门户配置环境变量或连接字符串,否则DbContext无法正确连接数据库,导致函数启动失败。检查运行时版本与部署完整性
确认本地开发使用的.NET版本与Azure函数应用配置的运行时版本完全一致(如.NET 6或.NET 7)。同时检查部署过程,确保所有必要文件(如依赖项、配置文件)已正确部署,可通过「高级工具(Kudu)」查看部署文件是否完整。
内容的提问来源于stack exchange,提问作者enzo gabriel

