WebApi.Library 1.1.5.1

dotnet add package WebApi.Library --version 1.1.5.1                
NuGet\Install-Package WebApi.Library -Version 1.1.5.1                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="WebApi.Library" Version="1.1.5.1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add WebApi.Library --version 1.1.5.1                
#r "nuget: WebApi.Library, 1.1.5.1"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install WebApi.Library as a Cake Addin
#addin nuget:?package=WebApi.Library&version=1.1.5.1

// Install WebApi.Library as a Cake Tool
#tool nuget:?package=WebApi.Library&version=1.1.5.1                

WebApi.Library

这个库是一个大杂烩,包含了很多第三方库的二次封装。 以后会逐步分离精简方便维护升级。

核心使用Redis做缓存,Jwt做身份验证,默认用MySql数据库,对象存储OSS(参考:阿里OSS)作为资源存储。

默认支持Swagger

配置

在项目根目录的appsettings.json写入默认配置, 可以在appsettings.Development.jsonappsettings.Production.json或者appsettings.{EnvironmentName}.json等文件中写入对应环境(DevelopmentTestProduction)用的配置信息。这个看情况自定。注意:这些文件不需要纳入版本控制。

依赖注入

实现IAutoLoadConfigurations的配置信息数据类会自动配置到依赖注入容器中。可以用特性AutoLoadConfigurationsAttribute指定配置子节名称, 默认是用配置类的短名称(就是类名,不带命名空间的)。

[AutoLoadConfigurations("Jwt")]
public class JwtSettings : IAutoLoadConfigurations {
    public string Secret { get; set; }
}

实现IAutoRegisterRepository接口的类会自动注册(Scoped)到依赖注入容器中。

实现IAutoRegisterSingleton接口的类会自动注册(Singleton)到依赖注入容器中。

入口

WebApplication.Start()方法会自动配置WebApi,并且自动注册依赖注入容器中的配置信息、仓储、单例。

public class Program {
    public static void Main(string[] args) {
        WebApplication.Start( 
            args: args,
            setupStartOptions: options => { 
                // 禁用自动注册依赖注入,默认是开启的
                options.AutoRegisterServices = false;
                // ...
            },
            setupService: (services, configuration, env) => {
                // 具体的一些配置信息、服务等依赖注入
                services.SetupSwagger("网址名称", "v1", "WebApi.xml", true);
                services.ConfigElmah(env, options => options.Path = "el/mah");
                // ...
            },
            setupApp: app => {
                // 这里一般用来启动一些后台进程
            }
        );
    }
}

模块说明

身份验证

使用Jwt做身份验证,使用Redis做缓存。

TokenPayload中包含了用户的UserIdUserNameRolesUserTypeExpire(过期时间,时间比较短,有自动刷新机制)。

Token有5分钟的缓冲时间,过期不超过5分钟时使用(调用API)会自动刷新Token(也就是自动续期)。 通过在header中的newToken写入新的Token,客户端要自己更新本地的Token

Token完全过期以后,可以通过refreshToken刷新得到新的Token,可以避免客户端重复登陆(使用密码)。

会先后从headerAuthorization="Bearer {JWT_TOKEN}")和query?token={JWT_TOKEN})中获取token并进行校验。

默认设置了两个PolicyBackendSystemUser

public class TestController : ControllerBase {
    /// <summary>
    /// 测试后台管理权限
    /// </summary>
    [HtttGet]
    [Authorize(Policy = CommonConsts.Policy.Backend)]
    public IActionResult TestBackend() {
        return Ok();
    }

    /// <summary>
    /// 系统内部调用
    /// </summary>
    [HtttGet]
    [Authorize(Policy = CommonConsts.Policy.System)]
    public IActionResult TestSysApi() {
        return Ok();
    }

    /// <summary>
    /// 登陆用户
    /// </summary>
    [HtttGet]
    [Authorize()]
    public IActionResult TestUser() {
        return Ok();
    }

    /// <summary>
    /// VIP用户可访问
    /// </summary>
    [HtttGet]
    [Authorize(Roles = "VIP")]
    public IActionResult TestVipUser() {
        return Ok();
    }
}
Backend

这个是用来识别请求是否有后台管理权限, 查找context.User.FindFirstValue("userType")获得用户类型(CommonConsts.UserType),如果是CommonConsts.UserType.Backend则通过验证。

SystemUser

这个是用来识别请求是否来自内部(微服务之间,或者API自己)调用。

按资源(控制器/方法)设置权限

暂时没有设置

健康检查

开启健康检查,可以在/healthz/alive查看健康状态,/healthz/ready查看就绪状态。

services.SetupHealthCheck((healthCheck) => {
    //DbContext 检查
    healthCheck.AddDbContextCheck<MyDbContext>(
        "Db",
        tags: new[] { "ready", "alive" },
        customTestQuery: async (db, ct) => await db.Users.AnyAsync(cancellationToken: ct));
    //Redis 检查
    healthCheck.AddRedisCheck();
});

错误日志 ElmahCore

使用ElmahCore记录错误日志,默认可以在/elmah查看错误日志。

// 开启错误日志
// 在非生产环境(env.IsProduction() == false)中直接可以通过:/el/mah 查看错误日志
// 在生产环境(env.IsProduction() == true)中需要通过JWT认证(使用/el/mah?token={JWT_TOKEN})
services.ConfigElmah(env, 
                     options => {
                         options.Path = "el/mah";
                     });

Ip地址库

驱动:IPTools,数据源:ip2region

services.SetupIpTools(Path.Combine(env.ContentRootPath, "Assets", "ip2region.db"), useMemoryCache: true);

依赖库

  • JWT
  • Redis xBei.Redis.Extension

SDK

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.1.5.1 79 12/30/2024