.NET Core+Angular 8部署至IIS后API请求404问题求助
解决IIS部署后Angular调用.NET Core API返回404的问题
嗨,咱们来搞定你把.NET Core+Angular8应用部署到IIS后遇到的API 404问题。我看过你的代码了,这里有一些针对性的修复步骤和排查要点:
一、先说说你基础URL生成逻辑的潜在问题
你的getServiceBaseApiUrl()方法在生产环境下是截取location.pathname的第一段作为API基础路径,但这里有两个容易踩坑的地方:
- 你只返回了路径片段(比如
supplier),没有拼接完整的协议和域名,这样请求会变成相对路径,如果Angular和API的部署路径不匹配,就会导致路由错误 - 你默认假设API和Angular部署在同一个子应用路径下,但如果API是单独部署的IIS站点,这个逻辑就完全不适用了
二、具体的修复和排查步骤
1. 修正基础URL生成逻辑
把你的getServiceBaseApiUrl()改成下面这样,确保生成完整的绝对路径:
getServiceBaseApiUrl(): string { if (environment.webApiEndPoint != 'dev') { // 生产环境:拼接当前站点的域名+子应用路径 let paths: string[] = location.pathname.split('/').splice(1, 1); let basePath: string = (paths && paths[0]) || 'supplier';//Default:supplier this.hostName = basePath; // 加上window.location.origin保证是完整的绝对路径 this.serviceBaseUrl = `${window.location.origin}/${this.hostName}`; return this.serviceBaseUrl; } else { this.serviceBaseUrl = "https://localhost:44381"; return this.serviceBaseUrl; } }
2. 检查IIS上API的部署配置
这是最容易出问题的环节,一定要仔细核对:
- 应用程序池设置:确保API所在的IIS站点/子应用的应用程序池,托管管道模式是无托管代码,并且.NET CLR版本选无(因为.NET Core是跨平台的,不需要传统的IIS托管)
- web.config正确性:检查API的
web.config里的aspNetCore节点配置是否正确,比如:
<aspNetCore processPath="dotnet" arguments=".\YourApi.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
开启日志能帮你排查API启动失败的问题
- 直接测试API可用性:在服务器上用浏览器直接访问API的接口(比如
http://你的服务器地址/supplier/api/你的接口名),如果直接访问也返回404,那问题出在API本身的部署或路由配置上,和前端无关
3. 核对Angular打包的base-href设置
如果Angular部署在IIS的子应用(比如http://你的服务器/supplier),打包时必须指定base-href参数,否则路由会出错:
ng build --prod --base-href /supplier/
4. 检查API的路由前缀
看看你的.NET Core API控制器的路由配置,比如如果控制器上有[Route("api/[controller]")]这样的特性,那前端请求的完整路径应该是http://你的服务器/supplier/api/xxx,而不是只到/supplier。如果你的API没有加api前缀,那要确保前端请求路径和API的路由完全匹配。
5. CORS配置检查(如果API和前端是不同站点)
如果Angular和API部署在不同的IIS站点(不同域名/端口),一定要在.NET Core API里配置允许前端域名访问的CORS策略:
在Program.cs(.NET 6及以上版本)中添加:
builder.Services.AddCors(options => { options.AddPolicy("AllowFrontend", policy => { policy.WithOrigins("http://你的前端域名") .AllowAnyHeader() .AllowAnyMethod(); }); }); // 记得在中间件中启用CORS(要放在UseRouting之后,UseAuthorization之前) app.UseCors("AllowFrontend");
三、实用调试技巧
- 打开浏览器开发者工具(F12)的Network标签,查看失败的API请求的完整URL,看看是不是和API的实际地址不匹配
- 查看IIS的日志文件(通常在
C:\inetpub\logs\LogFiles目录下),里面会记录404请求的详细信息,能帮你快速定位问题
内容的提问来源于stack exchange,提问作者draveena




