نحوه استفاده از فیلترها در ASP.NET Core MVC

یکشنبه 20 تیر 1400

فیلترها در ASP.NET Core MVC از اهمیت بسیار زیادی برخوردار هستند، ما در این مطلب قصد داریم کمی بیشتر درباره فیلترها در ASP.NET Core MVC صحبت کنیم.

نحوه استفاده از فیلترها در ASP.NET Core MVC

فیلترها در ASP.NET Core MVC 5 به شما اجازه می دهند تا قطعه کد مدنظرتان را در مرحله خاصی از درخواست پردازش pipeline اجرا کنید. به عبارت دیگر ما می توانیم کدهایی که مدنظر داریم را قبل یا بعد از مرحله خاصی از درخواست پردازش پایپ لاین اجرا کنیم. استفاده از فیلترها در ASP.NET Core MVC 5 می تواند مزایای بسیار زیادی را برای توسعه دهندگان به همراه داشته باشد. ASP.NET Core MVC 5 دارای فیلترهای داخلی بسیار زیادی می باشد. از آنجایی که هر فیلتر برای هدف خاصی طراحی و ساخته شده است باید بدانید که هر یک در مرحله خاصی از پایپ لاین اجرا می شوند.

در واقع انواع مختلف فیلترها در ASP.NET Core MVC 5 به مراحل مختلفی از پایپ لاین متعلق هستند که از جمله آنها می توان به مراحل اعتبارسنجی و اجرای نتایج اشاره کرد. علاوه بر تمامی فیلترهای داخلی که در ASP.NET Core MVC 5 وجود دارند شما می توانید فیلترهای شخصی سازی شده مخصوص خود را نیز بنویسید و از آنها استفاده کنید.

در این مطلب قصد داریم درباره انواع فیلترها در ASP.NET Core MVC 5 صحبت کنیم و چگونگی کار با آنها را به شما معرفی کنیم. برای کار کردن با مثال هایی که در این مطلب ارائه می دهیم باید ویژوال استودیو نسخه 2019 را روی سیستم خود نصب کرده و از آن استفاده کنید.

ساخت پروژه جدید برای کار با فیلترها در ASP.NET Core MVC 5

قبل از هر چیز برای استفاده از فیلترها در ASP.NET Core MVC 5 باید یک پروژه جدید در ویژوال استودیو 2019 بسازیم. برای انجام این کار مراحل زیر را دنبال کنید:

-     Ide ویژوال استودیو را اجرا کنید.

-     بر روی گزینه Create new project کلیک کنید

-    در پنجره Create new project گزینه ASP.NET Core Web App (Model-View-Controller) را انتخاب کرده و سپس روی Next کلیک کنید

-    در پنجره Configure your new project نام پروژه و همین طور محل قرارگیری آن را مشخص کنید

-    با توجه به نیازهای خود می توانید گزینه Place solution and project in the same directory را نیز فعال کنید.

-    روی گزینه Next کلیک کنید.

-    در پنجره Additional Information گزینه NET 5.0 را به عنوان فریم ورک نهایی انتخاب کرده و گزینه Authentication Type را روی None تنظیم کنید.

-   اطمینان حاصل کنید که گزینه های Enable Docker، Configure for HTTPS و Enable Razor runtime compilation غیرفعال باشند چرا که به آنها نیازی نداریم.

حال شما یک پروژه جدید ساختید که می توانید از آن برای استفاده از فیلترها در ASP.NET Core MVC 5 استفاده کنید.

آشنایی با فیلترهای Action در ASP.NET Core MVC 5

اکشن فیلترها در ASP.NET Core MVC 5 را می توان قبل و بعد از اجرای یک متد اکشن فراخوانی کرد. علاوه بر این شما می توانید از فیلترهای اکشن شخصی سازی شده نیز استفاده کنید تا بتوانید کدهایی که قابلیت استفاده مجدد دارند را قبل و بعد از اجرای یک متد اکشن اجرا کنید.

امروزه با توجه به ارث بردن از رابط IActionFilter این امکان برای شما فراهم شده است تا فیلترهای اکشن کاملا شخصی سازی شده را بسازید و اعضای آن را به طور کامل پیاده سازی کنید. با کمک قطعه کد زیر شما می توانید یک فیلتر اکشن ساده را در ASP.NET Core MVC 5 ساخته و از آن استفاده کنید:

public class CustomActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Executed before execution of an action method
        }
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Executed after execution of an action method
        }
    }

در ادامه نسخه async از فیلتر اکشن سفارشی سازی شده بالا را به شما ارائه می دهیم:

public class CustomActionFilter : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext
        context, ActionExecutionDelegate next)
        {
            //Executed before execution of an action method
            await next();
            //Executed after execution of an action method
        }
    }

قطعه کد زیر نیز به شما نشان می دهد که چگونه می توانید فیلتر اکشن سفارشی سازی شده را ثبت کنید:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers(config =>
            {
                config.Filters.Add(new CustomActionFilter());
            });
            services.AddControllersWithViews();
        }

فیلترهای اعتبارسنجی از مهم ترین فیلترها در ASP.NET Core MVC

فیلترهای اعتبارسنجی در ابتدای یک درخواست در پایپ لاین و قبل از هر یک از انواع فیلترها در ASP.NET Core MVC 5 اجرا می شوند. از این فیلترها برای تایید اعتبار کاربر استفاده می شود تا مشخص شود که آیا کاربر اجازه دسترسی به منابع خاص را دارد یا خیر؟

قطعه کد زیر نشان می دهد که چگونه می توانید یک فیلتر اعتبارسنجی شخصی سازی شده را در ASP.NET Core MVC 5 برای خود بسازید:

public class AuthorizeActionFilter : IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationFilterContext context)
        {
           //Write you code here to authorize or unauthorize the user
        }
    }

مثال هایی از فیلترهای اعتبارسنجی

قطعه کدی که در ادامه به شما ارائه می دهیم نشان می دهد که چگونه می توانید یک فیلتر اعتبارسنجی شخصی سازی شده را پیاده سازی کنید که بتوان از آن برای محدود کردن دسترسی به یک متد اکشن خاص استفاده کرد:

public class CustomHttpsOnlyFilter : Attribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            if (!context.HttpContext.Request.IsHttps)
               context.Result = new ForbidResult();
        }
    }

قطعه کد بعدی نیز نشان می دهد که چگونه می توانید از این فیلتر شخصی سازی شده اعتبارسنجی روی یک متد اکشن استفاده کنید:

public class HomeController : Controller
    {
        [CustomHttpsOnlyFilter]
        public string Index()
        {
            return "Hello World!";
        }
    }

فیلترهای منابع در ASP.NET Core MVC

این فیلترها در ASP.NET Core MVC بلافاصله بعد از اعتبارسنجی اجرا می شوند یعنی دقیقا بعد از این که اجرای فیلترهای اعتبارسنجی به اتمام رسید این فیلترها در ASP.NET Core MVC اجرا خواهند شد. شما می توانید از این فیلترها برای کش کردن اطلاعات استفاده کرده و از مزایای آنها بهره مند شوید.

قطعه کد زیر نشان می دهد که چگونه می توانید با ارث بردن از رابط IResourceFilter و سپس پیاده سازی متدهای OnResourceExecuting و OnResourceExecuted یک فیلتر منابع را پیاده سازی کنید:


public class CustomResourceFilterAttribute : Attribute, IResourceFilter
{
    public void OnResourceExecuting(ResourceExecutingContext context)
    {
        context.Result = new ContentResult()
        {
            Content = "This is a Resource filter."
        };
    }
    public void OnResourceExecuted(ResourceExecutedContext context)
    {
    }
}

فیلتر نتایج از دیگر انواع فیلترها در ASP.NET Core MVC

در ASP.NET Core MVC فیلترهای نتایج را می توان قبل یا بعد از اجرای فیلترهای اکشن اجرا کرد. شما می توانید فیلتر نتایج شخصی سازی شده خود را بسازید که این کار با ارث بردن از رابط IResultFilter یا IAsyncResultFilter صورت می گیرد. رابط IResultFilter شامل پیاده سازی دو متد مهم است که این دو متد عبارت اند از OnResultExecuting و OnResultExecuted. متد اول قبل از این که نتیجه ارائه شده توسط متد اکشن پردازش شود اجرا شده و متد دوم دقیقا بلافاصله بعد از پردازش نتایج اجرا می شود.

قطعه کد زیر نحوه استفاده از فیلتر نتایج سفارشی سازی شده را به شما نمایش می دهد:

public class CustomResultFilter : Attribute, IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            context.Result = new ViewResult
            {
                ViewName = "Hello"
            };
        }
         public void OnResultExecuted(ResultExecutedContext context)
        {
        }
    }

برای امتحان کردن قطعه کد بالا ابتدا اقدام به ساخت یک view کرده و نام آن را Hello قرار دهید. سپس می توانید قطعه کد زیر را در کلاس controller خود وارد کرده تا نتایج را مشاهده کنید:

[CustomResultFilter]
public ViewResult Index() => View();

دقت داشته باشید زمانی که شما اپلیکیشن را اجرا می کنید view که به تازگی ایجاد کرده اید در مرورگر وب مشاهده نمی شود.

فیلترهای خطا و Exception در ASP.NET Core MVC

فیلترهای Exception از دیگر انواع فیلترها در ASP.NET Core MVC هستند که برای مقابله با خطاها و Exception در کل پایپ لاین اجرا می شوند. شما می توانید از این فیلترها در ASP.NET Core MVC استفاده کنید تا سیاست های کلی برای مقابله با خطاها را اجرا نکرده و کدهای سفارشی سازی شده را اجرا کنید.

برای ساخت یک فیلتر استثنا باید یک کلاس ایجاد کنید که از رابط IExceptionFilter ارث برده باشد و تمامی اعضای آن را نیز پیاده سازی کرده باشد. اگر قصد دارید فیلترهای سفارشی خود را پیاده سازی کنید باید از یک کلاس abstract به نام ExceptionFilterAttribute ارث ببرید و متد OnException از این کلاس را بازنویسی کنید. به خاطر داشته باشید که کلاس ExceptionFilterAttribute در واقع رابط IExceptionFilter را پیاده سازی می کند.

نمونه کد زیر نحوه انجام این کار را به طور کامل به شما نمایش می دهد:

public class CustomExceptionFilter : Attribute, IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            context.Result = new ViewResult()
            {
                StatusCode = (int)HttpStatusCode.BadRequest,
                ViewName = "Error"
            };
            context.ExceptionHandled = true;
        }
    }

فیلترها در ASP.NET Core MVC به شما اجازه می دهند تا یک قطعه کد سفارشی سازی شده را قبل یا  بعد از یک نقطه خاص در پایپ لاین اجرا کنید. این کار باعث می شود تا از تکرار کد در بخش های مختلف برنامه جلوگیری شود. شما می توانید این قطعه کدها را براساس ترتیب های مختلف اجرا کرده و از مزایای آنها بهره مند شوید. 

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید