Итак, у меня есть маленькая минимальная конечная точка API:
app.MapGet("/person/{name}", (string name) =>
{
var person = people.FirstOrDefault(p => p.Name.StartsWith(name));
if (person == null)
return (IResult)TypedResults.NotFound("Not found.");
return TypedResults.Ok(person);
}
);
Мне пришлось сделать (IResult) из-за CS1678 «Параметр «1» объявлен как тип «строка», но должен быть «Microsoft.AspNetCore.Http.HttpContext» - я не могу понять, почему это относится к «имени» параметр.
В документации упоминается, что
TypedResults.Ok
иTypedResults.NotFound
объявлены как возвращающие разные типы, и компилятор не пытается определить наиболее подходящий тип.
Чтобы использовать
TypedResults
, тип возвращаемого значения должен быть полностью объявлен, а в асинхронном режиме требуется оболочкаTask<>
. ИспользованиеTypedResults
более подробное, но это компромисс, поскольку информация о типе должна быть статически доступной и, следовательно, иметь возможность самоописания для OpenAPI.
Короче говоря, вам нужна Results<>
обертка.
Возможный способ настройки вашего кода может выглядеть так, как показано ниже.
app.MapGet("/person/{name}",
Results<NotFound<string>, Ok<Person>> (string name) =>
{
//var person = people.FirstOrDefault(p => p.Name.StartsWith(name));
Person? person = null;
return person is null
? TypedResults.NotFound("Not found.")
: TypedResults.Ok(person);
});
Верно, но это работает и без оболочки — результатов<> достаточно.
@cookieMonster Хорошая мысль. Скорректирован ответ на неасинхронный ответ, который не требует Task<>
, поскольку вы не выполняете никакой асинхронной работы в своем вопросе.