From 88c9aedae6637c557cdeb16b3dfa82cf4b070e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=98=A5=E9=9B=AA?= <402475095@qq.com> Date: Fri, 13 Jun 2025 10:15:45 +0800 Subject: [PATCH] dd --- .../\347\254\224\350\256\260/20250609.md" | 38 +++ .../\347\254\224\350\256\260/20250611.md" | 95 +++++++ .../\347\254\224\350\256\260/20250612.md" | 260 ++++++++++++++++++ 3 files changed, 393 insertions(+) create mode 100644 "40 \351\273\204\346\230\245\351\233\252/\347\254\224\350\256\260/20250609.md" create mode 100644 "40 \351\273\204\346\230\245\351\233\252/\347\254\224\350\256\260/20250611.md" create mode 100644 "40 \351\273\204\346\230\245\351\233\252/\347\254\224\350\256\260/20250612.md" diff --git "a/40 \351\273\204\346\230\245\351\233\252/\347\254\224\350\256\260/20250609.md" "b/40 \351\273\204\346\230\245\351\233\252/\347\254\224\350\256\260/20250609.md" new file mode 100644 index 0000000..925d6df --- /dev/null +++ "b/40 \351\273\204\346\230\245\351\233\252/\347\254\224\350\256\260/20250609.md" @@ -0,0 +1,38 @@ +# C# 异步编程基础 + +## 异步编程的概念 +C# 异步编程是一种编程模式,允许程序在执行某些操作时不会阻塞主线程,从而提高应用程序的响应性和性能 + +## 同步与异步的区别 +- **执行方式**:同步编程是按顺序执行代码,每个操作必须等待前一个操作完成。而异步编程允许程序在等待某个操作完成时继续执行其他任务。 +- **资源利用**:同步编程通常会阻塞线程,导致资源浪费。异步编程则可以有效利用线程资源,避免线程阻塞 +- **性能**:同步编程在处理大量 I/O 操作或长时间运行的任务时,性能较差,因为线程会被阻塞,导致程序响应缓慢。异步编程则可以显著提高性能,因为它允许程序在等待 I/O 操作完成时继续执行其他任务,从而提高程序的吞吐量和响应速度。 + +## 异步编程的优势 + +- **提高响应性**:在用户界面应用程序中,异步编程可以避免界面冻结 +- **提高性能**:异步编程可以有效利用线程资源,避免线程阻塞。 +- **简化代码**:C# 的 `async` 和 `await` 关键字使得异步编程的代码更加简洁和易于理解。 +- **更好的错误处理**:异步编程支持在 `async` 方法中使用 `try-catch` 块来捕获异常,这使得错误处理更加简单和一致。 +- **支持多种异步操作**:C# 的异步编程不仅支持 I/O 操作,还支持计算密集型操作 +## Task与Task\ +`Task` 类是 C# 异步编程的核心,它表示一个异步操作。`Task` 类提供了丰富的功能,用于管理异步操作的执行、结果和状态。 +- **状态管理**:`Task` 提供了多种状态,如 `Running`、`WaitingToRun`、`WaitingForActivation` 等,通过 `Task.Status` 属性可以获取任务的当前状态。 +- **结果获取**:对于返回值的异步操作,C# 提供了 `Task\` 类型。通过 `Task\.Result` 属性可以获取异步操作的结果。 +- **异常处理**:`Task` 支持异常传播机制。当异步操作中发生异常时,异常会被封装在 `Task` 对象中。通过 `Task.Exception` 属性可以获取异常信息。 +- **并发控制**:`Task` 提供了并发控制机制,通过 `Task.WhenAll` 和 `Task.WhenAny` 方法可以实现多个任务的并发执行。 +## async与await关键字 +`async` 和 `await` 是 C# 5.0 引入的关键字,用于简化异步编程的代码。 +- **async关键字**:`async` 关键字用于声明一个异步方法。 +- **await关键字**:`await` 关键字用于等待一个异步操作的完成。 +- **代码结构**:`async` 和 `await` 关键字使得异步编程的代码结构更加清晰。 +- **性能优化**:`async` 和 `await` 关键字可以提高程序的性能。 + + + +### C# 异步编程的关键技术包括: + +- **`Task` 和 `Task`**:`Task` 类是异步编程的核心,提供了丰富的功能用于管理异步操作的执行、结果和状态。`Task` 用于表示返回值的异步操作。 +- **`async` 和 `await` 关键字**:`async` 用于声明异步方法,`await` 用于等待异步操作的完成,使得异步代码的结构更加清晰。 +- **`CancellationToken`**:用于取消异步操作,通过 `CancellationTokenSource` 创建并传递给异步方法,可以在需要时取消操作并处理取消事件。 + diff --git "a/40 \351\273\204\346\230\245\351\233\252/\347\254\224\350\256\260/20250611.md" "b/40 \351\273\204\346\230\245\351\233\252/\347\254\224\350\256\260/20250611.md" new file mode 100644 index 0000000..ba3c238 --- /dev/null +++ "b/40 \351\273\204\346\230\245\351\233\252/\347\254\224\350\256\260/20250611.md" @@ -0,0 +1,95 @@ +## RESTful API的框架 + +在C#中,构建RESTful API的框架主要有以下几种: + +## 1\. ASP.NET Web API + +ASP.NET Web API 是一个用于构建 RESTful Web 服务的框架 + +- **路由功能**:支持属性路由和约定路由,可以灵活定义API的URL路径。 +- **模型绑定与验证**:能够自动将HTTP请求中的数据绑定到控制器的动作方法参数上,并支持数据验证。 +- **多种序列化支持**:支持JSON、XML等序列化格式,可以方便地将对象序列化为客户端需要的格式。 +- **中间件支持**:可以添加中间件用于实现认证、授权、日志记录等功能。 + +## 2\. DeepSleep + + * 是一个开源的 RESTful API 框架 + * **特点** : + * **高性能** :经过优化,能够提供高性能的 API 服务,适合处理高并发的请求。 + * **功能丰富** :提供了一系列工具和服务,包括路由配置、模型绑定与验证、响应序列化、中间件支持、错误处理、版本管理和性能优化等 + * **良好的文档和社区支持** :框架的文档和示例丰富 + +## 3\. HPSocket + + * 是一套高性能的 TCP/UDP/HTTP 通信框架,提供了 C# 等编程语言的接口。 + * **特点** : + * **高性能** :经过优化,具有高性能的数据传输能力,能够高效地处理大量的网络通信请求。 + * **跨平台支持** :支持多种操作系统,便于开发者构建跨平台的应用,满足不同平台下的网络通信需求。 + * **易用性** :提供了丰富的 API 和文档,降低了开发难度,使得开发者可以快速地使用该框架构建网络通信应用。 + +## 4\. SignalR + + * 是一个通信框架,用于实现服务器与客户端之间的实时双向通信,可以用于构建一些具有实时特性的 RESTful API + + * **特点** : + * **实时性** :能够实现服务器与客户端之间的实时通信,适用于需要即时交互的应用 + * **灵活性** :支持多种传输方式,根据客户端和服务器的环境选择最优的通信方式,包括 WebSockets、Server-Sent Events 和长轮询等。 + * **简单易用** :提供了简单易用的 API,降低了实时通信功能的开发难度。 + + + +## 5\. gRPC + + * 跨平台的开源高性能远程过程调用(RPC)框架。用于服务间通信,用于构建高性能的 RESTful API + + * **特点** : + * **高性能** :基于 HTTP/2 的传输层,实现了高效的数据传输和较低的延迟。 + * **跨平台** :支持多种操作系统和语言,便于构建分布式系统。 + * **双向流式传输** :支持客户端和服务器之间的双向流式传输,适用于需要持续数据传输的场景。 + * **安全性** :支持认证、流量控制等功能,确保通信的安全性。 + + + +## HttpClient + +`HttpClient` 是.NET框架中用于发送HTTP请求和接收HTTP响应的类 + +- **异步支持**:提供异步方法(如`GetAsync`、`PostAsync`等),避免阻塞主线程,提高应用程序的响应性。 +- **灵活配置**:可以设置请求头、超时时间、代理服务器等。 +- **强大的功能**:支持多种HTTP方法(GET、POST、PUT、DELETE等),并可以处理JSON、XML等数据格式。 + +### 简单Webapi项目 + +#### 项目文件类型: + +##### 源代码文件:.cs + +###### Program.cs: 负责启动和配置Web 应用程序。 + +注册控制器:AddControllers() + +映射控制器:MapControllers() + +```csharp +using Microsoft.AspNetCore.Mvc; +namespace myproject.Controllers; + +[ApiController]//标记控制器类为 API控制器。 +[Route("api/[controller]")] // 控制器的路由模板。 +public class UserController : ControllerBase +{ + [HttpGet] + public String Get(){ + return "nihao"; + } +} +``` + + + + + +生成命令:dotent new webapi -o 项目名称 + +运行命令:dotnet run + diff --git "a/40 \351\273\204\346\230\245\351\233\252/\347\254\224\350\256\260/20250612.md" "b/40 \351\273\204\346\230\245\351\233\252/\347\254\224\350\256\260/20250612.md" new file mode 100644 index 0000000..35ade35 --- /dev/null +++ "b/40 \351\273\204\346\230\245\351\233\252/\347\254\224\350\256\260/20250612.md" @@ -0,0 +1,260 @@ +# 连接数据库的webapi项目 + +### 安装依赖包: + +```bash +dotnet add package MySql.Data +dotnet add package Microsoft.EntityFrameworkCore +dotnet add package Pomelo.EntityFrameworkCore.MySql +``` + +### 2. 配置数据库连接字符串 + +在 `appsettings.json` 文件中,添加数据库连接字符串: + +```json +{ + "ConnectionStrings": { + "DefaultConnection": "server=localhost;port=3306;database=mydatabase;user=root;password=yourpassword" + }, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} +``` + +### 创建数据库上下文 + +在项目中创建一个 `Models` 文件夹,并在其中创建一个 `DatabaseContext.cs` 文件,定义数据库上下文: + +``` +using Microsoft.EntityFrameworkCore; + +namespace MyWebApiProject.Models +{ + public class DatabaseContext : DbContext + { + public DatabaseContext(DbContextOptions options) : base(options) + { + } + + public DbSet Users { get; set; } + } + +} +``` + +### + +### 实体类 + +在 `Models` 文件夹中创建一个 `User.cs` 文件,定义用户实体类: + +```csharp +using System.ComponentModel.DataAnnotations; + +namespace MyWebApiProject.Models +{ + public class User + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + public string Email { get; set; } + } +} +``` + +### 5. 配置服务 + +在 `Program.cs` 文件中,配置数据库上下文和服务: + +csharp + +复制 + +```csharp +using Microsoft.EntityFrameworkCore; +using MyWebApiProject.Models; + +var builder = WebApplication.CreateBuilder(args); + +// 添加服务 +builder.Services.AddControllers(); + +// 配置数据库上下文 +builder.Services.AddDbContext(options => +{ + var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); + options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); +}); + +var app = builder.Build(); + +//配置请求管道 +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Error"); +} + +app.UseHttpsRedirection(); +app.UseAuthorization(); +app.MapControllers(); + +app.Run(); +``` + +### 6. 编写控制器代码 + +在 `Controllers` 文件夹中创建一个 `UserController.cs` 文件,定义用户控制器: + +csharp + +复制 + +```csharp +using Microsoft.AspNetCore.Mvc;//引入命名空间 +using myproject.Models;// 引入项目的命名空间 + +namespace MyWebApiProject.Controllers +{ //标记控制器,启动模型验证,自动http400响应; + [ApiController] + [Route("api/[controller]")] + public class UserController : ControllerBase + { + private readonly DatabaseContext _context; + //DatabaseContext( Entity Framework Core 的数据库上下文类):数据库交换 + // _context:存储注入的数据库上下文实例 + public UserController(DatabaseContext context) + { + _context = context; + } + + [HttpGet]//http请求处理程序 + //IActionResult:接口,表示控制器操作的结果,处理http的核心响应 + // 用于视图渲染,重定向 + public IActionResult Get() + { //获取所有的用户 + + var users = _context.Users.ToList(); + return Ok(users);//返回响应 + } + + [HttpPost] + public IActionResult Post([FromBody] User user)//[FromBody] User user:从请求体中读取用户数据,并将其反序列化为 User 类的实例。 + { + _context.Users.Add(user);//_context.Users.Add(user):将新用户添加到数据库上下文中 + _context.SaveChanges();//_context.SaveChanges():保存更改到数据库。 + return CreatedAtAction(nameof(Get), new { id = user.Id }, user); + } + + [HttpPut("{id}")] + public IActionResult Put(int id, [FromBody] User user) + { + + var existingUser = _context.Users.Find(id); + if (existingUser == null) + { + return NotFound(); + } + existingUser.Name = user.Name; + existingUser.Email = user.Email; + _context.SaveChanges(); + return NoContent(); + } + + [HttpDelete("{id}")] + public IActionResult Delete(int id) + { + var user = _context.Users.Find(id); + if (user == null) + { + return NotFound(); + } + _context.Users.Remove(user); + _context.SaveChanges(); + return NoContent(); + } + } +} + +``` + +### 7. 生成初始数据 + +为了生成初始数据,你可以在 `Program.cs` 中添加一个方法来初始化数据库。在 `Program.cs` 文件中,添加以下代码: + +csharp + +复制 + +```csharp +using Microsoft.EntityFrameworkCore; +using myproject.Models; +// 构建创造器 args命令行参数 +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); +// 添加服务 +builder.Services.AddControllers(); +// 配置数据库上下文 +builder.Services.AddDbContext(options=>{ //addDbContext:注册数据库上下文服务。 + //GetConnectionString("DefaultConnection"):从配置文件中获取数据库连接字符串。 + var connectionString =builder.Configuration.GetConnectionString("DefaultConnection"); + //UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)):指定使用 MySQL 数据库,并自动检测 MySQL 服务器版本。 + options.UseMySql(connectionString,ServerVersion.AutoDetect(connectionString)); +}); +// 构建应用程序 +var app = builder.Build(); +// 初始化数据库 +using (var scope=app.Services.CreateScope()){ //app.Services.CreateScope()创建一个服务范围 + var services=scope.ServiceProvider; + try + { + var context=services.GetRequiredService();//获取DatabaseContext 实例。 + context.Database.EnsureCreated();//确保数据库存在,如果不存在则创建数据库。 + SeedData(context);//调用种子数据方法,初始化数据库中的数据 + } + catch (Exception ex) + { + + var logger=services.GetRequiredService>(); + logger.LogError(ex,"ssss"); + } +} + +// 配置HTTP请求管道 + +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Error"); +} +// 使用HTTPs重定向中间件 +app.UseHttpsRedirection(); +// 使用授权中间件 +app.UseAuthorization(); +// 映射控制器 +app.MapControllers(); + +app.Run(); +// 种子数据方法 +void SeedData(DatabaseContext context){ + if (!context.Users.Any()) + { + context.Users.AddRange( + new User{ Name="阿雪哥",Email="4444"}, + new User{ Name="阿雪哥",Email="4444"}, + new User{ Name="沈宇永",Email="4444"} + ); + context.SaveChanges(); + } +} + +``` \ No newline at end of file -- Gitee