CShells.AspNetCore
0.0.11
dotnet add package CShells.AspNetCore --version 0.0.11
NuGet\Install-Package CShells.AspNetCore -Version 0.0.11
<PackageReference Include="CShells.AspNetCore" Version="0.0.11" />
<PackageVersion Include="CShells.AspNetCore" Version="0.0.11" />
<PackageReference Include="CShells.AspNetCore" />
paket add CShells.AspNetCore --version 0.0.11
#r "nuget: CShells.AspNetCore, 0.0.11"
#:package CShells.AspNetCore@0.0.11
#addin nuget:?package=CShells.AspNetCore&version=0.0.11
#tool nuget:?package=CShells.AspNetCore&version=0.0.11
CShells.AspNetCore
ASP.NET Core integration for CShells providing middleware and shell resolution based on HTTP context.
Purpose
This package provides ASP.NET Core middleware, shell resolution strategies, and extensions for building multi-tenant web applications with CShells.
Key Features
- HTTP middleware for shell resolution - Automatic per-request tenant/shell detection
- Host-based tenant resolution - Route requests based on hostname
- Path-based tenant resolution - Route requests based on URL path prefix
MapShells()extension - Automatically register endpoints from all shell features- Web routing configuration - Configure path prefixes and routing options per shell
- Custom shell resolvers - Extensibility for custom resolution strategies
Installation
dotnet add package CShells
dotnet add package CShells.AspNetCore
Quick Start
1. Create a Web Feature
using CShells.AspNetCore.Features;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
[ShellFeature("Weather", DisplayName = "Weather API")]
public class WeatherFeature : IWebShellFeature
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IWeatherService, WeatherService>();
}
public void MapEndpoints(IEndpointRouteBuilder endpoints, IHostEnvironment? environment)
{
endpoints.MapGet("weather", (IWeatherService weatherService) =>
weatherService.GetForecast());
}
}
2. Configure Shells with Web Routing
{
"CShells": {
"Shells": [
{
"Name": "Default",
"Features": ["Weather"],
"Configuration": {
"WebRouting": {
"Path": ""
}
}
},
{
"Name": "Admin",
"Features": ["Admin"],
"Configuration": {
"WebRouting": {
"Path": "admin",
"RoutePrefix": "api/v1"
}
}
}
]
}
}
3. Register CShells in Program.cs
Simple setup:
var builder = WebApplication.CreateBuilder(args);
// Register CShells from configuration
builder.AddShells();
var app = builder.Build();
// Configure middleware and endpoints for all shells
app.MapShells();
app.Run();
Advanced setup with custom resolvers:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCShellsAspNetCore(cshells =>
{
cshells.WithConfigurationProvider(builder.Configuration);
cshells.WithWebRoutingResolver(options =>
{
options.ExcludePaths = new[] { "/api", "/health" };
options.HeaderName = "X-Tenant-Id";
});
});
var app = builder.Build();
app.MapShells();
app.Run();
Shell Resolution Strategies
Path-Based Resolution
Shells are resolved based on the URL path prefix:
{
"Configuration": {
"WebRouting": {
"Path": "admin"
}
}
}
Requests to /admin/* will be routed to this shell.
Host-Based Resolution
Configure shells to respond to specific hostnames:
{
"Configuration": {
"WebRouting": {
"Host": "admin.example.com"
}
}
}
Route Prefix
Apply a route prefix to all endpoints in a shell:
{
"Configuration": {
"WebRouting": {
"Path": "tenant1",
"RoutePrefix": "api/v1"
}
}
}
With this configuration, an endpoint mapped at weather will be accessible at /tenant1/api/v1/weather.
Custom Resolution
Implement IShellResolver for custom resolution logic:
public class CustomShellResolver : IShellResolver
{
public Task<string?> ResolveShellIdAsync(HttpContext context)
{
// Custom logic to determine shell ID from HTTP context
var shellId = context.Request.Headers["X-Tenant-Id"].FirstOrDefault();
return Task.FromResult(shellId);
}
}
builder.Services.AddCShellsAspNetCore(cshells =>
{
cshells.WithResolver<CustomShellResolver>();
});
Web Routing Options
Configure routing behavior:
builder.Services.AddCShellsAspNetCore(cshells =>
{
cshells.WithWebRoutingResolver(options =>
{
// Exclude paths from shell resolution
options.ExcludePaths = new[] { "/api", "/health", "/swagger" };
// Use custom header for tenant ID
options.HeaderName = "X-Tenant-Id";
// Configure default shell
options.DefaultShell = "Default";
});
});
Learn More
- Main Documentation
- Sample Application
- CShells Package - Core runtime
| Product | Versions 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 is compatible. 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. 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
- CShells (>= 0.0.11)
- CShells.AspNetCore.Abstractions (>= 0.0.11)
- JetBrains.Annotations (>= 2025.2.4)
-
net8.0
- CShells (>= 0.0.11)
- CShells.AspNetCore.Abstractions (>= 0.0.11)
- JetBrains.Annotations (>= 2025.2.4)
-
net9.0
- CShells (>= 0.0.11)
- CShells.AspNetCore.Abstractions (>= 0.0.11)
- JetBrains.Annotations (>= 2025.2.4)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on CShells.AspNetCore:
| Package | Downloads |
|---|---|
|
CShells.FastEndpoints
FastEndpoints integration for CShells. Provides a shell feature that automatically discovers and registers FastEndpoints from all enabled features. Reference this package in your host application to enable FastEndpoints support. |
|
|
CShells.AspNetCore.Testing
Testing helpers for CShells ASP.NET Core integration. Provides utilities for integration tests, including shell initialization waiter for ensuring shells are fully loaded before test execution. |
GitHub repositories
This package is not used by any popular GitHub repositories.