使用ASP.NET Core和Vue.js前后端分离开发企业级应用插图

使用ASP.NET Core和Vue.js前后端分离开发企业级应用:从零搭建现代化项目架构

作为一名在.NET生态里摸爬滚打多年的开发者,我见证了从WebForms到MVC,再到如今前后端彻底分离的演变。在开发企业级应用时,清晰的分层、高效的协作和良好的可维护性是关键。ASP.NET Core提供了高性能、跨平台的后端API能力,而Vue.js则以其渐进式、易上手的特性成为前端开发的利器。今天,我就结合自己的实战经验,带大家从零开始,搭建一个基于ASP.NET Core Web API和Vue.js的前后端分离项目框架,并分享一些我踩过的“坑”和最佳实践。

第一步:环境准备与项目创建

首先,确保你的开发环境已经就绪。你需要安装.NET SDK(建议使用最新的LTS版本)和Node.js(包含npm)。我个人推荐使用Visual Studio Code进行全栈开发,当然,Visual Studio 2022也是绝佳的后端开发工具。

我们从创建后端项目开始。打开终端,执行以下命令:

# 创建一个名为`EnterpriseApp.API`的Web API项目
dotnet new webapi -n EnterpriseApp.API -o backend
cd backend

# 添加一些常用的NuGet包(根据实际需求选择)
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet add package AutoMapper.Extensions.Microsoft.DependencyInjection
dotnet add package Swashbuckle.AspNetCore

接下来,创建前端Vue.js项目。我们使用Vue CLI,它提供了现代化的项目脚手架。

# 回到项目根目录,创建前端项目
cd ..
# 使用Vue CLI创建项目,这里我选择Vite作为构建工具,速度更快
npm create vue@latest frontend
# 创建过程中,根据提示选择需要的特性,如TypeScript、Router、Pinia等。

踩坑提示:在Windows PowerShell中执行`npm create`命令可能会遇到执行策略限制,建议使用CMD或Git Bash。另外,前后端项目最好放在同一个解决方案或根目录下,方便管理。

第二步:配置ASP.NET Core Web API

后端的主要任务是提供清晰、安全、高效的RESTful API。我们首先需要配置跨域资源共享(CORS),因为前端运行在不同的端口(通常是5173或3000)。

打开`backend/Program.cs`文件,在`var app = builder.Build();`之前添加服务配置:

// 添加CORS策略,允许前端应用访问
builder.Services.AddCors(options =>
{
    options.AddPolicy("VueAppPolicy",
        policy =>
        {
            policy.WithOrigins("http://localhost:5173") // Vue开发服务器地址
                  .AllowAnyHeader()
                  .AllowAnyMethod()
                  .AllowCredentials(); // 如果需要传递Cookie或认证头,则加上此项
        });
});

// 添加Swagger/OpenAPI支持,方便API调试和文档查看
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// 添加数据库上下文、AutoMapper等服务...
// builder.Services.AddDbContext(...);
// builder.Services.AddAutoMapper(typeof(Program));

然后,在`app = builder.Build();`之后,启用中间件:

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

app.UseHttpsRedirection();

// **重要:UseCors必须放在UseAuthorization之前,且通常紧跟在UseRouting之后(.NET 6+模板已隐式调用UseRouting)**
app.UseCors("VueAppPolicy");

app.UseAuthorization();
app.MapControllers();
app.Run();

实战经验:CORS配置不当是前后端联调中最常见的问题之一。务必确保`WithOrigins`中的地址与前端实际运行地址完全一致(包括端口)。生产环境需要将其替换为真实的域名。

第三步:构建Vue.js前端并连接API

进入前端目录,安装必要的依赖。为了调用后端API,我们通常使用`axios`。

cd frontend
npm install axios
# 如果创建项目时未安装Vue Router和状态管理库,可以现在安装
# npm install vue-router@4
# npm install pinia

接下来,创建一个统一的API请求工具。在`src`目录下创建`utils/request.js`(或`request.ts`):

// src/utils/request.js
import axios from 'axios';

// 创建axios实例,配置基础URL和超时时间
const service = axios.create({
  baseURL: 'https://localhost:7293/api', // 替换为你的后端API地址,注意HTTPS!
  timeout: 10000, // 10秒超时
});

// 请求拦截器:可用于在发送请求前添加Token等操作
service.interceptors.request.use(
  config => {
    // 假设我们将JWT Token存储在localStorage中
    const token = localStorage.getItem('access_token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 响应拦截器:统一处理错误响应,如401跳转登录
service.interceptors.response.use(
  response => {
    // 对响应数据做点什么
    return response.data;
  },
  error => {
    if (error.response && error.response.status === 401) {
      // 未授权,跳转到登录页
      console.error('未授权,请重新登录');
      // 使用Vue Router进行跳转,这里需要根据你的路由配置调整
      // router.push('/login');
    }
    return Promise.reject(error);
  }
);

export default service;

然后,在一个组件(例如`src/views/HomeView.vue`)中尝试调用后端的示例API:


  

欢迎使用企业级应用

加载中...

  • {{ item.date }}: {{ item.summary }}, 温度:{{ item.temperatureC }}°C
import { ref, onMounted } from 'vue'; import api from '@/utils/request'; // 导入我们封装的请求工具 const weatherForecasts = ref([]); const loading = ref(false); const fetchData = async () => { loading.value = true; try { // 调用后端WeatherForecast控制器的Get方法 const response = await api.get('/WeatherForecast'); weatherForecasts.value = response; } catch (error) { console.error('获取数据失败:', error); // 这里可以添加更友好的错误提示,例如使用Element Plus的Message组件 } finally { loading.value = false; } }; onMounted(() => { fetchData(); });

踩坑提示:首次运行时,你可能会遇到SSL证书错误(因为.NET API默认使用HTTPS开发证书)。有几种解决方案:1)让后端API使用HTTP(不推荐);2)在前端`package.json`的`dev`脚本中添加`NODE_EXTRA_CA_CERTS`环境变量指向.NET开发证书;3)最简单的是在`request.js`中创建axios实例时,暂时设置`baseURL`为HTTP地址(`http://localhost:5252`),并确保后端`Program.cs`中`app.UseHttpsRedirection();`在开发环境被跳过或注释。生产环境务必使用HTTPS!

第四步:处理身份认证与授权(JWT示例)

企业应用离不开认证。JWT(JSON Web Token)是前后端分离架构中常用的无状态认证方案。在后端,你需要安装`Microsoft.AspNetCore.Authentication.JwtBearer`包。

cd ../backend
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

在`Program.cs`中配置JWT认证:

// 读取配置
var jwtSettings = builder.Configuration.GetSection("JwtSettings");
var secretKey = jwtSettings["SecretKey"];

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = jwtSettings["Issuer"],
        ValidAudience = jwtSettings["Audience"],
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey))
    };
});

// 在`app.UseAuthorization();`之前,必须调用`app.UseAuthentication();`
app.UseAuthentication();
app.UseAuthorization();

创建一个`AuthController`来处理登录,颁发JWT Token。前端在登录成功后,将Token存储到`localStorage`或更安全的`sessionStorage`中,并在后续请求中通过`axios`拦截器自动附加到请求头。

实战经验:Token的安全存储是个重要议题。避免在客户端存储敏感信息。可以考虑使用HttpOnly Cookie来存储Refresh Token,增加安全性。同时,后端API的CORS配置如果需要传递认证头(Authorization),`AllowCredentials()`必须为`true`。

第五步:部署与生产环境配置

开发完成后,我们需要将前后端分别构建并部署。

后端:使用`dotnet publish`命令发布。

cd backend
dotnet publish -c Release -o ./publish

前端:构建静态文件。

cd ../frontend
npm run build

此时,前端所有静态资源(HTML, JS, CSS, 图片)会生成在`dist`目录。你有两种主流部署方式:

  1. 完全分离:将前端`dist`目录下的文件部署到Nginx、IIS或对象存储(如AWS S3)上,后端API独立部署到另一台服务器。需要在前端构建时,将`axios`的`baseURL`设置为生产环境的API地址(可通过环境变量注入)。
  2. 后端托管前端:将前端`dist`目录的内容复制到后端项目的`wwwroot`目录下,然后在ASP.NET Core中配置静态文件中间件和回退路由(Fallback),让所有未匹配API路由的请求都返回前端的`index.html`。这种方式简化了部署,适合中小型项目。

在`Program.cs`中添加托管配置:

// 提供wwwroot目录下的静态文件
app.UseStaticFiles();

// 配置回退路由,让前端路由接管
app.MapFallbackToFile("index.html");

踩坑提示:生产环境的数据库连接字符串、JWT密钥等敏感信息,绝不要硬编码在代码中。务必使用`appsettings.Production.json`、环境变量或Azure Key Vault等安全方式进行管理。

至此,一个基于ASP.NET Core和Vue.js的前后端分离企业级应用基础框架就搭建完成了。这个架构清晰、职责分离,非常适合团队协作和项目扩展。在实际开发中,你还需要根据业务引入更复杂的状态管理、路由守卫、表单验证、单元测试等。希望这篇教程能为你提供一个坚实的起点,祝你编码愉快!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。