API Endpoint Discovery from IIS Server

This guide explains how to discover all API endpoints from an IIS server's API application pool using PowerShell reflection without external tools.

Step 1: Find API Application Pool Path


Get-IISApplication | Where-Object {$_.Path -like "*api*"} | Select Path, PhysicalPath

What it does:

Purpose: Locates where your API application files are stored on disk.

Step 2: List Available DLL Files


Get-ChildItem *.dll | Select Name

What it does:

Purpose: Identifies which assemblies contain your API code. Look for files named like .Api.dll or .WebApi.dll.

Step 3: Load the API Assembly


$assembly = [System.Reflection.Assembly]::LoadFile("<full_path_to_api_dll>")

What it does:

Purpose: Loads your API's compiled code so we can examine its structure programmatically.

Step 4: Find All Controller Classes


$assembly.GetTypes() | Where-Object {$_.Name -like "*Controller*"} | ForEach-Object {
    Write-Host $_.Name
    $_.GetMethods() | Where-Object {$_.IsPublic} | Select-Object Name
}

What it does:

Purpose: Discovers all API controller classes and their public methods, which represent your API endpoints.

Step 5: Extract Endpoints with Route Information


$controllers = $assembly.GetTypes() | Where-Object {$_.BaseType.Name -eq "ApiController"}
$controllers | ForEach-Object {
    $controller = $_
    $controller.GetMethods() | Where-Object {$_.IsPublic -and $_.DeclaringType -eq $controller} | 
    ForEach-Object { "$($controller.Name): $($_.Name)" }
}

What it does:

Purpose: Creates a clean list showing which controller contains which endpoint methods.

Step 6: Get Route Attributes (Advanced)


$controllers | ForEach-Object {
    $controller = $_
    $controller.GetMethods() | ForEach-Object {
        $method = $_
        $attributes = $method.GetCustomAttributes($true)
        $routeAttr = $attributes | Where-Object {$_.GetType().Name -like "*Route*"}
        if($routeAttr) { 
            "$($controller.Name.Replace('Controller','')): $($method.Name) -> $($routeAttr.Template)" 
        }
    }
}

What it does:

Purpose: Shows the actual HTTP routes/URLs for each endpoint, not just method names.

Example Output

After running these commands, you'll see output like:


UsersController: GetUsers
UsersController: GetUser
UsersController: CreateUser
UsersController: UpdateUser
UsersController: DeleteUser

ProductsController: GetProducts
ProductsController: GetProduct

Common API Assembly Naming Patterns

Look for DLLs named:

Troubleshooting

If no controllers found:

If assembly won't load: