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() // 只讀查詢,提高性能