天天看點

C# MinimalAPI 淺析

作者:步伐科技

C# MinimalAPI 是微軟推出的一種輕量級、簡潔而靈活的架構,用于建構 Web 應用程式。它的設計目标是提供一種簡單易用的方式來建立 HTTP 服務,同時減少樣闆代碼和備援配置。

下面是對 C# MinimalAPI 的詳細解釋:

  1. 簡潔易用:C# MinimalAPI 借鑒了其他流行的架構(如 Flask、Express),提供了一種簡單易懂的 API 設計,使開發者能夠快速上手并建構 Web 應用程式。
  2. 減少樣闆代碼:傳統的 ASP.NET 架構中,需要編寫大量的樣闆代碼來完成基本的路由配置、請求處理等功能。而在 C# MinimalAPI 中,通過使用屬性路由和簡化的文法結構,可以顯著減少備援的代碼。
  3. 輕量級:C# MinimalAPI 非常輕量級,隻需引用一個 NuGet 包即可開始開發。它不依賴于大型的 ASP.NET Core 架構,是以在記憶體消耗和啟動時間上都比較快。
  4. 內建性:盡管 C# MinimalAPI 是一個獨立的架構,但它仍然可以與其他 ASP.NET Core 元件和生态系統無縫內建。你可以在應用程式中使用依賴注入、中間件和其他标準的 ASP.NET Core 特性。
  5. 高度靈活:C# MinimalAPI 允許開發者自由選擇它們喜歡的方式來組織和建構應用程式。你可以按照自己的需求進行路由設定、請求處理和中間件配置,沒有過多的限制。
  6. 性能優化:C# MinimalAPI 在設計上注重性能,它對記憶體消耗進行了優化,并且在處理請求時采用了異步程式設計模型。這使得它能夠處理大量并發請求而不會對系統性能造成太大影響。

總之,C# MinimalAPI 是一個簡潔、輕量級、靈活且高性能的架構,可以幫助開發者快速建構和部署 Web 應用程式。它在簡化開發流程和提高性能方面有着顯著的優勢,是一個非常有潛力的架構選擇。

一、建立 MinimalAPI

  1. 安裝.NET 6.0 SDK:

首先,你需要安裝最新版本的.NET 6.0 SDK。你可以從Microsoft官方網站下載下傳并安裝它。

  1. 建立新項目:

打開指令行終端或者使用你喜歡的內建開發環境(IDE),建立一個新的C#控制台項目。在指令行中,你可以使用以下指令來建立項目:

dotnet new console -n MyMinimalApiApp
cd MyMinimalApiApp           
  1. 安裝Microsoft.AspNetCore.App 包:

在你的項目根目錄下,運作以下指令來安裝MinimalAPI所需的包:

dotnet add package Microsoft.AspNetCore.App --version 6.0.0-*           
  1. 編寫代碼:

使用你喜歡的文本編輯器或者IDE打開項目,并編輯Program.cs檔案。将檔案修改為以下内容:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;

var builder = WebApplication.CreateBuilder(args);

// 添加路由處理程式
builder.Services.AddRouting();
builder.MapGet("/", async context =>
{
    await context.Response.WriteAsync("Hello, Minimal API!");
});

var app = builder.Build();

// 啟動應用程式
app.Run();           
  1. 運作應用程式:

在指令行終端中,切換到項目根目錄并運作以下指令來啟動應用程式:

dotnet run           
  1. 測試應用程式:

打開Web浏覽器,并在位址欄輸入http://localhost:5000,你将看到輸出的Hello, Minimal API!。

二、 MinimalAPI 示例

MinimalAPI的示例,用于驗證使用者登入并發放Token。在此之前,請確定你已經安裝了适當的開發環境和準備好了所需的依賴項。

首先,建立一個新的C#項目,并在項目檔案中添加以下依賴項:

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.0-preview.5.*" />
  <PackageReference Include="Microsoft.AspNetCore.Builder" Version="6.0.0-preview.6.*" />
  <PackageReference Include="Microsoft.AspNetCore.Http" Version="6.0.0-preview.6.*" />
  <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0-preview.6.*" />
</ItemGroup>           

接下來,建立一個名為Program.cs的檔案,并将以下代碼添加到其中:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;

var builder = WebApplication.CreateBuilder(args);

const string TokenSecret = "your_secret_key";
const string TokenIssuer = "your_issuer";
const string TokenAudience = "your_audience";

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(TokenSecret)),
            ValidateIssuer = true,
            ValidIssuer = TokenIssuer,
            ValidateAudience = true,
            ValidAudience = TokenAudience,
            ValidateLifetime = true,
            ClockSkew = TimeSpan.Zero
        };

        options.Events = new JwtBearerEvents
        {
            OnTokenValidated = context =>
            {
                var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>();
                var userId = context.Principal.FindFirstValue("sub");
                
                // 根據userId驗證使用者是否存在
                
                if (userExists)
                {
                    context.Fail("Unauthorized");
                }

                return Task.CompletedTask;
            }
        };
    });

builder.Services.AddScoped<IUserService, UserService>();

builder.Services.AddAuthorization();

var app = builder.Build();

app.UseAuthentication();
app.UseAuthorization();

app.MapPost("/login", async context =>
{
    var username = context.Request.Form["username"];
    var password = context.Request.Form["password"];
    
    // 調用你的使用者驗證邏輯
    
    if (validUserCredentials)
    {
        var claims = new[]
        {
            new Claim("sub", userId) // 将使用者ID添加到Token的負載中
        };

        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(TokenSecret);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(claims),
            Expires = DateTime.UtcNow.AddDays(7),
            Issuer = TokenIssuer,
            Audience = TokenAudience,
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };

        var token = tokenHandler.CreateToken(tokenDescriptor);
        var tokenString = tokenHandler.WriteToken(token);

        await context.Response.WriteAsJsonAsync(new { token = tokenString });
    }
    else
    {
        context.Response.StatusCode = 401; // 驗證失敗
    }
});

app.Run();           

将上述代碼中的以下部分替換為你自己的值:

  • TokenSecret: 用于簽署和驗證Token的密鑰。
  • TokenIssuer: 發行者(issuer)辨別。
  • TokenAudience: 閱聽人(audience)辨別。

在示例代碼中,有一個名為IUserService的接口和一個實作類UserService,你需要根據自己的需求來實作并注冊該接口。

此示例建立了一個簡單的登入路由/login,用于接收使用者名和密碼,驗證使用者憑據,并在驗證通過後生成一個Token并傳回給用戶端。

請確定在生産環境中進行适當的安全性和錯誤處理措施,并對密鑰和其他敏感資訊進行适當的保護。

創作不易,如果您喜歡還請幫忙點贊關注,謝謝![作揖]

繼續閱讀