You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.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

火山引擎 最新活动