For Exago environments running earlier releases, see Setting up a State Server (.NET 4.8).
Redis Distributed Session Backend Configuration
This article covers Redis setup exclusively for Exago, which is used as the distributed session backend for both the UI and REST in this repository.
NuGet Package
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="10.0.0" />
Provider Values That Map to Redis
Session:Provider accepts either of these values (case-insensitive), both resolve to the same StackExchangeRedis implementation:
Redisredis
appsettings Configuration
UI (UI/appsettings*.json)
"Session": {
"Provider": "Redis",
"Redis": {
"Configuration": "localhost:6379,abortConnect=false",
"InstanceName": "Exago:Dev:"
}
} API (ExagoWebApi/appsettings*.json)
"Session": {
"Provider": "Redis",
"TimeoutHours": 24,
"KeyPrefix": "ExagoWebApi:Session:",
"Redis": {
"Configuration": "redis01:6379,password=secret,ssl=false",
"InstanceName": "Exago:Api:"
}
} Scheduler Queue Database Connection
The ExagoSchedulerQueue extension itself needs a SQL Server connection to store/read queued jobs, configured via appsettings.json, not the XML files.
Scheduler process (Scheduler/appsettings*.json)
"ConnectionStrings": {
"SchedulerDatabase": "Data Source=scheduler.db",
"SchedulerQueueDatabaseConnection": "Server=exagodb.example.com;Database=ExagoSchedulerQueue;User ID=dbadmin;Password=***;Trusted_Connection=False;TrustServerCertificate=True;"
},
"SchedulerQueue": {
"tnSchedulerJobs": "scheduler_jobs",
"tnSchedulerReports": "scheduler_reports",
"sqUpdateReports": true,
"sqMaxExecutionMinutes": 1440
} UI (UI/appsettings*.json) and API (ExagoWebApi/appsettings*.json)
The same two sections must also be present in the UI and API host processes, since the extension is loaded in-process wherever a report is scheduled/executed:
"ConnectionStrings": {
"SchedulerQueueDatabaseConnection": "Server=exagodb.example.com;Database=ExagoSchedulerQueue;User ID=dbadmin;Password=***;Trusted_Connection=False;TrustServerCertificate=True;"
},
"SchedulerQueue": {
"tnSchedulerJobs": "scheduler_jobs",
"tnSchedulerReports": "scheduler_reports",
"sqUpdateReports": true,
"sqMaxExecutionMinutes": 1440
} State Server Session Handling Changes
Classic StateServer does not exist in .NET 10.
Migration impact: If you are using a legacy StateServer, plan a Redis-backed replacement.
Configure the UI session middleware in UI/appsettings*.json and the REST sid store in ExagoWebApi/appsettings*.json, for example:
"Session": {
"IdleTimeoutMinutes": 30,
"Provider": "StateServer",
"Redis": {
"Configuration": "redis01:6379,password=secret,ssl=false",
"InstanceName": "Exago:UI:"
},
"SqlServer": {
"ConnectionStringName": "SessionState",
"SchemaName": "dbo",
"TableName": "ExagoUiSessions"
}
}Deployment Steps
Windows
-
Install IIS with required features:
Install-WindowsFeature -Name Web-Server, Web-WebServer, Web-Common-Http, Web-Default-Doc, Web-Dir-Browsing, Web-Http-Errors, Web-Static-Content, Web-Http-Redirect, Web-DAV-Publishing, Web-Health, Web-Http-Logging, Web-Performance, Web-Stat-Compression, Web-Security, Web-App-Dev, Web-AppInit, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Includes, Web-WebSockets, Web-Mgmt-Tools, Web-Mgmt-Console, Web-Mgmt-Compat, Web-Scripting-Tools, Web-Mgmt-Service -IncludeManagementTools
Unlock the Handlers section soweb.configcan use it:& "$env:windir\system32\inetsrv\appcmd.exe" unlock config -section:system.webServer/handlersUnlock the Modules section so
web.configcan use it:& "$env:windir\system32\inetsrv\appcmd.exe" unlock config -section:system.webServer/modules
- Download and install the ASP.NET Core hosting bundle:
-
dotnet/aspnetcore/Runtime/10.0.11(Windows runtime installer) -
dotnet/aspnetcore/Runtime/10.0.11hosting bundle (dotnet-hosting-10.0.11-win.exe)
-
- Install the URL Rewrite module (
rewrite_amd64_en...).
- Download the Exago install package from the build server (Jenkins job
MigrationExago-Net8Windows, latest build artifact underCompleteSetup).
- Grant
IIS_IUSRSfull permission on the Exago folder:icacls "c:\Program Files\Exago" /grant "IIS_IUSRS:(OI)(CI)F" /T
-
Create a "No Managed Code" application pool:
Import-Module IISAdministrationNew-IISAppPool -Name "exagonet10" -Attributes @{managedRuntimeVersion=""}Set-IISApplication -SiteName "Exago" -Attributes @{applicationPool="exagonet10"} -
Reboot the machine.
- Verify the site loads: http://localhost/Exago/Admin
Note: Some URLs in the source document were truncated (e.g. the certificate import steps and several download links). Confirm the full, current URLs with your build/release team before running this procedure.
Linux
mkdir -p /home/adminuser/opt
cd /home/adminuser/opt/
sudo apt update
sudo apt install -y nginx
sudo apt-get update && sudo apt-get install -y dotnet-runtime-10.0 aspnetcore-runtime-10.0
dotnet --list-runtimes
# Get the installer and copy it
tar -xvf ExagoInstaller.tgz > /dev/null
cd Installer/
sudo ./installExago.sh
# curl -I http://experiment/Exago/AdminFiles And Directories To Back Up Before Migrating
File / Directory |
Additional Details |
|---|---|
| The report database | |
WebReports.xml |
Now read from wwwroot/Config/ — see Configuration And Static File Location Changes |
| All Scheduler job-related XML files | |
| Any custom UI themes | Now placed under the wwwroot theme folder tree |
| The Scheduler working directory | Or any other custom directory the Scheduler deployment uses |
| Any custom images/CSS files | Need to be copied into the new wwwroot/images and wwwroot/css locations |
Any custom library (.dll) code used by the UI, API, or Scheduler |
Must be recompiled/migrated to target .NET 10 before it will load |
During installation, use separate, non-overwriting folders for the new deployment rather than installing directly on top of an existing install (this applies to both the web application and the Scheduler — see Scheduler Deployment And Upgrade). If a custom application/assembly is shared between the website and the Web API, confirm each app gets its own copy of the required files in its own directory rather than assuming a single shared copy is sufficient.
Platform And Software Requirements
Area |
Requirement |
|---|---|
| Databases | SQL Server (Microsoft.Data.SqlClient 6.0.2); PostgreSQL (Npgsql 8.0.9); SQLite (Microsoft.Data.Sqlite / EF Core 10.0.0); OData (Microsoft.Data.OData family 5.8.5); ODBC (System.Data.Odbc 9.0.6 — Redshift, Simba, etc.) |
| Cloud storage | AWS S3 (AWSSDK.Core / AWSSDK.S3 3.7.4xx); Azure Blob/Files (12.x) |
| Document export | iText 9.2.0 + itext.pdfhtml 6.2.0 (PDF, replaces iTextSharp 5); SixLabors.ImageSharp 3.1.11 + SixLabors.Fonts 2.0.3; Syncfusion.DocIO/XlsIO 30.1.37 (Word/Excel) |
| Rendering | SkiaSharp 3.119.0 (UI); PuppeteerSharp 1.12.0 (headless Chromium chart/widget rasterization); Ghostscript.NET / Ronz.GSDLL (test-only PDF rasterization checks) |
| Formula engine / scripting | NCalcSync 3.0.0; Roslyn (Microsoft.CodeAnalysis.CSharp 4.8.0) for custom code compilation; NodaTime 3.2.2 |
| Messaging | MailKit / MimeKit 4.16.0 |
| RPC | Grpc.AspNetCore / Grpc.Net.Client / Grpc.Tools 2.59.0 + Google.Protobuf 3.25.1 (scheduler ↔ core channel) |
| Security / auth | Portable.BouncyCastle 1.9.0; System.Security.Cryptography.Xml 10.0.8 |
| Shared / cross-cutting | Newtonsoft.Json 13.0.4; log4net 3.3.1 |
| Frontend | TypeScript 4.0.3; Preact 10.4.8; Terser 5.46.0; LESS 3.8.1; ESLint + @typescript-eslint/*; htm 3.1.1; astr 1.2.4 |
| Redis | 10.0.0 |