Benutzerdefinierte Attribute für die .NET 6 Core-API
Benutzerdefinierte Attribute sind wirklich eine gute Sache. Ich habe erst vor kurzem damit begonnen, sie zu verwenden, weil sie es mir ermöglichen, ein einzelnes davon zu erstellen und es entweder auf dem Controller, der Klasse oder der Methode selbst wiederzuverwenden.
Sie helfen wirklich, wenn Sie Sicherheitsaufgaben erledigen möchten, z. B. nach Headern suchen oder den Wert eines Parameters überprüfen, den Sie unbedingt benötigen.
In meinem Fall werden wir es in einem .NET Core API-Projekt verwenden, wo wir prüfen, ob alle Anfragen einen bestimmten Header enthalten.
HeaderCheckAttribute
Nachdem wir also unsere coole .NET Core-API erstellt haben, erstellen wir einen Ordner zum Speichern unserer Inhalte, da wir gerne Ordner verwenden.

Und dann werden wir die Logik zu unserer Klasse HeaderCheckAttribute hinzufügen.
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace DotNet6CustomAttribute.Attributes
{
public class HeaderCheckAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
// Get all headers
var headers = context.HttpContext.Request.Headers;
// Check if headers has x-dotnet-6-custom-attribute
if (!headers.ContainsKey("x-dotnet-6-custom-attribute"))
{
context.Result = new BadRequestObjectResult("The header x-dotnet-6-custom-attribute is missing");
}
else if (string.IsNullOrEmpty(headers["x-dotnet-6-custom-attribute"]))
{
context.Result = new BadRequestObjectResult("The header x-dotnet-6-custom-attribute can't be null or empty");
}
base.OnActionExecuting(context);
}
}
}
Im Grunde besteht die Logik darin, zunächst nach einem Header mit dem Schlüssel x-dotnet-6-custom-attribute zu suchen und dann, wenn er vorhanden ist, zu prüfen, ob er Werte enthält.
Wenn beide Ausdrücke wahr sind, wird ein BadRequestObjectResult mit einer bestimmten Nachricht zurückgegeben.
Dem Controller hinzufügen
Wir können diese Logik an mehreren Stellen hinzufügen, direkt zum gesamten Controller oder zu einigen Methoden. Wir fügen sie zuerst den Methoden und dann dem gesamten Controller hinzu.
Also lasst uns die Klasse WeatherForecastController damit dekorieren.
using DotNet6CustomAttribute.Attributes;
using Microsoft.AspNetCore.Mvc;
namespace DotNet6CustomAttribute.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
[Route("GetWeatherForecastWithCheck")]
[HeaderCheckAttribute]
public IEnumerable<WeatherForecast> GetWithCheck()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
[HttpGet]
[Route("GetWeatherForecastWithoutCheck")]
public IEnumerable<WeatherForecast> GetWithoutCheck()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
}
Lassen Sie uns das Projekt durchführen!

Wir haben dort zwei Funktionen: GetWeatherForecastWithCheck und GetWeatherForecastWithoutCheck, eine davon schlägt fehl und die andere nicht, aber schauen wir uns das mal bei Swagger an!

Wie Sie sehen können, gibt einer der beiden einen 400-Fehler mit unserer Nachricht zurück und der andere die Werte. Um dies nun vollständig zu testen, führen wir Postman aus und fügen einen Header hinzu, damit wir die Daten auch mit GetWeatherForecastWithCheck sehen.
Postbote
Wenn wir jetzt Postman ausführen, fügen wir den Header hinzu und sehen, dass sich die Fehlermeldung geändert hat, da wir jetzt zwar den Header bereitstellen, dieser aber keinen Wert hat

Wenn wir einen Wert hinzufügen, erhalten wir endlich die Werte!

Das ist es
Nun, das ist es! Ziemlich einfach, oder? Nun wissen Sie, wie Sie ein Attribut erstellen und es Methoden und Controllern zuweisen!
Viel Spaß mit ihnen!
Code
Das gesamte Projekt ist auf Github und Sie können es hier finden!
Wenn Sie Probleme oder Fragen haben, können Sie mich gerne über die sozialen Medien unter @emimontesdeoca kontaktieren (auf Twitter ist es eigentlich @emimontesdeocaa mit zwei aa am Ende). Die meisten meiner sozialen Netzwerke finden Sie auch in der Kopfzeile des Blogs.
Ich hoffe, Ihnen hat der Beitrag gefallen! Cya!