25

Feb

[TIP] ASP.NET Custom Handler + Session

Ciao a tutti

 

sappiamo che con ASP.NET è possibile registrare degli handler custom per generare a Runtime dei files (più precisamente delle response) che non siano statici (presenti) sul web-server, e che non puntino a pagine (aspx) o controller mvc

 

Per creare un custom handler in ASP.NET è sufficiente creare una classe che implementi l’interfaccia IHttpHandler

namespace WebApplication1
{
    public class MyHandler : IHttpHandler
    {
        public bool IsReusable
        {
            // Return false in case your Managed Handler cannot be reused for another request.
            // Usually this would be false in case you have some state information preserved per request.
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Write("ciao!");
            context.Response.Flush();
        }
    }
}

per l’utilizzo, questo handler va poi registrato nel web.config, nella sezione system.webserver per IIS o IIS-express (o nella vecchia sezione system.web se usiamo il web-server demo di VS il Cassini)


 
             path="myhandler.axd"
         verb="GET"
         type="WebApplication1.MyHandler,WebApplication1"/>
 

image

 

in alternativa, è possibile registrare l’handler in un route di asp.net (come per i controller mvc) implementando in una qualunque altra classe l’interfaccia IRouteHandler per poi tornare il corretto Handler da fare route:

public class MyHandler : IHttpHandler, IRouteHandler
{
    public bool IsReusable { get { return true; } }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.Write("ciao!");
        context.Response.Flush();
    }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return this;
    }
}

 

regitriamo il route nell’application start del file Global.asax (nel caso da aggiungere tramite il tool add-new item)

protected void Application_Start(object sender, EventArgs e)
{
    RouteTable.Routes.Add(new Route("handler/my", new MyHandler()));
}

 

se però nel nostro handler abbiamo bisogno di avere accesso alla sessione utente, eventualmente per usarla come scambio temporaneo di un parametro ID o simili – si sconsiglia di metterci dentro valori di grande dimensioni come elaborazioni e dati DB – alternativamente a passare parametri in query-string ovviamente visibili all’utente, dobbiamo implementare anche una ulteriore interfaccia: IRequiresSessionState

 

public class MyHandler : IHttpHandler, IRouteHandler, IRequiresSessionState
{
    public bool IsReusable { get { return true; } }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.Write(context.Session["SESSION START TIME"]);
    }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return this;
    }
}

 

e aggiornare – ad esempio – il global.asax per aggiungere un parametro in sessione

protected void Session_Start(object sender, EventArgs e)
{
    Session["SESSION START TIME"] = DateTime.UtcNow;
}

avendo questo risultato:

image

 

 

a presto

by Antonio Esposito on 2/25/2013