مقدمة في Filters
-
تُستخدم عوامل التصفية Filters في ASP.NET Core لتشغيل التعليمات البرمجية قبل أو بعد مراحل معينة في مسار معالجة الطلب request processing pipeline. هناك العديد من built-in filters ل authorization, logging, caching, exception handling وما إلى ذلك. تساعد الفلاتر أيضًا في تجنب تكرار التعليمات البرمجية عبر action methods. ويمكن أيضًا إنشاء عوامل تصفية مخصصة للتعامل مع التطبيقات بالطريقة التي تريدها.
تمام خلونا نفهم الموضوع بمثال، وبنكمل شغل على مشروعنا StudnetAcadmey
اول شي لازم نعملو نعدل على ملف Startup.cs لتمكين ونفعيل MVC framework و Middlewares المطلوبة في المشروع تأكد من الكود يكون مثل الكود التالي:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Filters
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
النقطة الثانية المهمه التأكد من تثبيت Bootstrap Package في المشروع.
اكيد حكينا عن Bootstrap واذا نسيت هو CSS framework يستخدم في front-end web development من اجل انشاء واجهات أمامية للتطبيقات بحيث تكون متناسقة ومناسبه لجميع الاحجام مثل الهاتف المحمول اجهزة iPad ... الخ. مشان هيك من الضروري بتثبيت حزمة Bootstrap في المشروع واكيد هي موجوده في مشروعنا لان استخدمناه سابقا في اكثر من مكان. يمكنك التحقق من كيفية تثبيت حزمة Bootstrap في تطبيق ASP.NET Core في Visual Studio بالرجوع الى الدرس : تثبيت Bootstrap Package
تضمين Built-in Tag Helpers في Views
كمان هذه الخطوه عملناها من قبل وللتذكير بكيفة عملها انتقل الى المجلد Share داخل مجلد Views ، ومن ثم أضف ملف Razor View Imports داخل مجلد Share باسم ViewImports_ وضيف الكود التالي:
@using StudentsAcademy
@using StudentsAcademy.Models
@using Microsoft.AspNetCore.Http
@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
تفعيل [RequireHttps] attribute .

public string Index()
{
return "This is the Index action on the Home controller";
}
https://localhost:44382/filter

http://localhost:44382/filter

http://localhost:44382/filter/Index
https://localhost:44382/filter/Index
Filter | Interfaces التي تحتويه | الوصف |
Authorization | IAuthorizationFilter, IAsyncAuthorizationFilter | تستخدم لتطبيق authorization and security policy |
Action | IActionFilter, IAsyncActionFilter | يستخدم لأداء عمل محدد مباشرة قبل أو بعد تنفيذ action method |
Result | IResultFilter, IAsyncResultFilter | يستخدم لأداء عمل محدد مباشرة قبل أو بعد معالجة النتيجة من action method |
Exception | IExceptionFilter, IAsyncExceptionFilter | تستخدم للتعامل ومعالجة الاستثناءات مع exceptions |
- Authorization Filters
- Action Filters
- At the last the Result Filters
ال Filters الخاصه ب Exception عند حدوث استثناءات في التطبيق.
تمام خلونا نحكي شوي عن هذه الاناع ونحاول نفهم كيف بنستخدمها.
Authorization Filters
يتم استخدام Authorization Filters لغرض اعطاء authorization وإنشاء security policy. يتم تنفيذ هذه filters قبل أي Filter آخر وحتى قبل تنفيذ action method . وهذا filters يستخدم معو IAuthorizationFilter او IAsyncAuthorizationFilter الى هم interface
طريقة التعريف ل IAuthorizationFilter
namespace Microsoft.AspNetCore.Mvc.Filters {
public interface IAuthorizationFilter : IFilterMetadata {
void OnAuthorization(AuthorizationFilterContext context);
}
}
using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Mvc.Filters {
public interface IAsyncAuthorizationFilter : IFilterMetadata {
Task OnAuthorizationAsync(AuthorizationFilterContext context);
}
}
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace StudentsAcademy.CustomFilters
{
public class HttpsOnly : Attribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
if (!context.HttpContext.Request.IsHttps)
context.Result = new StatusCodeResult(StatusCodes.Status403Forbidden);
}
}
}
using Microsoft.AspNetCore.Mvc;
using StudentsAcademy.CustomFilters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace StudentsAcademy.Controllers
{
public class FilterController : Controller
{
[HttpsOnly]
public string Index()
{
return "This is the Index action on the filter controller";
}
}
}
http://localhost:44382/filter

namespace Microsoft.AspNetCore.Mvc.Filters {
public interface IActionFilter : IFilterMetadata {
void OnActionExecuting(ActionExecutingContext context);
void OnActionExecuted(ActionExecutedContext context);
}
}
الاسم | الوصف |
Controller | اسم controller التي سيتم استدعاء action method. |
Result | هذه الخاصية من النوع IActionResult. إذا تم تعيين هذه الخاصية على قيمة من النوع IActionResult ، فإن MVC يعرض IActionResult بدلاً من استدعاء action method. |
الاسم | الوصف |
Controller | اسم controller التي تم استدعاء أسلوب عملها. |
Exception | تحتوي هذه الخاصية على الاستثناء الذي حدث في Action method. |
ExceptionHandled | عندما تقوم بتعيينها على true ، فلن يتم نشر الاستثناءات. |
Result | تقوم هذه الخاصية بإرجاع IActionResult الذي تم إرجاعه بواسطة action method ، ويمكنك تغييره أو استبداله إذا كان لديك حاجة. |
using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Diagnostics;using Microsoft.AspNetCore.Mvc;using Microsoft.AspNetCore.Mvc.Filters;namespace StudentsAcademy.CustomFilters{ public class TimeElapsed : Attribute, ActionFilter { private Stopwatch timer; public void OnActionExecuting(ActionExecutingContext context) {timer = Stopwatch.StartNew(); } public void OnActionExecuted(ActionExecutedContext context){timer.Stop();string result = " Elapsed time: " + "{timer.Elapsed.TotalMilliseconds} ms" IActionResult iActionResult = context.Result;((ObjectResult)iActionResult).Value += result; } }}
timer = Stopwatch.StartNew();
timer.Stop();
[TimeElapsed]
using Microsoft.AspNetCore.Mvc;
using StudentsAcademy.CustomFilters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace StudentsAcademy.Controllers
{
public class FilterController : Controller
{
[TimeElapsed]
public string Index()
{
return "This is the Index action on the filter controller";
}
}
}

using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StudentsAcademy.CustomFilters
{
public class TimeElapsedAsync : Attribute, IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
Stopwatch timer = Stopwatch.StartNew();
await next();
timer.Stop();
string result = "<div>Elapsed time: " + $"{timer.Elapsed.TotalMilliseconds} ms</div>";
byte[] bytes = Encoding.ASCII.GetBytes(result);
await context.HttpContext.Response.Body.WriteAsync(bytes, 0, bytes.Length);
}
}
}
اترك تعليقك