.NET Core 3.1 Web API部署IIS后指定接口返回404问题咨询
问题成因
- 端点配置缺失属性路由映射:你当前
Startup.cs的UseEndpoints方法仅配置了传统MVC路由规则,没有添加MapControllers()方法启用API属性路由匹配。本地运行在Kestrel调试模式下会默认兼容属性路由,生产环境IIS托管模式下会严格按照配置加载路由规则,导致带参数的多段属性路由无法匹配。 - 中间件顺序错误:
UseCors中间件放在了UseAuthorization之后,不符合ASP.NET Core中间件执行顺序要求,部分请求会被授权拦截提前返回404。 - IIS托管配置异常:生产环境未安装对应版本的ASP.NET Core 3.1托管捆绑包,或站点
web.config中AspNetCoreModuleV2处理程序配置错误,导致带路径参数的请求无法正确转发到Kestrel处理。 - 参数匹配失败:
Config方法的参数是Guid类型,如果请求传入的{id}不符合GUID格式,模型绑定失败会直接返回404,无法匹配到对应Action。
解决方案
1. 修正端点路由配置
修改Startup.cs的UseEndpoints代码,添加属性路由支持:
app.UseEndpoints(endpoints => { endpoints.MapControllers(); // 新增此行,启用API属性路由匹配 endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
2. 调整中间件执行顺序
将UseCors移到UseRouting之后、身份认证中间件之前,符合官方推荐顺序:
app.UseRouting(); app.UseCors("CorsPolicy"); // 移到此处 app.UseAuthentication(); app.UseAuthorization();
3. 优化路由配置(可选,避免路由冲突)
简化WidgetController中Config方法的路由配置,控制器上已经定义了api/[controller]前缀,无需在Action路由中重复定义:
[HttpGet("config/{id:guid}")] // 新增guid类型约束,非法参数会返回400方便排查 public ActionResult Config(Guid id) { return Ok(service.GetWidgetConfig(id)); }
4. 检查IIS托管配置
- 确认生产环境已安装ASP.NET Core 3.1 托管捆绑包,安装完成后重启IIS服务生效
- 检查站点根目录下的
web.config配置,确保处理程序配置正确,参考配置如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\你的项目名称.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" /> </system.webServer> </location> </configuration>
5. 错误排查(可选)
如果修改后仍然存在问题,可临时将web.config中的stdoutLogEnabled设置为true,创建logs目录,查看运行日志定位具体错误。
内容的提问来源于stack exchange,提问作者Mark Seymour
相关产品推荐
相关产品推荐

