You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

通过ASP.NET Core SPA代理无法在API域名下提供Vue.js服务求助

解决方案:ASP.NET Core + Vue 开发环境同一端口部署

问题根源

你遇到的跳转问题是因为启用了Microsoft.AspNetCore.SpaProxy组件,它会自动将请求重定向到Vite开发服务器端口。要实现同一端口提供客户端和API服务,需要移除SpaProxy,改用反向代理让ASP.NET Core直接转发客户端请求到Vite,同时保留Swagger和API路由。


步骤1:移除SpaProxy配置

打开服务端项目的launchSettings.json,删除以下环境变量配置:

"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy"

步骤2:安装反向代理依赖

在服务端项目中安装NuGet包Yarp.ReverseProxy(ASP.NET Core官方推荐的反向代理工具):

Install-Package Microsoft.AspNetCore.Yarp.ReverseProxy

步骤3:配置服务端代理及路由

修改Program.cs,调整中间件顺序,确保Swagger、API优先处理,剩余请求转发到Vite:

var builder = WebApplication.CreateBuilder(args);

// 注册Swagger服务
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// 注册反向代理服务
builder.Services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));

// 注册Controllers服务
builder.Services.AddControllers();

var app = builder.Build();

// 开发环境启用Swagger
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();

// 优先处理API路由
app.MapControllers();

// 开发环境:代理非API/非Swagger请求到Vite服务器
if (app.Environment.IsDevelopment())
{
    app.MapReverseProxy();
}
else
{
    // 生产环境:使用打包后的静态文件
    app.UseDefaultFiles();
    app.UseStaticFiles();
    app.MapFallbackToFile("/index.html");
}

app.Run();

appsettings.Development.json中添加反向代理规则,过滤掉API和Swagger相关请求:

"ReverseProxy": {
  "Routes": {
    "spaRoute": {
      "ClusterId": "spaCluster",
      "Match": {
        "Path": "{**catch-all}",
        "Hosts": ["localhost:7052"]
      },
      "Filters": [
        {
          "Name": "RouteCondition",
          "Arguments": {
            "Condition": "!Path.StartsWith(\"/api\") && !Path.StartsWith(\"/swagger\") && !Path.StartsWith(\"/swagger-ui\")"
          }
        }
      ]
    }
  },
  "Clusters": {
    "spaCluster": {
      "Destinations": {
        "spaDestination": {
          "Address": "https://localhost:53223"
        }
      }
    }
  }
}

步骤4:调整Vite配置

修改客户端vite.config.js,将API代理目标改为服务端端口,同时设置Origin确保资源路径正确:

server: {
    proxy: {
        "/api": {
            target: "https://localhost:7052", // 改为服务端监听端口
            secure: false,
            changeOrigin: true // 确保请求头Host正确
        },
    },
    port: 53223,
    https: {
        key: fs.readFileSync(keyFilePath),
        cert: fs.readFileSync(certFilePath),
    },
    origin: "https://localhost:7052" // 让Vite生成的资源路径指向服务端地址
},

步骤5:启动服务

  1. 先启动Vite开发服务器:npm run dev
  2. 再启动ASP.NET Core服务

现在访问https://localhost:7052会直接加载Vue应用,https://localhost:7052/swagger正常提供API文档,所有请求都在同一端口下,HttpOnly Cookie可以直接在浏览器控制台的Application标签中查看。


内容的提问来源于stack exchange,提问作者Daniele Tentoni

火山引擎 最新活动