π§± Architecture (Windows)
Browser
β
Pulse.Web (ASP.NET / Blazor / Razor)
β HTTP(S)
Pulse.API (ASP.NET Core)
β EF Core
MySQL Server
You can run this with IIS or standalone using Kestrel. Iβll show both, but IIS is the most βWindows-nativeβ.
1οΈβ£ Prerequisites (Install First)
β Windows Requirements
- Windows 10 / 11 / Server 2019 / 2022
- Admin access
β .NET Runtime (REQUIRED)
Pulse does not need the SDK in production β only the runtime.
Install:
- .NET 8 or 9 ASP.NET Core Hosting Bundle
π https://dotnet.microsoft.com/download
This installs:
- ASP.NET runtime
- IIS integration
dotnet.exeruntime
Verify:
dotnet --list-runtimes
2οΈβ£ Install MySQL Server (Windows)



Step 1: Download
π https://dev.mysql.com/downloads/installer/
Choose:
- MySQL Installer (Community)
Step 2: Install Options
Select:
- MySQL Server
- MySQL Workbench
- MySQL Shell (optional)
Step 3: Configuration
- Auth method: Use Legacy Authentication (recommended for EF Core)
- Port:
3306 - Root password: SAVE THIS
- Service Name:
MySQL80 - Startup: Automatic
Verify:
services.msc
Confirm MySQL80 is running.
3οΈβ£ Create Pulse Database
Open MySQL Workbench β connect as root.
CREATE DATABASE pulse
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CREATE USER 'pulse'@'localhost'
IDENTIFIED BY 'StrongPasswordHere';
GRANT ALL PRIVILEGES ON pulse.* TO 'pulse'@'localhost';
FLUSH PRIVILEGES;
4οΈβ£ Pulse.API Setup (Windows)
π Recommended Folder
C:\Pulse\
βββ api\
β βββ pulse.Api.dll
βββ web\
βββ logs\
π§ appsettings.json (Pulse.API)
{
"ConnectionStrings": {
"PulseDb": "Server=localhost;Port=3306;Database=pulse;User=pulse;Password=StrongPasswordHere;"
},
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5001"
}
}
}
}
βΆ Test API (Manual)
cd C:\Pulse\api
dotnet pulse.Api.dll
Test:
http://localhost:5001/health
5οΈβ£ Apply Database Migrations (IMPORTANT)
Pulse must create tables before running fully.
If migrations are embedded (recommended):
dotnet pulse.Api.dll --migrate
Or if you ship EF tools internally:
dotnet ef database update
Verify tables exist in MySQL Workbench.
6οΈβ£ Pulse.Web Setup
π§ appsettings.json (Pulse.Web)
{
"PulseApi": {
"BaseUrl": "http://localhost:5001"
}
}
βΆ Test Web
cd C:\Pulse\web
dotnet pulse.Web.dll
Browse:
http://localhost:5000
7οΈβ£ IIS Deployment (Recommended)



Step 1: Enable IIS
optionalfeatures.exe
Enable:
- IIS
- ASP.NET 4.8
- .NET Extensibility
- HTTP Redirect
Step 2: Application Pools
Create two pools:
Pulse.APIPulse.Web
Settings:
- .NET CLR: No Managed Code
- Identity: ApplicationPoolIdentity
Step 3: IIS Sites
Pulse.API
- Path:
C:\Pulse\api - Port:
5001 - App Pool:
Pulse.API
Pulse.Web
- Path:
C:\Pulse\web - Port:
80 - App Pool:
Pulse.Web
web.config (Auto-Generated)
Make sure this exists in both folders:
<aspNetCore processPath="dotnet"
arguments="pulse.Api.dll"
hostingModel="InProcess" />
8οΈβ£ Firewall Rules
New-NetFirewallRule -DisplayName "Pulse Web" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
New-NetFirewallRule -DisplayName "Pulse API" -Direction Inbound -Protocol TCP -LocalPort 5001 -Action Allow
9οΈβ£ Windows Services (Optional but Pro)
Instead of IIS, you can run both as Windows Services:
sc create PulseAPI binPath= "dotnet C:\Pulse\api\pulse.Api.dll"
sc create PulseWeb binPath= "dotnet C:\Pulse\web\pulse.Web.dll"
Then:
sc start PulseAPI
sc start PulseWeb
π Common Gotchas (Important)
β
MySQL uses utf8mb4
β
Use Legacy Authentication
β
AddDbContext must use UseMySql()
β
Migrations must run once
β
API must start before Web
β
IIS App Pool = No Managed Code
π Recommended Production Ports
| Component | Port |
|---|---|
| Pulse.Web | 80 / 443 |
| Pulse.API | 5001 (internal) |
| MySQL | 3306 (local only) |
π Final Result
- Pulse.Web β IIS β Browser
- Pulse.API β IIS/Kestrel
- MySQL β Windows Service
- Clean, stable, Windows-native setup