Dins del desenvolupament d'aplicacions web cal una peça que enllaci la capa de BBDD (clsDades i "stored procedures" que estan sota) amb les pàgines web que llencen peticions. Per això faig servir els "manejadors generics" (que malament sonen traduïts), "generic handler" (millor). Són com pàgines web però a les que s'ha tret tota la part HTML de .NET. Tenen l'extensió ASHX i estan en .NET des del primer Visual Studio (bé jo només puc afirmar que estan des del VS 2005, el 2003 no estic segur). Al no tenir HTML no tenen ViewState, no gestionen events, al no tenir aquests dos components el seu rendiment és millor que el d'una pàgina ASPX (concretament el pipeline (cadena de muntatge) és més curt), són força ràpids. El seu punt d'entrada és una funció:
public void ProcessRequest(HttpContext context)
Dins de l'objecte HttpContext disposem dels objectes HttpResponse per enviar dades a la pàgina web que invoca al ASHX i l'objecte HttpRequest per recuperar informació que ens envien. Normalment cada taula de la BBDD, o entitat que es vulgui té un ASHX associat. En aquest ASHX es fan les operacions bàsiques (típiques d'un CRUD). A més a més es pot afegir la lògica de negoci (les operacions específiques d'un objecte) que estigui relacionada amb l'objecte. Per exemple si tractem comandes, en el ASHX corresponent a les comandes hi haurà, alta, baixa, actualitzar, obtenir un conjunt de comandes (per muntar un grid), i a més a més també poden existir canvi d'estat de la comanda, tancar comanda, verificar comanda, enviar comanda a algú, autocompletes, etc... (això seria la lògica de negoci). El generador de codi munta un ASHX normal, amb les operacions CRUD ja definides, però no crea la lògica de negoci (no ho pot endevinar). Poso el codi d'un ASHX típic.
public class classificacions : IHttpHandler, IReadOnlySessionState
{
private HttpResponse Resp;
private HttpRequest Req;
private HttpSessionState Ses;
string IdPersona = "";
private Connexions Conn = new Connexions();
private string ConnStr;
public void ProcessRequest(HttpContext context)
{
ConnStr = Conn.GetConnStr();
Resp = context.Response;
Req = context.Request;
Ses = context.Session;
Resp.Cache.SetCacheability(HttpCacheability.NoCache);
Resp.ContentEncoding = Encoding.Default;
Resp.Charset = "ISO-8859-1";
if (Ses["idPersona"] == null)
{
Resp.Write("ERROR: Sessió expirada, torni a validar-se al sistema.");
return;
}
else
{
IdPersona = Ses["idPersona"].ToString();
}
string Action = Req["action"];
switch (Action)
{
case "data":
LoadData();
break;
case "update":
UpdateData();
break;
case "insert":
Insertar();
break;
case "delete":
Delete();
break;
case "loadgrid":
LoadGrid();
break;
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
En posts posteriors anirem desgranant les funcions que estan al switch:
Algunes d'aquestes funcions envien JSON a la part client, concretament LoadData i LoadGrid. Cal doncs una llibreria que converteixi a JSON el resultat. Jo faig servir aquesta. |