天天看点

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并返回给客户端。

请确保在生产环境中进行适当的安全性和错误处理措施,并对密钥和其他敏感信息进行适当的保护。

创作不易,如果您喜欢还请帮忙点赞关注,谢谢![作揖]

继续阅读