You need to enable JavaScript to run this app. .NET 5 Web API部署IIS后访问404,路由不生效导致控制器代码不执行
优惠活动
大模型
产品
解决方案
定价
更多

.NET 5 Web API部署IIS后访问404,路由不生效导致控制器代码不执行

.NET 5 Web API 部署到IIS后接口404、控制器逻辑不执行的排查与修复

你当前遇到的404问题完全来自路由匹配错位,和控制器业务逻辑、单元测试结果没有关联,具体成因和修复步骤如下:

核心问题溯源

  • 路由模板与实际请求路径不匹配,是导致404的最直接原因
    按照你现有代码的路由定义,框架能识别的完整匹配路径是:SicrestWeb/Sync/GS/{table_name}/{json_data}/{key}。对照你的实际请求路径sicrestweb/sync/gs/usuarios,路径段仅到usuarios就结束了,框架要求必须把json_data作为第四段路径值才能匹配,但你把json_data放在了查询字符串(?json_data=xxx)里,路由找不到对应的第四段路径参数,自然直接返回404,根本不会进入控制器执行逻辑。
  • 路由模板的参数语法不符合.NET 5的路由规范
    你写的{key=''}这种内联默认值是旧版ASP.NET MVC的遗留写法,.NET Core的路由引擎根本不识别这种语法,会直接把key=作为固定字面量路径要求,也就是必须请求路径里出现key=的字符串才会匹配,进一步提高了匹配门槛。
  • 带特殊字符的连接字符串类内容不适合作为路径段传输
    你传输的json_data里包含大括号、双引号、数据库连接串片段,URL编码后长度很高,就算路由模板调整到位,也容易被IIS的请求过滤模块拦截,直接返回404。

具体修复操作

  1. 调整路由定义,移除不需要从路径获取的参数
    把控制器方法上的路由改成符合实际请求的模板,将json_data从路由参数中移除,借助[ApiController]的自动模型绑定能力从查询字符串读取值:
    [HttpGet]
    [Route("GS/{table_name}/{key?}")]
    [Route("GSI/{table_name}/{key?}")]
    public ActionResult Select(String table_name, String json_data, String key="") 
    {
        // 业务逻辑无需改动,json_data 会自动从查询字符串绑定
    }
    
    修改后框架可匹配的路径为sicrestweb/sync/gs/usuarios,和你实际请求的路径完全一致,key使用{key?}标记为可选参数,替代原来错误的{key=''}写法。
  2. 校验IIS托管的基础配置
    • 确认应用程序池设置为无托管代码:.NET 5的Web应用是自包含运行的,不依赖IIS内置的.NET CLR管道,配置为托管代码模式会导致请求直接被IIS原生管道拦截,根本不会进入应用的处理逻辑
    • 确认部署路径是否错位:如果你的应用是部署在IIS下的sicrestweb虚拟目录下,那么请求的默认路径根已经是https://localhost:44342/sicrestweb/,控制器上再写[Route("SicrestWeb/[controller]")]就会导致路径多拼接一层sicrestweb,需要把控制器路由调整为[Route("[controller]")],让最终匹配路径回到正确的层级。
  3. 临时开启路由诊断定位匹配偏差
    开发环境下临时添加路由调试接口,直接输出框架实际识别到的所有路由模板,避免靠猜测排查问题:
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // 原有配置保持不变
        app.UseEndpoints(endpoints =>  { 
            endpoints.MapControllers();
            if (env.IsDevelopment())
            {
                endpoints.MapGet("/debug/routes", async context =>
                {
                    var endpointDataSource = app.ApplicationServices.GetRequiredService<EndpointDataSource>();
                    await context.Response.WriteAsJsonAsync(endpointDataSource.Endpoints.Select(e => e.RoutePattern.RawText));
                });
            }
        });
    }
    
    启动应用后访问/debug/routes,就能看到框架实际生效的所有路由规则,和你预期的请求路径逐段比对,可快速定位错位点。

注:修复完成后可以先在本地IIS Express下调试,给控制器方法第一行打上断点,确认能命中后再部署到正式IIS站点,避免重复排查。


内容的提问来源于stack exchange,提问作者Luis Tenorio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 11:57:01