السمات المخصصة على .NET 6 Core API

· 3 دقيقة قراءة

تعد السمات المخصصة أمرًا جيدًا حقًا للاستخدام، وقد بدأت استخدامها مؤخرًا جدًا، لأنها تسمح لي بإنشاء واحدة منها وإعادة استخدامها إما على وحدة التحكم أو الفصل أو الطريقة نفسها.

إنها تساعد حقًا عندما تريد القيام ببعض الأشياء الأمنية مثل التحقق من الرؤوس، أو التحقق من قيمة المعلمة التي تحتاجها بالتأكيد.

في حالتي، سنستخدمه في مشروع .NET Core API، حيث سنتحقق مما إذا كان كل الطلب يحتوي على رأس معين.

سمة التحقق من الرأس

لذا، بعد أن أنشأنا واجهة برمجة تطبيقات .NET Core الرائعة، فلنقم بإنشاء مجلد لتخزين الأشياء الخاصة بنا، لأننا نحب استخدام المجلدات.

وبعد ذلك سنقوم بإضافة المنطق إلى فئة HeaderCheckAttribute الخاصة بنا.

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);
        }
    }
}

المنطق الأساسي هو، أولاً يتحقق من وجود رأس باستخدام المفتاح x-dotnet-6-custom-attribute وإذا كان موجودًا، فإنه يتحقق مما إذا كان يحتوي على قيم.

إذا كان كلا التعبيرين صحيحين، فسيتم إعادة BadRequestObjectResult برسالة معينة.

إضافته إلى وحدة التحكم

يمكننا إضافة هذا المنطق إلى أماكن متعددة، يمكننا إضافته مباشرة إلى وحدة التحكم بأكملها، أو يمكننا إضافته إلى بعض الطرق، سنقوم بإضافته أولاً إلى الطرق ثم إلى وحدة التحكم بأكملها.

لذلك دعونا نزين الفصل WeatherForecastController معهم.

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();
        }
    }
}

دعونا تشغيل المشروع!

لدينا وظيفتان هناك: GetWeatherForecastWithCheck وGetWeatherForecastWithoutCheck، إحداهما ستفشل والبعض الآخر لن يفشل، ولكن دعونا نتحقق من ذلك على Swagger!

كما ترون، تقوم إحدى الإرجاعات بإرجاع خطأ 400 في رسالتنا، بينما تقوم الأخرى بإرجاع القيم، والآن لاختبار ذلك بشكل كامل، فلنقم بتشغيل Postman وإضافة رأس حتى نتمكن أيضًا من رؤية البيانات باستخدام GetWeatherForecastWithCheck.

ساعي البريد

الآن قيد التشغيل على Postman، نضيف الرأس ونرى أن رسالة الخطأ قد تغيرت، منذ الآن نقوم بتوفير الرأس ولكن ليس هناك قيمة له

إذا أضفنا قيمة إليها، فسنحصل في النهاية على القيم!

هذا كل شيء

حسنا هذا كل شيء! حق بسيط جدا؟ حسنًا، أنت تعرف الآن كيفية إنشاء سمة وتخصيصها للطرق ووحدات التحكم!

استمتع معهم!

الكود

هذا المشروع بأكمله موجود على Github ويمكنك العثور عليه هنا!

إذا كانت لديك أي مشاكل أو أسئلة، فلا تتردد في الاتصال بي على أي من وسائل التواصل الاجتماعي على @emimontesdeoca (في تويتر هو في الواقع @emimontesdeocaa مع اثنين من aa في النهاية). يمكنك أيضًا العثور على معظم وسائل التواصل الاجتماعي الخاصة بي على رأس المدونة.

آمل أن تكونوا قد أحببت هذا المنصب! سيا!