跳到主要内容

IGeekFan.FreeKit.Web

ASP.NET Core Web 应用构建块,提供一站式启动配置、认证授权、Swagger、缓存等能力。

功能概览

功能说明
服务注册一站式服务注册扩展
应用构建WebApplicationBuilder 配置扩展
模块注册IModuleStartup 模块化启动
Autofac自动 DI 容器注册
SwaggerAPI 文档与枚举过滤器

快速开始

最小启动

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddFreeKitWeb();

var app = builder.Build();
app.UseFreeKitWeb();
app.Run();

完整启动

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddFreeKitWebFull();

var app = builder.Build();
app.UseFreeKitWebFull();
app.Run();

一站式启动(推荐)

var builder = WebApplication.CreateBuilder(args);

// 一行代码完成所有配置
builder.UseFreeKit(
moduleTypes: new Dictionary<string, Type>
{
["identity"] = typeof(IdentityModuleStartup),
["cms"] = typeof(CmsKitModuleStartup),
["plat"] = typeof(PlatformModuleStartup)
}
);

var app = builder.Build();
app.UseFreeKitWeb();
app.Run();

服务注册

UseFreeKit

一站式配置入口,自动完成:

功能说明
Autofac依赖注入容器
Serilog日志框架
模块注册IModuleStartup 自动扫描
Kestrel大请求体支持

AddFreeKitHost

builder.Services.AddFreeKitHost(builder.Configuration);

自动注册:

  • AddFreeKitCore() — 核心服务
  • AddFreeKitService() — 业务服务
  • AddFreeKitOptional() — 可选服务
  • AddFreeKitThirdParty() — 第三方集成

AddFreeKitComplete

builder.Services.AddFreeKitComplete(configuration, options =>
{
options.UseFreeSql = true;
options.UseRedis = true;
options.UseSwagger = true;
options.UseAuth = true;
options.UseCap = true;
options.UseMediatR = true;
});

AddFreeKitService

条件注册以下服务:

服务条件说明
FreeSqlUseFreeSql = trueORM
Redis + 缓存UseRedis = true分布式缓存
JWT 认证UseAuth = true认证授权
MVC + SwaggerUseSwagger = trueAPI 文档
IP2RegionUseSwagger = trueIP 地理定位
IP 限流UseSwagger = true请求限流
健康检查UseSwagger = true健康端点
本地化UseLocalization = true多语言
CAPUseCap = true分布式事件
MediatRUseMediatR = true中介者模式

AddFreeKitOptional

可选服务:

服务说明
gRPCgRPC 服务支持
Encryption加密中间件

AddFreeKitThirdParty

第三方集成:

服务说明
飞书 SDK飞书 API 集成
WebSocket飞书 WebSocket

认证授权

认证模式

public enum AuthMode
{
Jwt = 0, // JWT 自签发
OpenIddict = 1 // OpenIddict 验证(SSO)
}

配置:

{
"Security": {
"AuthMode": 0
}
}

JWT 配置

{
"JwtSettings": {
"Issuer": "https://localhost:5001",
"Audience": "https://localhost:5001",
"SecretKey": "your-secret-key-min-32-chars",
"ExpireMinutes": 60
}
}

CookieJwtBearerHandler

支持三种 Token 来源:

  1. Query string (?access_token=...) — SignalR Hub
  2. Authorization header — 标准 JWT
  3. Cookie (access_token cookie)

第三方 OAuth

提供商配置键启用
GitHubSecurity:GitHub:Enabletrue
QQSecurity:QQ:Enablefalse
GiteeSecurity:Gitee:Enablefalse
微信Security:Weixin:Enablefalse
GoogleSecurity:Google:Enablefalse
MicrosoftSecurity:Microsoft:Enablefalse
KitSSOSecurity:KitSSO:Enablefalse

配置示例:

{
"Security": {
"GitHub": {
"Enable": true,
"ClientId": "your-client-id",
"ClientSecret": "your-client-secret"
}
}
}

授权策略

// 配置授权策略
services.AddAuthorization(options =>
{
options.AddPolicy("Bearer", policy =>
{
policy.RequireAuthenticatedUser();
policy.Requirements.Add(new ValidTokenRequirement());
});
options.DefaultPolicy = options.GetPolicy("Bearer");
});

Swagger

服务注册

services.AddSwagger(configuration, new List<string> { "Identity", "Platform", "CmsKit" });

Swagger 文档

文档说明
v1默认 API
identity身份认证
plat工具平台
cms内容管理
cms-admin内容管理后台
im即时通讯
mall-admin电商管理

JWT Bearer 配置

options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT authorization",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey
});

枚举 Schema 过滤器

自动将枚举的 [Description] 属性添加到 Swagger 文档:

public enum ArticleStatus
{
[Description("草稿")]
Draft = 0,

[Description("已发布")]
Published = 1
}

Swagger UI 配置

app.UseSwaggerUI(c =>
{
c.RoutePrefix = "swagger";
c.ConfigObject.DisplayOperationId = true;
c.SwaggerEndpoint($"{vPath}/swagger/v1/swagger.json", "v1");
c.SwaggerEndpoint($"{vPath}/swagger/identity/swagger.json", "identity");
c.SwaggerEndpoint($"{vPath}/swagger/plat/swagger.json", "plat");
c.SwaggerEndpoint($"{vPath}/swagger/cms/swagger.json", "cms");
});

RapiDoc UI 配置

app.UseRapiDocUI(c =>
{
c.RoutePrefix = "r";
c.GenericRapiConfig = new GenericRapiConfig
{
RenderStyle = "read",
Theme = "light",
ShowMethodInNavBar = "as-colored-text"
};
});

缓存系统

两种缓存策略

策略说明
CacheStrategyType.Redis基于 FreeRedis
CacheStrategyType.Memory基于 ConcurrentDictionary

注册缓存

services.AddCacheStrategy(CacheStrategyType.Redis);

AOP 缓存

通过 Cacheable 特性实现方法级缓存:

[Cacheable(CacheKey = "article:{id}", ExpireSeconds = 300)]
public async Task<Article> GetByIdAsync(Guid id)
{
return await _repository.FindAsync(id);
}

缓存壳

public async Task<Article> GetByIdAsync(Guid id)
{
return await _cache.CacheShell(
$"article:{id}",
async () => await _repository.FindAsync(id),
expireSeconds: 300
);
}

中间件管道

完整中间件顺序

app.UsePathBase(new PathString(vPath));
app.UseCors("CorsPolicy");
app.UseStaticFiles(new StaticFileOptions
{
ContentTypeProvider = provider
});
app.UseDeveloperExceptionPage();
app.UseHttpsRedirection();
app.UseForwardedHeaders();
app.UseSerilogRequestLogging();
app.UseSwagger();
app.UseSwaggerUI();
app.UseRapiDocUI();
app.UseRequestLocalization();
app.UseAuthentication();
app.UseFreeSchedulerUI("job");
app.UseMiddleware<EncryptionMiddleware>();
app.UseCurrentUserAccessor();
app.UseCookiePolicy(new CookiePolicyOptions
{
MinimumSameSitePolicy = SameSiteMode.Lax
});
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapGrpcService<AccessKeyService>();
endpoints.MapHub<OnlineUserHub>("/hubs/onlineuser");
endpoints.MapHealthChecks("/health");
});

中间件说明

中间件说明
UseCors跨域策略
UseStaticFiles静态文件
UseDeveloperExceptionPage开发者异常页
UseHttpsRedirectionHTTPS 重定向
UseForwardedHeaders转发头处理
UseSerilogRequestLogging请求日志
UseSwaggerSwagger UI
UseRapiDocUIRapiDoc UI
UseRequestLocalization本地化
UseAuthentication认证
UseFreeSchedulerUI任务调度 UI
EncryptionMiddleware响应加密
UseCurrentUserAccessor当前用户
UseCookiePolicyCookie 策略
UseRouting路由
UseAuthorization授权

端点配置

MVC 控制器

endpoints.MapControllers();

gRPC 服务

endpoints.MapGrpcService<AccessKeyService>();

SignalR Hub

endpoints.MapHub<OnlineUserHub>("/hubs/onlineuser");

健康检查

endpoints.MapHealthChecks("/health", new HealthCheckOptions
{
Predicate = s => true,
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

模块端点

// 自动执行所有模块的 Configure 方法
app.ConfigureModules();

其他功能

IP 地理定位

services.AddIP2Region();

// 使用
public class LocationService
{
private readonly Searcher _searcher;

public string GetLocation(string ip)
{
return _searcher.Btree(ip);
}
}

FreeSql 配置

services.AddDefaultFreeSql(configuration);

自动配置:

  • 全局过滤器(ISoftDeleteITenant
  • AOP 审计(GUID、敏感词过滤)
  • SQL 日志
  • JSON 映射

Redis 客户端

services.AddRedisClient(configuration);

注册:

  • RedisClient 单例
  • IDistributedCache

CAP 分布式事件

services.AddCap(options =>
{
options.UseMySql(configuration.GetConnectionString("Default"));
options.UseRabbitMQ();
});

MediatR 中介者

services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssemblies(assemblies);
});

相关文档