C# 开发中的 Token 详解
- C# 开发中的 Token 详解与示例
-
- 1. CancellationToken - 异步取消令牌
-
- 示例 1:基础取消机制
- 示例 2:Web API 中的请求取消
- 2. JWT Token - 身份验证令牌
-
- 示例 1:JWT Token 生成与验证
- 示例 2:ASP.NET Core JWT 认证配置
- 3. Access Token - API 访问令牌
-
- 示例:使用 Access Token 调用第三方 API
- 4. 令牌最佳实践总结
在 C# 开发中,Token 是一个非常重要的概念,它代表一种凭证、信号或权限标识。让我详细解释各种类型的 Token 及其应用。
C# 开发中的 Token 详解与示例
1. CancellationToken - 异步取消令牌
示例 1:基础取消机制
using System;
using System.Threading;
using System.Threading.Tasks;public class CancellationTokenExample
{public static async Task Main(){// 创建取消令牌源 - 这是取消信号的"发生器"var cancellationTokenSource = new CancellationTokenSource();// 从源获取令牌 - 这是取消信号的"接收器"CancellationToken cancellationToken = cancellationTokenSource.Token;Console.WriteLine("开始长时间运行任务...");// 启动异步任务并传递取消令牌var longRunningTask = LongRunningOperationAsync(cancellationToken);// 等待3秒后取消操作await Task.Delay(3000);Console.WriteLine("发送取消信号...");// 触发取消 - 所有使用此token的地方都会收到信号cancellationTokenSource.Cancel();try{// 等待任务完成(会因为取消而抛出异常)await longRunningTask;}catch (OperationCanceledException){Console.WriteLine("任务已被成功取消");}}/// <summary>/// 模拟长时间运行的可取消操作/// </summary>/// <param name="cancellationToken">取消令牌,用于接收取消信号</param>public static async Task LongRunningOperationAsync(CancellationToken cancellationToken){for (int i = 0; i < 10; i++){// 检查是否收到取消信号,如果收到则抛出OperationCanceledExceptioncancellationToken.ThrowIfCancellationRequested();Console.WriteLine($"正在处理第 {i + 1} 项工作...");try{// 模拟工作延迟,并传递取消令牌以便延迟操作也能被取消await Task.Delay(1000, cancellationToken);}catch (TaskCanceledException){Console.WriteLine("延迟操作被取消");throw; // 重新抛出异常}}Console.WriteLine("所有工作完成");}
}
示例 2:Web API 中的请求取消
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Threading;[ApiController]
[Route("api/[controller]")]
public class DataController : ControllerBase
{private readonly ApplicationDbContext _context;public DataController(ApplicationDbContext context){_context = context; // 依赖注入数据库上下文}/// <summary>/// 获取大型数据集,支持客户端请求取消/// </summary>/// <param name="cancellationToken">/// ASP.NET Core 自动注入的取消令牌/// 当客户端断开连接时自动触发取消/// </param>[HttpGet("large-data")]public async Task<IActionResult> GetLargeData(CancellationToken cancellationToken){try{// 传递取消令牌到EF Core查询,确保查询可以被取消var largeData = await _context.LargeDataSet.AsNoTracking() // 只读查询,提高性能