本文最后更新于843 天前,其中的信息可能已经过时,如有错误请发送邮件到2192492965@qq.com
# ASP.NET CORE 入门
简介
作者:Daniel Roth、Rick Anderson 和 Shaun Luttin
ASP.NET Core 是一个跨平台的高性能开源框架,用于生成启用云且连接 Internet 的新式应用。
使用 ASP.NET Core,您可以:
创建Web项目
通过命令创建
-
打开集成终端。
-
将目录 (
cd) 更改为包含项目文件夹的文件夹。 -
运行以下命令:
.NET CLI复制
dotnet new webapi -o TodoApi cd TodoApi dotnet add package Microsoft.EntityFrameworkCore.InMemory code -r ../TodoApi这些命令会:
- 创建新的 Web API 项目,并在 Visual Studio Code 中打开它。
- 添加下一部分所需的 NuGet 包。
-
当对话框询问是否要将所需资产添加到项目时,选择“是”。
JetBrains Rider 创建
- 点击文件>新建解决方案
- 选择ASP>NETCore web应用程序
- 选择SDK版本
- 选择
按类分组为Web API - 点击
创建即可创建项目
Visual Studio创建
- 从“文件”菜单中选择“新建”>“项目” 。
- 在搜索框中输入“Web API”。
- 选择“ASP.NET Core Web API”模板,然后选择“下一步”。
- 在“配置新项目”对话框中,将项目命名为“TodoApi”,然后选择“下一步”。
- 在“其他信息”对话框中:
- 确认“框架”是“.NET 7.0”(或更高版本)。
- 确认已选中“使用控制器(取消选中以使用最小 API)”。
- 选择“创建”。
运行项目
进入项目后运行以下命令:
dotnet run
添加数据库(mysql)
- 安装下列第三方包
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools.DotNet
MySql.Data
MySql.EntityFrameworkCore
- 创建DB目录,在目录下创建IndexDB.cs在其中编写以下内容:
using Microsoft.EntityFrameworkCore;
using book.Model;
namespace book.DB;
public class IndexDb:DbContext
{
public DbSet<UserModel> User { get; set; } // 添加模型链接
public IndexDb(DbContextOptions<IndexDb> options) : base(options)
{
}
}
- 在根目录下的appsettings.json中添加以下内容:
"ConnectionStrings": {
"DefaultConnection": "server=localhost;port=3306;database=book_db;user=root;password=12345678"
}
- 其中server为mysql运行地址,port 为mysql运行端口,database代表本项目链接的数据库名,user为mysql用户名,password为登录密码。
- 在Program.cs中添加以下内容:
using Microsoft.EntityFrameworkCore;
// 添加mysql数据库配置
builder.Services.AddDbContext<IndexDb>(options =>
{
options.UseMySQL(builder.Configuration.GetConnectionString("DefaultConnection") ?? "");
});
-
在项目中创建Model文件夹,并创建模型文件(以下以用户表为例)
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Diagnostics.CodeAnalysis; using Microsoft.EntityFrameworkCore; namespace book.Model; [Table("user")] public class UserModel { [Key] public int Id { get; set; } [StringLength(16),Comment("用户名")] public string? Username { get; set; } [StringLength(512),Comment("用户密码")] public string? Password { get; set; } [Column(TypeName = "datetime")] public DateTime CreateAt { get; set; } = DateTime.Now; [Column(TypeName = "datetime")] public DateTime UpdateAt { get; set; } } -
在终端中运行以下命令进行数据库迁移/链接:
dotnet ef migrations add <name> # 创建迁移文件
dotnet ef database update # 生成数据库表/同步数据库
添加控制器
在Controller文件夹中创建控制器,其中控制器命名应遵循以下规则:
- 控制器类的名称应该以
Controller结尾。例如,如果你的控制器处理用户相关的操作,你可以将其命名为UserController。 - 控制器类应该位于一个名为
Controllers的文件夹中。这是为了组织和区分控制器类和其他类型的类。 - 控制器文件的扩展名应该是
.cs(对于C#)或.vb(对于VB.NET)。 - 控制器文件的命名应该与控制器类的名称相匹配。例如,如果你的控制器类名为
UserController,那么控制器文件的名称应该是UserController.cs。
示例:
using Microsoft.AspNetCore.Mvc;
using book.DB;
using book.ErrHandler;
using book.Model;
namespace book.Controllers;
[Route("/user")]
public class UserController: ControllerBase
{
private readonly IndexDb _context;
private readonly ErrTemplate _errTemplate;
public UserController(IndexDb context)
{
ErrTemplate errTemplate = new ErrTemplate();
_context = context;
_errTemplate = errTemplate;
}
[HttpPost("login")]
public Dictionary<string, object> Login(string username,string password)
{
var user = _context.User.FirstOrDefault(u=>u.Username == username);
if (user == null)
{
return _errTemplate.UserDoesNotExist();
}
bool verified = BCrypt.Net.BCrypt.Verify(password, user.Password);
if (verified)
{
return _errTemplate.Success("登录成功","");
}
return _errTemplate.UserPasswordError();
}
[HttpPost("reg")]
public Dictionary<string, object> Register(string username, string password)
{
var user = _context.User.FirstOrDefault(u=>u.Username == username);
if (user != null)
{
return _errTemplate.UserNameAlreadyExists();
}
var hashedPassword = BCrypt.Net.BCrypt.HashPassword(password);
var userModel = new UserModel {Username= username,Password= hashedPassword};
_context.User.Add(userModel);
_context.SaveChanges();
UserModel result;
result = userModel;
result.Password = "******";
return userModel.Id>0 ? _errTemplate.Success("注册成功",userModel):_errTemplate.RegisterFailed();
}
}
在C#中允许一个控制器类存在多个相同请求类型的接口




