Webhook Tester is a small Aspire extension that deploys the tarampampam/webhook-tester container. It provides a simple way to inspect HTTP requests from your application while running locally.
This repository contains the extension library, a sample app that shows how to use it and a small test suite.
Add the NuGet package to your AppHost project:
dotnet add package Allesa.Aspire.Hosting.WebhookTesterThe extension targets .NET 9 and ships as a regular NuGet package, so no additional tooling is required.
Create a distributed application and add the webhook tester container:
var builder = DistributedApplication.CreateBuilder(args);
var webhook = builder.AddWebhookTester("webhook-tester")
                     .WithLogLevel(LogLevel.Debug);
var api = builder.AddProject<Projects.Api>("api")
                 .WithReference(webhook)
                 .WithDefaultWebhookToken(webhook);
builder.Build().Run();Calling AddWebhookTester registers the container and exposes two URLs (HTTP/HTTPS) ending with /s/{token} for the Web UI. The connection string for other services is http://{host}:{port}/{token} and can be retrieved via GetConnectionString("webhook-tester").
WebhookTesterResourceBuilderExtensions exposes a rich set of configuration helpers. Each method sets an environment variable understood by the container:
| Method | Environment variable | Description | 
|---|---|---|
| WithHttpPort(int) | HTTP_PORT | Override the listening port (defaults to 8080). | 
| WithAutoCreateSessions(bool) | AUTO_CREATE_SESSIONS | Automatically create an initial session. | 
| WithLogLevel(LogLevel) | LOG_LEVEL | Logging level ( debug,info,warn,error). | 
| WithLogFormat(LogFormat) | LOG_FORMAT | Log output format ( textorjson). | 
| WithServerAddress(string) | SERVER_ADDR | Custom listen address. | 
| WithHttpReadTimeout(TimeSpan) | HTTP_READ_TIMEOUT | HTTP server read timeout. | 
| WithHttpWriteTimeout(TimeSpan) | HTTP_WRITE_TIMEOUT | HTTP server write timeout. | 
| WithHttpIdleTimeout(TimeSpan) | HTTP_IDLE_TIMEOUT | HTTP server idle timeout. | 
| WithShutdownTimeout(TimeSpan) | SHUTDOWN_TIMEOUT | Graceful shutdown timeout. | 
| WithStorageDriver(StorageDriver) | STORAGE_DRIVER | Storage backend ( memoryordisk). | 
| WithFsStorageDir(string) | FS_STORAGE_DIR | Directory for disk storage. | 
| WithPubSubDriver(PubSubDriver) | PUBSUB_DRIVER | Pub/Sub backend ( memoryorredis). | 
| WithRedisDsn(string) | REDIS_DSN | Redis connection string when using the Redis pub/sub driver. | 
| WithTunnelDriver(TunnelDriver) | TUNNEL_DRIVER | Tunnel provider ( ngrok). | 
| WithNgrokAuthToken(string) | NGROK_AUTHTOKEN | ngrok authentication token. | 
| WithSessionTtl(TimeSpan) | SESSION_TTL | Session expiration duration. | 
| WithMaxRequests(uint) | MAX_REQUESTS | Maximum number of requests per session. | 
| WithMaxRequestBodySize(uint) | MAX_REQUEST_BODY_SIZE | Limit request payload size in bytes. | 
| WithDefaultWebhookToken<T> | DEFAULT_SESSION_TOKEN | Injects the default token into another resource. | 
AddWebhookTester itself sets DEFAULT_SESSION_TOKEN (always), AUTO_CREATE_SESSIONS (when enabled) and HTTP_PORT (when a custom port is provided).
The sample directory contains a minimal Aspire solution:
- AppHost – registers the webhook tester and an API project.
- Api – exposes a /testendpoint which posts data to the tester.
- ServiceDefaults – shared hosting configuration used by the API.
Run it with:
dotnet run --project sample/AppHostDuring startup the AppHost prints the generated webhook URL. Sending a POST request to Api will forward it to the tester. You can then browse to the tester's Web UI at /s/{token} to inspect captured requests.
The tests folder contains unit tests for the builder API. Integration tests that spin up containers require Docker and are located under sample/SampleTests. When running locally you can execute just the builder tests:
dotnet test tests/Aspire.Hosting.WebhookTester.Tests --filter FullyQualifiedName~WebhookTesterPublicApiTestsThis project is licensed under the MIT license. See the LICENSE file for details.