Seleziona una pagina

Nel precedente articolo intitolato ASP.NET Core Middleware abbiamo parlato di cosa sono i middleware ed abbiamo visto come usare i middleware buit-in di Microsoft.

Ora vediamo come implementare un semplice custom Middleware che dovrà gestire una blacklist di pagine, se la pagina richiesta si trova all’interno dell’elenco si dovra rispospondere con uno status 404 (page not found).

Per prima cosa creiamo un progetto .Net Core di tipo Class Library

NewProject

ed andiamo ad aggiungere una classe che andiamo a nominare BlackListMiddleware.

La classe BlackListMiddleware sarà il nostro middleware.

NewClass

Andiamo ad aggiungere il costruttore alla classe appena creata, il costruttore avrà un parametro che chiameremo next di tipo RequestDelegate che verrà iniettato con una dependency injection direttamente da Asp.Net, il parametro next è il puntatore al prossimo middleware della pipeline da eseguire.

    public class BlackListMiddleware
    {
        RequestDelegate _next;
        public BlackListMiddleware(RequestDelegate next)
        {
            _next = next;
        }
    }
  

Per poter essere invocato il nostro middleware deve esporre un metodo che dobbiamo chiamare Invoke, nel quale andiamo ad implementare la logica di business.

        public async Task Invoke(HttpContext context)
        {
            var urlToCheck = context.Request.Path;
            if (_urlBlackList.Any(p => urlToCheck.StartsWithSegments(p)))
            {
                context.Response.StatusCode = 404;
            }
            else
            {
                await this._next.Invoke(context);
            }
        }
  

Essendo un progetto dimostrativo la logica di gestione degli indirizzi è semplifcato al massimo e gestito con una lista di stringhe statiche denominato urlToCheck.

Terminata la scrittura del metodo invoke dobbiamo inserire il middleware appena scritto all’interno della pipeline di ASP.NET Core. Procediamo aggiungendo alla nostra soluzione un progetto ASP.NET MVC Core, utilizzando il template di default , che chiameremo BlackListMiddleware.Web.

NewProjectWeb

Per inserire il nostro middleware all’interno della pipeline del nuovo progetto web creato dobbiamo modificare la classe di Startup, del progetto BlackListMiddleware.Web, in questo modo

        public void Configure(IApplicationBuilder app)
        {
            app.UseMiddleware<BlackListMiddleware>();
            app.UseStaticFiles();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
  

A questo punto non ci resta che fare un test, compiliamo ed avviamo la soluzione; selezionando la voce about dal menu dell’applicazione avviata mi aspetto che la risposta sia “404 Page not found”. Il nostro middleware ha fatto il suo lavoro.

Il middleware ora è pronto ad essere utilizzato, possiamo pubblicarlo su nuget e renderlo pubblico, ma prima dobbiamo fare una piccola modifica.

E’ buona prassi creare un’extention alla classe IApplicationBuilder che si occuperà di registrare il nostro middleware all’interno della pipeline, di seguito un esempio:

    public static class BlackListMiddlewareBuilderExtention
    {
        public static IApplicationBuilder UseBlackList(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<BlackListMiddleware>();
        }
    }
  

così la nostra classe di startup diventa:

        public void Configure(IApplicationBuilder app)
        {
            app.UseBlackList();
            app.UseStaticFiles();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
       
  

Ed eccoci giunti al termine il nostro middleware ora e pronto ad essere pubblicato su nuget per la distribuzione, potete trovare il codice sorgente di questo articolo nel mio repository GitHub qui.

Non mi resta che salutarvi ed augurarvi buon divertimento alla scoperta dei middleware e…….

happy coding !!!

Altri Articoli

ASP.NET: Checkbox Seleziona / Deseleziona tutti co...
views 4
Con questo semplice script è possibile utilizzare una sola checkbox che permetta di selezionare o deselezionare tutte le checkbox all'interno ...
Utilizzare un web service con Jquery UI Autocomple...
views 1
Oggi, tra un caffè ed un'altro, ho messo on line una soluzione di esempio per utilizzare un web service (ASMX) come custom datasource per la fu...
Come Migrare le Utenze da ASP.NET Membership a ASP...
views 5
Capita spesso di dover aggiornare le proprie applicazioni da una versione precedente del framework ad una più recente . Con l’avvento di ...
ASP.NET MVC Pubblicare un Post su Facebook con le ...
views 6
Come pubblicare un post sulla bacheca di facebook direttamente dalla nostra applicazione asp.net mvc? Ecco la risposta: http://www.codeproject.com/A...

Fin da bambino sono stato affascinato dall’informatica dove ho i primi approcci con il Commodore 64. Nel 98 ho iniziato ad affacciarmi nel mondo del lavoro ed ho sviluppato applicazioni client/server in VB per una piccola società di Roma. Affascinato da internet sono passato alla programmazione web, che seguo ancora oggi, passando per diverse tecnologie java, php, ASP, ASP.NET. Oggi sono contributors per il progetto ASP.NET Core MVC.