Add WebAPI middleware for multi-instance Roslyn Bridge routing
Add RoslynBridge.WebApi - ASP.NET Core 8.0 middleware that: - Provides a centralized REST API for accessing multiple VS instances - Manages instance registry with discovery by port, solution, or PID - Proxies requests to the appropriate VS instance - Tracks request/response history for debugging - Auto-cleanup of stale instances via background service Features: - Health endpoints: /api/health, /api/health/ping - Roslyn endpoints: /api/roslyn/projects, /api/roslyn/diagnostics, etc. - Instance management: /api/instances (register, heartbeat, unregister) - History tracking: /api/history, /api/history/stats - Swagger UI at root (/) for API documentation - CORS enabled for web applications Services: - InstanceRegistryService: Thread-safe registry of VS instances - HistoryService: In-memory request/response history (max 1000 entries) - InstanceCleanupService: Background service to remove stale instances - RoslynBridgeClient: HTTP client for proxying to VS instances Update RoslynBridge.sln to include RoslynBridge.WebApi project. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
351
RoslynBridge.WebApi/SERVICE_SETUP.md
Normal file
351
RoslynBridge.WebApi/SERVICE_SETUP.md
Normal file
@@ -0,0 +1,351 @@
|
||||
# Roslyn Bridge Web API - Windows Service Setup
|
||||
|
||||
This guide explains how to install and run the Roslyn Bridge Web API as a Windows Service for always-on operation.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- **Administrator privileges** required for service installation
|
||||
- **.NET 8.0 Runtime** or SDK installed
|
||||
- **Visual Studio** with Roslyn Bridge extension must be running (the VS plugin on port 59123 is required)
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Option 1: Automated Installation (Recommended)
|
||||
|
||||
Open PowerShell **as Administrator** and run:
|
||||
|
||||
```powershell
|
||||
# Navigate to the project directory
|
||||
cd C:\Path\To\RoslynBridge.WebApi
|
||||
|
||||
# Complete installation (build, publish, install service, and start)
|
||||
.\install.ps1 -InstallService -StartService
|
||||
```
|
||||
|
||||
This single command will:
|
||||
1. Check prerequisites (.NET SDK)
|
||||
2. Restore NuGet packages
|
||||
3. Build the project
|
||||
4. Publish to `./publish`
|
||||
5. Install as Windows Service
|
||||
6. Start the service
|
||||
|
||||
### Option 2: Manual Step-by-Step Installation
|
||||
|
||||
#### 1. Publish the Application
|
||||
|
||||
```powershell
|
||||
# Navigate to the project directory
|
||||
cd C:\Path\To\RoslynBridge.WebApi
|
||||
|
||||
# Publish the application for Release
|
||||
dotnet publish -c Release -o publish
|
||||
```
|
||||
|
||||
This creates a self-contained deployment in the `publish` folder.
|
||||
|
||||
#### 2. Install as Windows Service
|
||||
|
||||
Open PowerShell **as Administrator**:
|
||||
|
||||
```powershell
|
||||
# Install the service
|
||||
.\install-service.ps1 -Action Install
|
||||
|
||||
# Start the service
|
||||
.\install-service.ps1 -Action Start
|
||||
|
||||
# Check service status
|
||||
.\install-service.ps1 -Action Status
|
||||
```
|
||||
|
||||
### 3. Verify Installation
|
||||
|
||||
1. Open Windows Services (`services.msc`)
|
||||
2. Look for "Roslyn Bridge Web API"
|
||||
3. Verify it's running
|
||||
4. Test the API: http://localhost:5000/api/health
|
||||
|
||||
## Installation Script Options
|
||||
|
||||
The `install.ps1` script provides several options for different scenarios:
|
||||
|
||||
```powershell
|
||||
# Full automated installation
|
||||
.\install.ps1 -InstallService -StartService
|
||||
|
||||
# Build and publish only (no service installation)
|
||||
.\install.ps1
|
||||
|
||||
# Skip build, just publish and install
|
||||
.\install.ps1 -SkipBuild -InstallService
|
||||
|
||||
# Debug build instead of Release
|
||||
.\install.ps1 -Configuration Debug
|
||||
|
||||
# Custom publish path
|
||||
.\install.ps1 -PublishPath "C:\MyApp\Publish" -InstallService
|
||||
|
||||
# Reinstall after code changes
|
||||
.\install.ps1 -InstallService
|
||||
```
|
||||
|
||||
## Service Management Commands
|
||||
|
||||
```powershell
|
||||
# Install service
|
||||
.\install-service.ps1 -Action Install
|
||||
|
||||
# Start service
|
||||
.\install-service.ps1 -Action Start
|
||||
|
||||
# Stop service
|
||||
.\install-service.ps1 -Action Stop
|
||||
|
||||
# Restart service
|
||||
.\install-service.ps1 -Action Restart
|
||||
|
||||
# Check status
|
||||
.\install-service.ps1 -Action Status
|
||||
|
||||
# Uninstall service
|
||||
.\install-service.ps1 -Action Uninstall
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### Service Settings
|
||||
|
||||
The service is configured with:
|
||||
- **Service Name**: `RoslynBridgeWebApi`
|
||||
- **Display Name**: Roslyn Bridge Web API
|
||||
- **Startup Type**: Automatic (starts with Windows)
|
||||
- **Port**: 5000 (HTTP)
|
||||
|
||||
### Changing the Port
|
||||
|
||||
Edit `appsettings.json` before publishing:
|
||||
|
||||
```json
|
||||
{
|
||||
"Kestrel": {
|
||||
"Endpoints": {
|
||||
"Http": {
|
||||
"Url": "http://localhost:YOUR_PORT"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Logging
|
||||
|
||||
When running as a service, logs are written to:
|
||||
- **Windows Event Log**: Application → "Roslyn Bridge Web API"
|
||||
- **Console**: Not available when running as service
|
||||
|
||||
To view logs:
|
||||
1. Open Event Viewer
|
||||
2. Navigate to: Windows Logs → Application
|
||||
3. Filter by source: "Roslyn Bridge Web API"
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Service Won't Start
|
||||
|
||||
**Symptom**: Service starts then immediately stops
|
||||
|
||||
**Possible Causes**:
|
||||
1. Port 5000 is already in use
|
||||
2. Visual Studio plugin (port 59123) is not running
|
||||
3. Missing .NET runtime
|
||||
|
||||
**Solutions**:
|
||||
```powershell
|
||||
# Check if port 5000 is in use
|
||||
netstat -ano | findstr :5000
|
||||
|
||||
# Check if VS plugin is accessible
|
||||
curl -X POST http://localhost:59123/health -H "Content-Type: application/json" -d "{}"
|
||||
|
||||
# Check Event Log for errors
|
||||
Get-EventLog -LogName Application -Source "Roslyn Bridge Web API" -Newest 10
|
||||
```
|
||||
|
||||
### Service Installed but API Not Responding
|
||||
|
||||
**Check the following**:
|
||||
1. Service is running: `.\install-service.ps1 -Action Status`
|
||||
2. Visual Studio is open with a solution loaded
|
||||
3. Firewall isn't blocking port 5000
|
||||
|
||||
### Updating the Service
|
||||
|
||||
When you update the code:
|
||||
|
||||
**Option 1: Using install.ps1 (Recommended)**
|
||||
|
||||
```powershell
|
||||
# Stop service, rebuild, republish, and restart
|
||||
.\install-service.ps1 -Action Stop
|
||||
.\install.ps1
|
||||
.\install-service.ps1 -Action Start
|
||||
```
|
||||
|
||||
**Option 2: Manual Method**
|
||||
|
||||
```powershell
|
||||
# 1. Stop the service
|
||||
.\install-service.ps1 -Action Stop
|
||||
|
||||
# 2. Republish
|
||||
dotnet publish -c Release -o publish
|
||||
|
||||
# 3. Restart the service
|
||||
.\install-service.ps1 -Action Start
|
||||
```
|
||||
|
||||
**Option 3: Full Reinstall**
|
||||
|
||||
```powershell
|
||||
# Uninstall, republish, and reinstall
|
||||
.\install-service.ps1 -Action Uninstall
|
||||
.\install.ps1 -InstallService -StartService
|
||||
```
|
||||
|
||||
## Alternative: Manual Service Installation
|
||||
|
||||
If you prefer to use `sc.exe` directly:
|
||||
|
||||
```cmd
|
||||
# Install
|
||||
sc create RoslynBridgeWebApi binPath="C:\Path\To\publish\RoslynBridge.WebApi.exe" start=auto
|
||||
|
||||
# Start
|
||||
sc start RoslynBridgeWebApi
|
||||
|
||||
# Stop
|
||||
sc stop RoslynBridgeWebApi
|
||||
|
||||
# Delete
|
||||
sc delete RoslynBridgeWebApi
|
||||
```
|
||||
|
||||
## Running in Development
|
||||
|
||||
For development, you don't need to install as a service. Just run:
|
||||
|
||||
```powershell
|
||||
dotnet run --urls "http://localhost:5000"
|
||||
```
|
||||
|
||||
The application will work the same way but won't persist after closing the terminal.
|
||||
|
||||
## Security Considerations
|
||||
|
||||
### Production Deployment
|
||||
|
||||
For production environments:
|
||||
|
||||
1. **Use HTTPS**: Configure SSL certificates in `appsettings.json`
|
||||
2. **Restrict CORS**: Update the CORS policy to allow only specific origins
|
||||
3. **Add Authentication**: Consider adding API key or OAuth authentication
|
||||
4. **Firewall**: Only allow access from trusted IPs
|
||||
|
||||
### Network Access
|
||||
|
||||
By default, the service only listens on `localhost:5000`. To allow external access:
|
||||
|
||||
```json
|
||||
{
|
||||
"Kestrel": {
|
||||
"Endpoints": {
|
||||
"Http": {
|
||||
"Url": "http://0.0.0.0:5000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Warning**: Only do this in trusted networks. Add authentication first!
|
||||
|
||||
## Service Lifecycle
|
||||
|
||||
The service:
|
||||
1. **Starts automatically** when Windows boots
|
||||
2. **Requires Visual Studio** to be running (with a solution loaded) for full functionality
|
||||
3. **Tracks request history** in memory (lost on restart)
|
||||
4. **Logs to Event Log** for monitoring
|
||||
|
||||
## Monitoring
|
||||
|
||||
### Check Service Status
|
||||
|
||||
```powershell
|
||||
# PowerShell
|
||||
Get-Service RoslynBridgeWebApi
|
||||
|
||||
# Or use the script
|
||||
.\install-service.ps1 -Action Status
|
||||
```
|
||||
|
||||
### View Logs
|
||||
|
||||
```powershell
|
||||
# View recent logs
|
||||
Get-EventLog -LogName Application -Source "Roslyn Bridge Web API" -Newest 20
|
||||
|
||||
# Monitor logs in real-time
|
||||
Get-EventLog -LogName Application -Source "Roslyn Bridge Web API" -Newest 1 -AsString
|
||||
# Press Ctrl+C to stop
|
||||
```
|
||||
|
||||
### Test API Health
|
||||
|
||||
```powershell
|
||||
# Quick ping
|
||||
curl http://localhost:5000/api/health/ping
|
||||
|
||||
# Full health check (includes VS plugin status)
|
||||
curl http://localhost:5000/api/health
|
||||
|
||||
# View Swagger documentation
|
||||
Start-Process "http://localhost:5000"
|
||||
```
|
||||
|
||||
## Uninstalling
|
||||
|
||||
To completely remove the service:
|
||||
|
||||
```powershell
|
||||
# Stop and uninstall
|
||||
.\install-service.ps1 -Action Uninstall
|
||||
|
||||
# Optional: Delete the publish folder
|
||||
Remove-Item -Path ".\publish" -Recurse -Force
|
||||
```
|
||||
|
||||
## Additional Resources
|
||||
|
||||
- **Swagger UI**: http://localhost:5000 (when service is running)
|
||||
- **Health Check**: http://localhost:5000/api/health
|
||||
- **History Stats**: http://localhost:5000/api/history/stats
|
||||
- **Event Viewer**: Windows Logs → Application → "Roslyn Bridge Web API"
|
||||
|
||||
## FAQ
|
||||
|
||||
**Q: Do I need to keep Visual Studio open?**
|
||||
A: Yes, the VS plugin (port 59123) must be running. The Web API is just a middleware layer.
|
||||
|
||||
**Q: Can I run multiple instances?**
|
||||
A: Yes, but change the port in `appsettings.json` for each instance.
|
||||
|
||||
**Q: What happens if the service can't connect to VS plugin?**
|
||||
A: API calls will return errors, but the service remains running. History and health endpoints still work.
|
||||
|
||||
**Q: Can I use this without the Web API?**
|
||||
A: Yes, you can call the VS plugin directly on port 59123 using POST requests (see roslyn-bridge skill).
|
||||
|
||||
**Q: How do I backup request history?**
|
||||
A: History is in-memory only. Consider implementing database persistence for production use.
|
||||
Reference in New Issue
Block a user