در Asp.Net Core به طور پیشفرض 7 Attribute مربوط به HttpMethod وجود دارند: (HttpDelete, HttpGet, HttpPost, HttpPut, HttpOption, HttpPatch, HttpHead).
در این مطلب میخواهیم دو Attribute سفارشی ایجاد کنیم با نام های HttpRead و HttpWrite که درخواست‌هایی که عملیات Write را انجام می‌دهند از HttpWrite و درخواست‌هایی که فقط عملیات خواندن را انجام می‌دهند از HttpRead استفاده کنند. برای ایجاد اتربیوت مربوط به HttpMethod باید یک کلاس ایجاد کنید که از HttpMethodAttribute ارث بری کند.

public class HttpReadAttribute : HttpMethodAttribute
{
    private static readonly IEnumerable<string> _supportedMethods = new[] { "READ" };
    public HttpReadAttribute()
        : base(_supportedMethods)
    {
    }

    public HttpReadAttribute(string template)
        : base(_supportedMethods, template)
    {
        if (template == null)
        {
            throw new ArgumentNullException(nameof(template));
        }
    }
}

در سازنده این کلاس باید لیست کلمات قابل قبول برای این Attribute را وارد کنید. برای مثال در Attribute ایجاد شده فقط کلمه READ قابل قبول است و به این معناست اگر این Attribute بر روی یک اکشنی قرار بگیرد فقط درخواست‌هایی را قبول می‌کند که HttpMethod آنها از نوع READ باشد. سپس باید بر روی اکشن مورد نظر این Attribute را قرار دهیم:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpRead]
    public IActionResult Read()
    {
        string result = "Read api";
        return Ok(result);
    }
    [HttpWrite]
    public IActionResult Write()
    {
        string result = "Write api";
        return Ok(result);
    }
}

اکنون اگر آدرس api/values را در مرورگر وارد کنید، هیچ دیتایی دریافت نمی‌کنید اما اگر از طریق Postman یا هر برنامه‌ی دیگری که بتوانید نوع HttpMethod را مشخص کنید و HttpMethod را برابر Read قرار دهید میتوانید به اکشن Read درخواست ارسال کنید در غیر این صورت ریسپانس 405 را دریافت میکنید.
کد مربوط به HttpWrite:

public class HttpWriteAttribute : HttpMethodAttribute
{
    private static readonly IEnumerable<string> _supportedMethods = new[] { "WRITE" };
    public HttpWriteAttribute()
        : base(_supportedMethods)
    {
    }

    public HttpWriteAttribute(string template)
        : base(_supportedMethods, template)
    {
        if (template == null)
        {
            throw new ArgumentNullException(nameof(template));
        }
    }
}

;)

Powered by Froala Editor

نظرات

سایر نظرات
  • Mahdi Momtaheni

    عالی بود فرهاد جان. کاش درمورد کاربردش و اینکه چرا نیاز داریم به HTTP METHOD های اختصاصی خودمون هم توضیحاتی بدیممنون

    ارسال شده در تاریخ چهارشنبه، ۰۸ دی ۱۴۰۰
    • admin

      خواهش میکنم مهدی جان، حقیقتش دلیل خاصی نداره که بیایم از HttpVerb سفارشی خودمون استفاده کنیم و من خودم اگه API طراحی کنم با استاندارد REST پیاده سازیش کنم و توی این مطلب هدفم این بود که فقط چجوری میتونیم یه Verb سفارشی برای خودمون طراحی کنیم

      ارسال شده در تاریخ شنبه، ۱۸ دی ۱۴۰۰