T91.Server.App
1.0.62
dotnet add package T91.Server.App --version 1.0.62
NuGet\Install-Package T91.Server.App -Version 1.0.62
<PackageReference Include="T91.Server.App" Version="1.0.62" />
<PackageVersion Include="T91.Server.App" Version="1.0.62" />
<PackageReference Include="T91.Server.App" />
paket add T91.Server.App --version 1.0.62
#r "nuget: T91.Server.App, 1.0.62"
#:package T91.Server.App@1.0.62
#addin nuget:?package=T91.Server.App&version=1.0.62
#tool nuget:?package=T91.Server.App&version=1.0.62
T91.Server.App
OIDC/JWT auth, Swagger, CORS, RabbitMQ, Kafka, REST client, and scope infrastructure for T91 .NET 10 microservices.
Full documentation: GitHub README
Installation
dotnet add package T91.Server.App
Registration
builder.RegisterCurrentScope() // BaseCurrentScope → HttpCurrentScope (scoped)
.RegisterOIDC() // Keycloak-compatible JwtBearer
.RegisterSwagger()
.AddCorsPolicy()
.RegisterKafka() // IKafkaConnectionRegistry, IKafkaPublisher
.RegisterRmq() // IRmqConnectionRegistry, IRmqPublisher
.RegisterDateTimeConversion() // IDateTimeZoneConverter
.RegisterCache(); // ICacheService (Redis → Postgres → Null)
builder.Services.AddKafkaConsumer<MyKafkaConsumer>();
builder.Services.AddRmqConsumer<MyRmqConsumer>();
Current Scope
BaseCurrentScope / HttpCurrentScope implement ICurrentScope and ISettableCurrentScope. HTTP requests read context from headers (X-TenantId, X-UserId, X-UserName, Authorization, X-Timezone). Message broker consumers populate it from message headers via ISettableCurrentScope.SetX(...).
Kafka
IKafkaPublisher.PublishAsync(config, payload, key?, context?, ct)— propagatesICurrentScopeas message headers automatically.BaseKafkaConsumer<T>— abstractBackgroundServicewith outer reconnect loop, in-memory retry, and DLQ forwarding to{topic}.dlq.HandleAsyncreceives a fresh DI scope with tenant context pre-populated.- Pass
context: services.GetRequiredService<ICurrentScope>()when publishing from inside a consumer to forward tenant headers.
RabbitMQ
IRmqPublisher.PublishAsync(endpoint, payload, context?, ct)— propagatesICurrentScopeas AMQP headers.BaseRmqConsumer<T>— abstractBackgroundServicewith reconnect loop, per-message retry via republish, and dead-letter exchange ({queue}.dead.exchange).
REST Client (BaseRestAPI)
Extend BaseRestAPI<TCurrentScope> for typed inter-service HTTP clients. PrepareHeadersAsync auto-forwards X-TenantId, X-UserId, X-UserName, and Authorization on every request. All instances share a single connection pool via a static SocketsHttpHandler.
Config Sections
| Key | Binds to |
|---|---|
OIDC |
OIDCConfig |
RMQ:Connections |
Dictionary<string, string> (name → AMQP URL) |
Kafka:Connections |
Dictionary<string, KafkaConfigure> |
Cache |
CacheConfig |
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Confluent.Kafka (>= 2.14.0)
- Microsoft.AspNetCore.Authentication.JwtBearer (>= 10.0.0)
- Microsoft.AspNetCore.Authentication.OpenIdConnect (>= 10.0.0)
- Microsoft.Extensions.Caching.StackExchangeRedis (>= 10.0.0)
- RabbitMQ.Client (>= 7.2.1)
- RestSharp (>= 112.0.0)
- Swashbuckle.AspNetCore (>= 7.2.0)
- T91.Server.Domain (>= 1.0.62)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on T91.Server.App:
| Package | Downloads |
|---|---|
|
T91.Server.DB
Database library for T91 |
GitHub repositories
This package is not used by any popular GitHub repositories.