Sobes.tech
Middle+

Kaip taikote filtrus C# pipeline'ose? Ar galite pateikti jų naudojimo pavyzdžių?

sobes.tech AI

Atsakymas iš AI

C# konvejeriu filtra naudojami norint įrašyti ir įsikišti į įvairius užklausos apdorojimo ar užduoties vykdymo etapus. ASP.NET Core žiniatinklio programose jie leidžia pridėti logiką prieš, po ar vykdant veiksmų metodus kontroleryje, taip pat kitų užklausų apdorojimo lygiu.

ASP.NET Core filtru pavyzdžiai:

  1. Autentifikacija ir leidimas (Authentication/Authorization Filters): Nustato, ar vartotojas turi teisę atlikti tam tikrą veiksmą.

    // Autorize atributas pavyzdys
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Resursų filtrai (Resource Filters): Vykdomi pirmieji po autorizacijos filtrais. Jie gali atlikti talpyklos kaupimą arba nutraukti konvejerį.

    // Resursų filtrų pavyzdys talpyklos kaupimui
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Logika prieš veiksmą
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Logika po veiksmų, bet prieš atsakymo įrašymą
        }
    }
    
  3. Veiksmų filtrai (Action Filters): Vykdomi prieš ir po kontrolerio veiksmų metodo vykdymo. Tinka duomenų validacijai, žurnalavimui ar rezultatų keitimui.

    // Veiksmų filtrų pavyzdys žurnalavimui
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Logika prieš veiksmą
            Console.WriteLine($"Executing action: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Logika po veiksmų
            Console.WriteLine($"Executed action: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Veiksmų filtro taikymas kontrolerio metodui
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Išimčių filtrai (Exception Filters): Apdoroja neapdorotas išimtis, kurios įvyksta vykdant veiksmų metodą ar kitus filtrus.

    // Išimčių apdorojimo filtro pavyzdys
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Išimties apdorojimo logika
            context.Result = new ContentResult()
            {
                Content = "An error occurred.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Nurodome, kad išimtis apdorota
        }
    }
    
    // Išimčių filtro taikymas kontroleriui
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Something went wrong!");
        }
    }
    
  5. Rezultatų filtrai (Result Filters): Vykdomi prieš ir po veiksmų rezultatų metodo vykdymo (pvz., prieš ar po ViewResult, JsonResult ir kt.).

    // Rezultato keitimo filtro pavyzdys
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Logika prieš rezultatą
            Console.WriteLine($"Executing result type: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Logika po rezultatą
            Console.WriteLine($"Executed result type: {context.Result.GetType().Name}");
        }
    }
    

Filtrai gali būti taikomi globaliai (visiems užklausoms), kontrolerio lygyje arba konkretaus veiksmo metodo lygyje. Jų vykdymo tvarka konvejuje nustatoma jų tipu.