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:
378
RoslynBridge.WebApi/README.md
Normal file
378
RoslynBridge.WebApi/README.md
Normal file
@@ -0,0 +1,378 @@
|
||||
# Roslyn Bridge Web API
|
||||
|
||||
A modern ASP.NET Core web API that acts as middleware between Claude AI and the Roslyn Bridge Visual Studio plugin, providing RESTful access to C# code analysis capabilities.
|
||||
|
||||
## Overview
|
||||
|
||||
This web API serves as a bridge between external clients (like Claude AI) and the Visual Studio Roslyn Bridge plugin. It provides:
|
||||
|
||||
- **Modern RESTful API** with comprehensive Swagger/OpenAPI documentation
|
||||
- **CORS-enabled** for web application access
|
||||
- **Health monitoring** for both the web API and Visual Studio plugin connection
|
||||
- **Simplified endpoints** for common Roslyn operations
|
||||
- **Type-safe models** with validation
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
┌─────────────┐ HTTP/REST ┌──────────────────┐ HTTP ┌─────────────────────┐
|
||||
│ Claude │ ◄─────────────────► │ Web API (5000) │ ◄────────────► │ VS Plugin (59123) │
|
||||
│ AI │ │ Middleware │ │ Roslyn Bridge │
|
||||
└─────────────┘ └──────────────────┘ └─────────────────────┘
|
||||
```
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- .NET 8.0 SDK or later
|
||||
- Visual Studio with Roslyn Bridge plugin running (default port: 59123)
|
||||
|
||||
### Quick Installation
|
||||
|
||||
**Option 1: Automated Installation**
|
||||
|
||||
Open PowerShell as Administrator:
|
||||
```powershell
|
||||
cd RoslynBridge.WebApi
|
||||
.\install.ps1 -InstallService -StartService
|
||||
```
|
||||
|
||||
This will build, publish, install as a Windows Service, and start the API automatically.
|
||||
|
||||
For more detailed service setup options, see [SERVICE_SETUP.md](SERVICE_SETUP.md).
|
||||
|
||||
**Option 2: Development Mode**
|
||||
|
||||
1. **Start the Visual Studio plugin** (it should be running on port 59123)
|
||||
|
||||
2. **Run the Web API:**
|
||||
```bash
|
||||
cd RoslynBridge.WebApi
|
||||
dotnet run
|
||||
```
|
||||
|
||||
3. **Access Swagger UI:**
|
||||
- Navigate to: `http://localhost:5000`
|
||||
- Or: `https://localhost:7001` (with HTTPS)
|
||||
|
||||
### Configuration
|
||||
|
||||
Edit `appsettings.json` to configure the connection:
|
||||
|
||||
```json
|
||||
{
|
||||
"RoslynBridge": {
|
||||
"BaseUrl": "http://localhost:59123",
|
||||
"TimeoutSeconds": 30
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## API Endpoints
|
||||
|
||||
### Health Endpoints
|
||||
|
||||
- **GET /api/health** - Check health status of Web API and VS plugin
|
||||
- **GET /api/health/ping** - Simple ping endpoint
|
||||
|
||||
### Roslyn Query Endpoints
|
||||
|
||||
- **POST /api/roslyn/query** - Execute any Roslyn query
|
||||
- **GET /api/roslyn/projects** - Get all projects in solution
|
||||
- **GET /api/roslyn/solution/overview** - Get solution statistics
|
||||
- **GET /api/roslyn/diagnostics** - Get errors and warnings
|
||||
- **GET /api/roslyn/symbol** - Get symbol information at position
|
||||
- **GET /api/roslyn/references** - Find all references to symbol
|
||||
- **GET /api/roslyn/symbol/search** - Search for symbols by name
|
||||
|
||||
### Refactoring Endpoints
|
||||
|
||||
- **POST /api/roslyn/format** - Format a document
|
||||
- **POST /api/roslyn/project/package/add** - Add NuGet package
|
||||
- **POST /api/roslyn/project/build** - Build a project
|
||||
|
||||
## Example Usage
|
||||
|
||||
### Using curl
|
||||
|
||||
```bash
|
||||
# Health check
|
||||
curl http://localhost:5000/api/health
|
||||
|
||||
# Get all projects
|
||||
curl http://localhost:5000/api/roslyn/projects
|
||||
|
||||
# Get solution overview
|
||||
curl http://localhost:5000/api/roslyn/solution/overview
|
||||
|
||||
# Execute custom query
|
||||
curl -X POST http://localhost:5000/api/roslyn/query \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"queryType": "getsymbol",
|
||||
"filePath": "C:\\path\\to\\file.cs",
|
||||
"line": 10,
|
||||
"column": 5
|
||||
}'
|
||||
|
||||
# Search for symbols
|
||||
curl "http://localhost:5000/api/roslyn/symbol/search?symbolName=MyClass"
|
||||
|
||||
# Get diagnostics
|
||||
curl "http://localhost:5000/api/roslyn/diagnostics"
|
||||
```
|
||||
|
||||
### Using JavaScript/TypeScript
|
||||
|
||||
```typescript
|
||||
const response = await fetch('http://localhost:5000/api/roslyn/query', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
queryType: 'getprojects'
|
||||
})
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
console.log(result.data);
|
||||
```
|
||||
|
||||
### Using C#
|
||||
|
||||
```csharp
|
||||
using var client = new HttpClient();
|
||||
client.BaseAddress = new Uri("http://localhost:5000");
|
||||
|
||||
var request = new RoslynQueryRequest
|
||||
{
|
||||
QueryType = "getsolutionoverview"
|
||||
};
|
||||
|
||||
var response = await client.PostAsJsonAsync("/api/roslyn/query", request);
|
||||
var result = await response.Content.ReadFromJsonAsync<RoslynQueryResponse>();
|
||||
```
|
||||
|
||||
## Query Types
|
||||
|
||||
The following query types are supported:
|
||||
|
||||
### Code Analysis
|
||||
- `getprojects` - Get all projects
|
||||
- `getdocument` - Get document information
|
||||
- `getsymbol` - Get symbol at position
|
||||
- `getsemanticmodel` - Get semantic model
|
||||
- `getsyntaxtree` - Get syntax tree
|
||||
- `getdiagnostics` - Get compilation errors/warnings
|
||||
- `findreferences` - Find all references
|
||||
- `findsymbol` - Find symbols by name
|
||||
- `gettypemembers` - Get type members
|
||||
- `gettypehierarchy` - Get type hierarchy
|
||||
- `findimplementations` - Find implementations
|
||||
- `getnamespacetypes` - Get namespace types
|
||||
- `getcallhierarchy` - Get call hierarchy
|
||||
- `getsolutionoverview` - Get solution overview
|
||||
- `getsymbolcontext` - Get symbol context
|
||||
- `searchcode` - Search code patterns
|
||||
|
||||
### Refactoring
|
||||
- `formatdocument` - Format document
|
||||
- `organizeusings` - Organize using statements
|
||||
- `renamesymbol` - Rename symbol
|
||||
- `addmissingusing` - Add missing using
|
||||
- `applycodefix` - Apply code fix
|
||||
|
||||
### Project Operations
|
||||
- `addnugetpackage` - Add NuGet package
|
||||
- `removenugetpackage` - Remove NuGet package
|
||||
- `buildproject` - Build project
|
||||
- `cleanproject` - Clean project
|
||||
- `restorepackages` - Restore packages
|
||||
- `createdirectory` - Create directory
|
||||
|
||||
## Response Format
|
||||
|
||||
All responses follow this structure:
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Optional message",
|
||||
"data": { ... },
|
||||
"error": null
|
||||
}
|
||||
```
|
||||
|
||||
Error responses:
|
||||
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"message": null,
|
||||
"data": null,
|
||||
"error": "Error description"
|
||||
}
|
||||
```
|
||||
|
||||
## Features
|
||||
|
||||
### CORS Support
|
||||
The API is configured with CORS enabled for all origins, making it accessible from web applications.
|
||||
|
||||
### Swagger/OpenAPI
|
||||
Comprehensive API documentation is available at the root URL (`/`) with:
|
||||
- Detailed endpoint descriptions
|
||||
- Request/response models
|
||||
- Try-it-out functionality
|
||||
- XML documentation comments
|
||||
|
||||
### Health Checks
|
||||
Built-in health checks monitor:
|
||||
- Web API service status
|
||||
- Visual Studio plugin connectivity
|
||||
- Request/response timing
|
||||
|
||||
### Logging
|
||||
Structured logging with different levels:
|
||||
- Information: General operations
|
||||
- Warning: Non-critical issues
|
||||
- Error: Failed operations
|
||||
- Debug: Detailed tracing (Development only)
|
||||
|
||||
## Development
|
||||
|
||||
### Project Structure
|
||||
|
||||
```
|
||||
RoslynBridge.WebApi/
|
||||
├── Controllers/
|
||||
│ ├── HealthController.cs # Health check endpoints
|
||||
│ └── RoslynController.cs # Roslyn operation endpoints
|
||||
├── Models/
|
||||
│ ├── RoslynQueryRequest.cs # Request DTOs
|
||||
│ ├── RoslynQueryResponse.cs # Response DTOs
|
||||
│ └── HealthCheckResponse.cs # Health check models
|
||||
├── Services/
|
||||
│ ├── IRoslynBridgeClient.cs # Client interface
|
||||
│ └── RoslynBridgeClient.cs # HTTP client implementation
|
||||
├── Program.cs # Application configuration
|
||||
├── appsettings.json # Configuration
|
||||
└── README.md # This file
|
||||
```
|
||||
|
||||
### Building
|
||||
|
||||
```bash
|
||||
dotnet build
|
||||
```
|
||||
|
||||
### Running Tests
|
||||
|
||||
```bash
|
||||
dotnet test
|
||||
```
|
||||
|
||||
### Publishing
|
||||
|
||||
```bash
|
||||
dotnet publish -c Release -o ./publish
|
||||
```
|
||||
|
||||
## Deployment
|
||||
|
||||
### Docker (Optional)
|
||||
|
||||
Create a `Dockerfile`:
|
||||
|
||||
```dockerfile
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
|
||||
WORKDIR /app
|
||||
EXPOSE 5000
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
||||
WORKDIR /src
|
||||
COPY ["RoslynBridge.WebApi.csproj", "./"]
|
||||
RUN dotnet restore
|
||||
COPY . .
|
||||
RUN dotnet build -c Release -o /app/build
|
||||
|
||||
FROM build AS publish
|
||||
RUN dotnet publish -c Release -o /app/publish
|
||||
|
||||
FROM base AS final
|
||||
WORKDIR /app
|
||||
COPY --from=publish /app/publish .
|
||||
ENTRYPOINT ["dotnet", "RoslynBridge.WebApi.dll"]
|
||||
```
|
||||
|
||||
Build and run:
|
||||
|
||||
```bash
|
||||
docker build -t roslyn-bridge-api .
|
||||
docker run -p 5000:5000 roslyn-bridge-api
|
||||
```
|
||||
|
||||
## Integration with Claude
|
||||
|
||||
This API is designed to work seamlessly with Claude AI for code analysis tasks:
|
||||
|
||||
1. Claude can query project structure
|
||||
2. Analyze code for errors and warnings
|
||||
3. Search for symbols and references
|
||||
4. Suggest refactorings
|
||||
5. Navigate code hierarchies
|
||||
|
||||
Example Claude prompt:
|
||||
```
|
||||
"Using the Roslyn Bridge API at http://localhost:5000,
|
||||
analyze the current solution and identify any code quality issues."
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Visual Studio Plugin Not Connected
|
||||
|
||||
Error: `{"vsPluginStatus": "Disconnected"}`
|
||||
|
||||
**Solution:**
|
||||
1. Ensure Visual Studio is running
|
||||
2. Verify Roslyn Bridge plugin is installed and active
|
||||
3. Check plugin is listening on port 59123
|
||||
4. Update `appsettings.json` if using a different port
|
||||
|
||||
### CORS Errors
|
||||
|
||||
If accessing from a web app:
|
||||
- Verify CORS is enabled in `Program.cs`
|
||||
- Check browser console for specific CORS errors
|
||||
- Ensure the origin is allowed
|
||||
|
||||
### Timeout Errors
|
||||
|
||||
Increase timeout in `appsettings.json`:
|
||||
```json
|
||||
{
|
||||
"RoslynBridge": {
|
||||
"TimeoutSeconds": 60
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
This project is part of the Roslyn Bridge suite.
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are welcome! Please:
|
||||
1. Fork the repository
|
||||
2. Create a feature branch
|
||||
3. Make your changes
|
||||
4. Submit a pull request
|
||||
|
||||
## Support
|
||||
|
||||
For issues and questions:
|
||||
- Check the Swagger documentation at `/`
|
||||
- Review the logs in the console output
|
||||
- Verify the Visual Studio plugin is running
|
||||
Reference in New Issue
Block a user