Lets an ASP.NET Core service state facts about itself instead of inferring them from whatever request happens to arrive. Chiefly its external base address — the origin it is reached at from outside — so code building absolute links does not have to guess.
dotnet add package ApricotFramework.SelfDefinition.AspNetCoreusing ApricotFramework.SelfDefinition.AspNetCore.Extensions;
builder.Services.AddSelfDefinition(builder.Configuration);{
"SelfDefinition": {
"ExternalBaseAddress": "https://api.example.com/gateway"
}
}using ApricotFramework.SelfDefinition.AspNetCore;
app.MapGet("/link", (ISelfDefinitionProvider selfDefinition) =>
{
// Never ends in a slash, so one separator is always correct.
var baseAddress = selfDefinition.GetExternalBaseAddress();
return Results.Ok($"{baseAddress}/account/reset?token=abc123");
});ExternalBaseAddress is required and validated when the host starts, so a missing or unusable
value stops the host rather than producing wrong links later. Rejected: anything that is not an
absolute http/https URL, embedded credentials, a query string, and a fragment. Note that a bare
path such as /api is rejected too — it parses as an absolute file: URI, so it fails the scheme
check rather than the absolute-URL one.
Full documentation: https://projectapricot.dev/docs/self-definition