本教程将从零开始,系统地介绍 ASP.NET 的核心概念、技术栈和最佳实践,旨在帮助您从入门到精通,成为一名合格的 ASP.NET 开发者。


ASP.NET 网络编程标准教程

目录

  1. 第一部分:入门基础

    • 第1章:ASP.NET 简介
    • 第2章:开发环境搭建
    • 第3章:创建第一个 ASP.NET Core 应用
    • 第4章:理解请求-响应模型
  2. 第二部分:核心概念

    • 第5章:MVC 架构模式
    • 第6章:控制器
    • 第7章:视图
    • 第8章:模型
    • 第9章:路由
  3. 第三部分:数据交互

    • 第10章:表单与模型绑定
    • 第11章:数据验证
    • 第12章:Entity Framework Core (EF Core) 入门
    • 第13章:数据库操作:增删改查
  4. 第四部分:进阶技术

    • 第14章:依赖注入
    • 第15章:中间件
    • 第16章:身份认证与授权
    • 第17章:API 开发 (Web API)
    • 第18章:前端集成:Razor Pages 与 Blazor
  5. 第五部分:部署与优化

    • 第19章:应用部署
    • 第20章:性能优化与日志记录

第一部分:入门基础

第1章:ASP.NET 简介

1 什么是 ASP.NET? ASP.NET 是由微软开发的一个用于构建 Web 应用、Web API 和移动后端服务的、跨平台的、高性能的开源框架,它运行在 .NET 运行时之上。

2 ASP.NET 的演变

  • ASP.NET (经典):基于 .NET Framework,仅支持 Windows IIS 服务器。
  • ASP.NET Core:全新的、开源的、跨平台的框架,是当前和未来的主流,它从零开始重构,性能更高,模块化更强,支持 Linux 和 macOS。

3 为什么选择 ASP.NET Core?

  • 跨平台:可在 Windows, Linux, macOS 上开发和运行。
  • 高性能:在各大 Web 框架性能测试中名列前茅。
  • 开源:拥有活跃的社区和持续的创新。
  • 模块化:通过 NuGet 包管理,可以按需引入功能,轻量级。
  • 统一框架:使用同一套技术栈构建 Web UI (MVC/Razor Pages) 和 Web API。

第2章:开发环境搭建

1 安装 .NET SDK .NET SDK (Software Development Kit) 包含了运行和开发 .NET 应用所需的一切,访问 .NET 官网 下载并安装最新的 LTS (长期支持) 版本。

2 选择代码编辑器

  • Visual Studio (推荐):微软官方的集成开发环境,功能强大,对 .NET 支持最好,推荐安装 Visual Studio 2025 Community (免费版)。
  • Visual Studio Code:轻量级、跨平台的代码编辑器,配合 C# 扩展,也能提供良好的开发体验。

3 验证安装 打开命令行工具 (如 PowerShell 或 CMD),输入以下命令:

dotnet --version

如果显示版本号,则说明安装成功。

第3章:创建第一个 ASP.NET Core 应用

我们将使用命令行工具创建一个最简单的 Web 应用。

  1. 创建项目

    # 创建一个名为 MyFirstApp 的文件夹并进入
    mkdir MyFirstApp
    cd MyFirstApp
    # 创建一个名为 "web" 的 ASP.NET Core MVC 应用
    dotnet new mvc -o MyFirstApp
  2. 运行项目

    # 进入项目目录
    cd MyFirstApp
    # 运行应用
    dotnet run
  3. 查看结果 命令行会显示类似以下信息:

    info: Microsoft.Hosting.Lifetime[14]
          Now listening on: https://localhost:7123
    info: Microsoft.Hosting.Lifetime[14]
          Now listening on: http://localhost:5123

    打开浏览器,访问 https://localhost:7123,你将看到一个欢迎页面。

第4章:理解请求-响应模型

这是所有 Web 应用的核心工作方式。

  • 请求:当你在浏览器中输入一个 URL 并回车时,浏览器会向服务器发送一个 HTTP 请求,这个请求包含了方法(如 GET, POST)、URL、协议版本、请求头和请求体等信息。
  • 响应:服务器接收到请求后,进行处理,然后返回一个 HTTP 响应,这个响应包含了状态码(如 200 OK, 404 Not Found)、响应头和响应体(通常是 HTML 页面、JSON 数据等)。

在 ASP.NET Core 中,一个中间件 就是一个处理 HTTP 请求和响应的组件,它们像一条管道,请求依次通过每个中间件,响应再依次反向返回。app.Run() 是最简单的中间件,它直接处理请求并生成响应。


第二部分:核心概念

第5章:MVC 架构模式

ASP.NET Core MVC 是一种使用 Model-View-Controller (M-VC) 设计模式来构建 Web 应用的框架。

  • Model (模型):代表应用程序的数据和业务逻辑,它负责与数据库交互,并对数据进行验证。
  • View (视图):是用户界面,它负责展示从 Model 获取的数据,并允许用户与界面交互。
  • Controller (控制器):是 Model 和 View 之间的协调者,它接收来自用户的输入(通过 HTTP 请求),调用 Model 处理数据,然后选择一个 View 来向用户展示结果。

第6章:控制器

控制器是一个公共类,继承自 ControllerBase (用于 API) 或 Controller (用于 MVC,提供视图功能)。

示例:HomeController.cs

using Microsoft.AspNetCore.Mvc;
namespace MyFirstApp.Controllers
{
    public class HomeController : Controller
    {
        // 这是一个 Action 方法,处理对 "/" 或 "/Home/Index" 的 GET 请求
        public IActionResult Index()
        {
            // 返回一个 ViewResult,会默认 Views/Home/Index.cshtml 视图
            return View();
        }
        public IActionResult About()
        {
            ViewBag.Message = "Your application description page.";
            return View();
        }
    }
}
  • Action 方法:控制器中处理请求的公共方法,其返回类型通常是 IActionResult
  • ViewBag:一个动态对象,用于在控制器和视图之间传递少量数据。

第7章:视图

视图是使用 Razor 语法.cshtml 文件,Razor 是一种允许你在 HTML 中嵌入 C# 代码的标记语法。

示例:Views/Home/Index.cshtml

@{
    ViewData["Title"] = "Home Page";
}
<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
  • 符号:用于切换到 C# 代码模式。
  • 用于执行多行 C# 代码。
  • @variable:用于输出变量的值。

第8章:模型

模型是一个普通的 C# 类(或 POCO - Plain Old CLR Object),用于表示数据。

示例:Models/Person.cs

namespace MyFirstApp.Models
{
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

这个模型可以在控制器中创建,并传递给视图进行展示。

第9章:路由

路由是确定哪个 Action 方法应该处理传入请求的机制,ASP.NET Core 使用 约定式路由

默认的 MVC 路由模板在 Program.cs 中定义:

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

这个模板的含义是:

  • {controller}:控制器名,默认是 Home
  • {action}:Action 方法名,默认是 Index
  • {id?}:可选的参数。 表示它不是必需的。

请求 /Products/Details/5 会被映射到 ProductsControllerDetails(int id) 方法,id 的值是 5


第三部分:数据交互

第10章:表单与模型绑定

模型绑定是 ASP.NET Core 的一个强大功能,它能自动将 HTTP 请求中的数据映射到 Action 方法的参数中。

示例:在视图中创建表单

@model MyFirstApp.Models.Person
<h2>Create Person</h2>
<form asp-action="Create">
    <div>
        <label asp-for="Name"></label>
        <input asp-for="Name" />
    </div>
    <div>
        <label asp-for="Age"></label>
        <input asp-for="Age" type="number" />
    </div>
    <button type="submit">Create</button>
</form>
  • asp-for:Razor 标签助手,会自动生成 labelinputnameid 属性,并与模型属性绑定。

示例:在控制器中接收数据

[HttpPost] // 确保这个 Action 只处理 POST 请求
public IActionResult Create(Person person)
{
    if (ModelState.IsValid)
    {
        // 数据验证通过,保存到数据库...
        return RedirectToAction("Success"); // 重定向到成功页面
    }
    // 如果验证失败,返回带有错误信息的表单
    return View(person);
}

第11章:数据验证

通过在模型类上添加数据注解,可以轻松实现客户端和服务器端验证。

示例:修改 Person 模型

using System.ComponentModel.DataAnnotations;
namespace MyFirstApp.Models
{
    public class Person
    {
        public int Id { get; set; }
        [Required(ErrorMessage = "Name is required.")]
        [StringLength(50, MinimumLength = 2)]
        public string Name { get; set; }
        [Range(0, 120)]
        public int Age { get; set; }
    }
}
  • [Required]:属性是必需的。
  • [StringLength]:字符串长度限制。
  • [Range]:数值范围限制。

当模型绑定失败时,ModelState.IsValid 会返回 false,Razor 视图会自动显示验证错误信息。

第12章:Entity Framework Core (EF Core) 入门

EF Core 是微软官方的对象关系映射器,它让你可以用 C# 对象来操作数据库,而无需编写 SQL 语句。

  1. 安装 EF Core

    dotnet add package Microsoft.EntityFrameworkCore.SqlServer
    dotnet add package Microsoft.EntityFrameworkCore.Tools
  2. 创建数据库上下文 数据库上下文是 EF Core 的核心,它协调模型和数据库的交互。

    using Microsoft.EntityFrameworkCore;
    using MyFirstApp.Models;
    namespace MyFirstApp.Data
    {
        public class AppDbContext : DbContext
        {
            public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
            // 将 Person 模型映射到数据库中的表
            public DbSet<Person> People { get; set; }
        }
    }
  3. 配置数据库连接appsettings.json 中添加连接字符串。

    {
      "ConnectionStrings": {
        "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyFirstAppDb;Trusted_Connection=True;MultipleActiveResultSets=true"
      }
      // ... other settings
    }

    Program.cs 中注册上下文。

    using MyFirstApp.Data;
    var builder = WebApplication.CreateBuilder(args);
    // Add services to the container.
    builder.Services.AddDbContext<AppDbContext>(options =>
        options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
    builder.Services.AddControllersWithViews();
    // ...

第13章:数据库操作:增删改查

我们可以在控制器中使用 AppDbContext 来进行数据库操作。

示例:PeopleController.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using MyFirstApp.Data;
using MyFirstApp.Models;
public class PeopleController : Controller
{
    private readonly AppDbContext _context;
    public PeopleController(AppDbContext context)
    {
        _context = context;
    }
    // GET: /People
    public async Task<IActionResult> Index()
    {
        var people = await _context.People.ToListAsync();
        return View(people);
    }
    // POST: /People/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create([Bind("Name,Age")] Person person)
    {
        if (ModelState.IsValid)
        {
            _context.Add(person);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        return View(person);
    }
    // ... 其他 Delete, Edit, Details 方法
}
  • async/await:用于异步操作,避免阻塞服务器线程,提高并发性能。
  • _context.People:访问 People 数据库表。
  • Add(), SaveChangesAsync(), ToListAsync():EF Core 提供的核心方法。

第四部分:进阶技术

第14章:依赖注入

依赖注入是 ASP.NET Core 的核心设计原则,它是一种设计模式,用于实现控制反转,在 ASP.NET Core 中,容器会自动创建对象(服务)并将其注入到需要它的类(如控制器)中。

  • 注册服务:在 Program.cs 中,使用 builder.Services 注册你的服务。

    // 将 AppDbContext 注册为服务,生命周期为 "Scoped" (每个请求一个实例)
    builder.Services.AddDbContext<AppDbContext>(options => ...);
  • 使用服务:在类的构造函数中声明你需要的依赖项。

    public class PeopleController : Controller
    {
        private readonly AppDbContext _context; // AppDbContext 实例由容器注入
        // 构造函数注入
        public PeopleController(AppDbContext context)
        {
            _context = context;
        }
    }

第15章:中间件

中间件是组装到应用程序管道中以处理请求和响应的软件,每个中间件:

  1. 可以选择将请求传递到管道中的下一个中间件。
  2. 可以在管道中的下一个中间件执行前后执行工作。

自定义中间件示例

// 自定义一个记录请求时间的中间件
public class TimingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<TimingMiddleware> _logger;
    public TimingMiddleware(RequestDelegate next, ILogger<TimingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }
    public async Task Invoke(HttpContext context)
    {
        var startTime = DateTime.UtcNow;
        _logger.LogInformation($"Request started at: {startTime}");
        // 调用管道中的下一个中间件
        await _next(context);
        var endTime = DateTime.UtcNow;
        var duration = endTime - startTime;
        _logger.LogInformation($"Request took: {duration.TotalMilliseconds} ms");
    }
}
// 在 Program.cs 中注册中间件
app.UseMiddleware<TimingMiddleware>();

第16章:身份认证与授权

  • 认证:确定“你是谁?”的过程,通过用户名和密码登录。
  • 授权:确定“你能做什么?”的过程,只有管理员才能删除用户。

ASP.NET Core 提供了内置的身份认证和授权系统。

启用认证Program.cs 中添加认证服务。

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.LoginPath = "/Account/Login"; // 未登录用户的重定向路径
    });
app.UseAuthentication(); // 必须在 UseAuthorization 之前
app.UseAuthorization();

应用授权特性 在控制器或 Action 方法上使用 [Authorize] 特性。

[Authorize] // 只有已登录用户才能访问
public IActionResult Dashboard()
{
    return View();
}
[Authorize(Roles = "Admin")] // 只有角色为 "Admin" 的用户才能访问
public IActionResult DeleteUser(int id)
{
    // ...
}

第17章:API 开发

ASP.NET Core 使用 MVCMinimal APIs 来构建 Web API。

使用 MVC 构建API 创建一个继承自 ControllerBase 的控制器,并返回特定的数据类型(如 IActionResult 或具体的对象)。

示例:WeatherForecastController.cs

using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };
    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        // ...
        return forecasts;
    }
}
  • [ApiController]:提供 API 特定的功能,如自动模型验证和 400 响应。
  • [Route]:定义控制器的路由前缀。
  • [HttpGet]:指定此 Action 处理 HTTP GET 请求。
  • ControllerBase:不包含与视图相关的功能,更适合 API 开发。

第18章:前端集成:Razor Pages 与 Blazor

  • Razor Pages:比 MVC 更简单的模型,特别用于构建页面为中心的应用,每个 .cshtml 文件都有一个对应的 .cs 文件(Page Model),代码组织更直观。
  • Blazor:一个革命性的框架,允许你使用 C# 和 HTML/Razor 来构建交互式客户端 Web UI,而无需 JavaScript,Blazor 支持 WebAssembly (在浏览器中运行) 和 Server (在服务器上运行) 两种模式。

第五部分:部署与优化

第19章:应用部署

将开发好的应用部署到服务器上,使其可以被公众访问。

部署到 IIS (Windows)

  1. 发布应用:在 Visual Studio 中右键项目 -> "发布",选择文件夹目标,生成发布文件。
    # 命令行方式
    dotnet publish -c Release -o ./publish
  2. 在 IIS 中创建网站:指向发布文件夹的物理路径。
  3. 安装 .NET Hosting Bundle:确保 IIS 能够运行 .NET Core 应用。
  4. 配置应用程序池:将 .NET CLR 版本设置为 "无托管代码"。

部署到 Docker

  1. 创建 Dockerfile:定义如何构建和运行 Docker 镜像。

    # 使用官方 .NET SDK 镜像作为构建环境
    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
    WORKDIR /src
    COPY ["MyFirstApp.csproj", "."]
    RUN dotnet restore "MyFirstApp.csproj"
    COPY . .
    WORKDIR "/src/."
    RUN dotnet build "MyFirstApp.csproj" -c Release -o /app/build
    # 使用官方 .NET 运行时镜像作为运行环境
    FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
    WORKDIR /app
    EXPOSE 80
    EXPOSE 443
    FROM build AS publish
    RUN dotnet publish "MyFirstApp.csproj" -c Release -o /app/publish
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app/publish .
    ENTRYPOINT ["dotnet", "MyFirstApp.dll"]
  2. 构建并运行镜像

    docker build -t my-first-app .
    docker run -d -p 8080:80 --name my-running-app my-first-app

第20章:性能优化与日志记录

  • 日志记录:使用内置的日志系统,将应用运行时的信息记录下来,便于调试和监控。

    // 在控制器或服务中注入 ILogger
    private readonly ILogger<HomeController> _logger;
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }
    public IActionResult Index()
    {
        _logger.LogInformation("Home page accessed at {Time}", DateTime.UtcNow);
        // ...
    }
  • 性能优化

    • 异步编程:广泛使用 async/await,避免 I/O 操作阻塞线程。
    • 缓存:使用 IMemoryCacheIDistributedCache 缓存频繁访问的数据。
    • 数据库优化:对数据库查询进行分析,使用索引,避免 N+1 查询问题。
    • 静态文件优化:使用 UseStaticFiles 中间件,并配置缓存策略。

总结与学习路径

  1. 基础阶段:掌握第一、二部分,理解请求-响应、MVC、路由、视图和模型。
  2. 数据阶段:精通第三部分,熟练使用表单、验证和 EF Core 进行数据操作。
  3. 进阶阶段:学习第四部分,理解 DI、中间件、认证授权,并掌握 API 开发。
  4. 实战阶段:完成一个完整的项目,如博客系统、电商后台等,并学习第五部分的部署和优化。

ASP.NET Core 是一个功能强大且不断发展的框架,保持学习的热情,多实践,多阅读官方文档,你一定能成为一名优秀的 ASP.NET 开发者,祝你学习愉快!