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>
379 lines
9.4 KiB
Markdown
379 lines
9.4 KiB
Markdown
# 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
|