Odczytywanie nagłówków jest standardową operacją w ASP.NET Core i jest używane od wieków. Napisałem nawet post podsumowujący wszystkie metody przekazywania parametrów: ASP.Net Core in .NET 5 – przekazywanie parametrów do akcji. W ASP.NET Core wprowadzono przydatne atrybuty do obsługi parametrów w metodach kontrolera, takich jak [FromQuery] lub [FromHeader]. Ale czy istnieje sposób na użycie tych atrybutów i odczytanie nagłówków jako własny obiekt? Zobaczmy.
Tak wygląda standardowa metoda kontrolera.
// POST: weatherForecast/
[HttpPost]
public IActionResult Post([FromBody] WeatherForecast forecast, [FromHeader] string parentRequestId)
{
try
{
Console.WriteLine($"Got a forecast for data: {forecast.Date} with parentRequestId: {parentRequestId}!");
}
catch (Exception e)
{
Console.WriteLine(e);
return StatusCode(StatusCodes.Status500InternalServerError);
}
return new AcceptedResult();
}
W tym przykładzie [FromBody] oznacza, że forecast zostanie odwzorowana na obiekt z treści żądania, a [FromHeader] oznacza, że parentRequestId zostanie pobrany z nagłówka. To działa świetnie, ale jak zmapować więcej nagłówków, najlepiej jako osobny obiekt?
Spójrzmy na ten kod:
// POST: weatherForecast/multipleHeaders
[HttpPost("multipleHeaders")]
public IActionResult Post([FromHeader] ForecastHeaders forecastHeaders)
{
try
{
Console.WriteLine($"Got a forecast for city: {forecastHeaders.City}," +
$"temperature: {forecastHeaders.TemperatureC} and" +
$"description: {forecastHeaders.Description}!");
}
catch (Exception e)
{
Console.WriteLine(e);
return StatusCode(StatusCodes.Status500InternalServerError);
}
return new AcceptedResult();
}
AForecastHeaders wygląda tak:
public class ForecastHeaders
{
[FromHeader]
public string City { get; set; }
[FromHeader]
public int TemperatureC { get; set; }
[FromHeader]
public string Description { get; set; }
[FromQuery]
public string Sorting { get; set; }
}
Czy zauważyłeś, że użyłem [FromHeader] zarówno w deklaracji parametrów metody kontrolera, jak i w mojej własnej klasie?
Teraz prześlijmy żądanie z Postmana.

Wynik? Czy Ciebie zdziwił tak samo jak mnie? 😀

Zadziałało!
Wszystkie nagłówki zostały poprawnie zmapowane jako obiekt. Zwróć uwagę, że sortowanie również zostało zmapowane, nawet jeśli pochodzi z parametru zapytania, a nie z nagłówka. Udowadnia to to, że możesz połączyć te dwa podejścia, jeśli w ogóle ma to sens.
Cały zamieszczony tutaj kod jest dostępny na moim GitHub – sprawdź.
Nie wiem tylko czy to błąd czy ficzer… ale mi się podoba! ❤️