← Документация
Koto.Api.AspNetCore
Транспорт-независимая интеграция с ASP.NET Core — Minimal API, MVC или любой хост.
Что вы получаете
ToHttpResult()/ToHttpResultAsync()—Result<T>→IResult(Minimal API)ToActionResult()/ToActionResultAsync()—Result<T>→ActionResult<T>(MVC)KotoProblemDetails— RFC 7807 Problem Details из одной или несколькихError(несколько ошибок складываются в validation problem details со словарёмerrorsпо полям)KotoHttpErrorOptions— расширяемый реестр соответствийError.Code→ HTTP-статус
Быстрый старт
builder.Services.AddKotoAspNetCore(); // опционально: o => o.Map("payments.gateway-failed", 502)
Minimal API:
app.MapPost("/orders", (CreateOrderCommand cmd, ICqrsDispatcher dispatcher, HttpContext ctx, CancellationToken ct)
=> dispatcher.SendAsync(cmd, ct).ToHttpResultAsync(ctx));
MVC-контроллер:
[HttpPost]
public async Task<ActionResult<OrderDto>> Create(CreateOrderCommand cmd, CancellationToken ct)
=> (await _dispatcher.SendAsync(cmd, ct)).ToActionResult(this);
Маппинг кодов статуса
Порядок разрешения: точный код → свои правила → суффикс → префикс → дефолт для field-ошибок → fallback.
| Правило | Статус |
|---|---|
*.not-found | 404 |
*.already-*, *.conflict | 409 |
*.unauthorized | 401 |
*.forbidden | 403 |
general.*, validation.*, Error.Field != null | 400 |
| всё остальное | 422 (fallback, настраивается) |
Бизнес-ошибки без явного маппинга — это 422, но никогда не 500: неуспешный Result — это нарушение
правила, на которое клиент может отреагировать, а 500 остаётся за необработанными исключениями.
Настройка:
builder.Services.AddKotoAspNetCore(o => o
.Map("subscription.payment-failed", StatusCodes.Status502BadGateway) // точное совпадение, высший приоритет
.MapSuffix(".expired", StatusCodes.Status410Gone)
.MapPrefix("quota.", StatusCodes.Status429TooManyRequests)
.Map(e => e.Code.Contains(".locked-") ? StatusCodes.Status423Locked : null));