Tipicamente l'associazione di un HttpHandler ad un particolare URL avviene in maniera statica, impostando in maniera opportuna la sezione httpHandlers (o handlers, nel caso in cui ci troviamo in integrated mode) del web.config.
Questo approccio ha però il limite di lasciare poco spazio ad eventuali personalizzazioni della logica secondo cui gli handler vengono selezionati e quindi invocati: in scenari complessi, ad esempio, potremmo avere la necessità di eseguire un particolare HttpHandler piuttosto che un altro a seconda di un parametro, o vorremmo poter sfruttare il medesimo tipo su diversi URL, magari impostandone alcune proprietà; ancora, potremmo voler sfruttare il nostro engine di IoC la costruzione dell'handler stesso.
In tutti questi casi, alla rigidità di un file di configurazione può essere preferito l'URL routing, da ASP.NET 4 supportato anche in applicazioni Web Forms, per sua natura molto più flessibile e idoneo a esigenze custom. In particolare, nel global.asax possiamo pensare di configurare nel una route come la seguente:
public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { this.ConfigureRoutes(); } private void ConfigureRoutes() { RouteTable.Routes.Add("handler", new Route("{handlerName}.ashx", new RouteValueDictionary(new { handlerName = "customers" }), new RouteValueDictionary(new { handlerName = @"customers|providers" }), new HandlerFactory())); } }
Questa route, ad esempio, risponde agli indirizzi /customers.ashx e /providers.ashx (attenzione al fatto che l'estensione è assolutamente non necessaria), e ci dà la possibilità di definire constraint, valori di default, e anche eventuali ulteriori parametri. Quando perviene una richiesta che ne soddisfa i requisiti, essa risponde invocando una classe HandlerFactory, che implementa l'interfaccia IRouteHandler:
public class HandlerFactory : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { var handlerName = requestContext.RouteData.Values["handlerName"] as string; if (handlerName == null) { throw new InvalidOperationException("Invalid route data"); } var result = new PersonSearchHandler(); result.SearchMode = handlerName == "customers" ? SearchModes.Customers : SearchModes.Providers; return result; } }
Nel nostro caso, l'oggetto restituito è sempre un PersonSearchHandler che, a seconda dell'url (e quindi del parametro handlerName in input), viene configurato per cercare tra i Customers piuttosto che tra i Providers. Si tratta, ovviamente, di un esempio banale, che dà però l'idea della flessibilità che questa tecnica ci garantisce: nulla vieta, infatti, di configurare più di una factory, o di introdurre logiche più complesse, magari sfruttando un IoC container per iniettare dipendenze all'interno dell'oggetto creato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Generare velocemente pagine CRUD in Blazor con QuickGrid
Eseguire i worklow di GitHub su runner potenziati
Ottenere un token di accesso per una GitHub App
Implementare il throttling in ASP.NET Core
Sostituire la GitHub Action di login su private registry
Esportare ed analizzare le issue di GitHub con la CLI e GraphQL
Utilizzare le collection expression in C#
Supportare lo HierarchyID di Sql Server in Entity Framework 8
Gestire la cancellazione di una richiesta in streaming da Blazor
Come EF 8 ha ottimizzato le query che usano il metodo Contains
Eseguire una GroupBy per entity in Entity Framework
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
I più letti di oggi
- anche domani dalle 17:30 seguite con noi live #build15 https://aspit.co/build15
- Webcast 'AJAX & ATLAS Overview'
- a #igds il 25 e 26/10 a Milano puoi sviluppare un gioco per #wp8 con @AppCampus. in palio 70.000 Euro: https://aspit.co/apa
- WinJS in Windows Phone 8.1
- la RC di #vs13 è compatibile con #win81 RTM, non con la Preview. l'annuncio ufficiale è su https://aspit.co/any
- Ancora un bug: esce Mono 0.23
- SSL Certificates for everyone on Azure
- Mostrare una MessageBox con un custom control
- disponibile la preview 1 ci #dotnetcore 2.1, #aspnetcore, #efcore. performance, novità e migliorie su https://aspit.co/bmf
- si continua a #netconfit con 'developing modern web apps with #aspnetcore', con il nostro @dbochicchiohttps://aspit.co/netconf-18