Newsgroup: it.comp.dotnet
Titolo: [ASP] Intercettare la fine di una richiesta Http

Ciao a tutti,
in una *banalissima* applicazione web ho una classe Foo che necessita di 
intercettare la fine di una richiesta Http.
class Foo
{
	public Foo()
	{
		HttpContext.Current.ApplicationInstance.EndRequest += MyHandler;
	}
	protected void MyHandler(object sender, EventArgs args) { ... }
}
come "verifica" ho sovrascritto il metodo Application_EndRequest in 
Global.asax per vedere che effettivamente la richiesta sia arrivata al 
termine. Morale della favola: il metodo nel global.asax viene 
correttamente richiamato al termine di ogni richiesta ma MyHandler non 
viene mai richiamato.
Qualcuno può aiutarmi? :-)
Grazie,
Giulio

 Giulio
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com/profile/mauro
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

 perchè non un HttpModule?
Oh yeah! :-)
Vado a implementare.
Ciao e grazie,
Giulio
-- 

 perchè non un HttpModule?
Sto implementando la mia soluzione seguendo questo esempio:
http://ryanlanciaux.com/ryanlanciaux/post/NHibernate-Session-Per-Request.aspx
In generale però non riesco a capire una cosa di HttpModule, che potrei 
sintetizzare nelle seguenti domande:
1. siamo sicuri che di istanze del mio FooHttpModule ce ne sarà una solo 
su tutta l'applicazione?
2. supponiamo che implementi il mio http module come segue:
//code
public class MyModule : IHttpModule
{
	public void Dispose() { }
	public void Init(HttpApplication context)
	{
		context.EndRequest += Cleanup;
	}
	protected void Cleanup(object sender, EventArgs args)
	{
		var obj = HttpContext.Current.Items["pippo"];
		((IDisposable)obj).Dispose();
  	}
}
chi (o cosa) è il sender dell'evento EndRequest?
3. potete indirizzarmi verso un po' di buona documentazione?


 Ciao e grazie,


 Non ne ho idea ma attaccare un debugger male non fa :-)
E' proprio perché ho attaccato il debugger che ho fatto la domanda! ;-)
Allora, il tipo è "ASP.global_asax", e la cosa non mi sconvolge. Il 
problema, o meglio il non-problema, è che "s" risulta essere *sempre* la 
stessa istanza dell'applicazione. Questo è perfettamente logico ma, mi 
chiedo, come gestisce la concorrenza ASP visto che l'istanza 
dell'applicazione è la stessa ma ((HttpApplication)s).Request è - 
ovviamente - diversa da richiesta a richiesta? Che parallelizzione c'è? 
Link a riguardo?
Il problema dell'unicità modulo http è (IMVHO) correlato al punto 
precedente. Il mio modulo ha questa struttura (dove IWidget e Widget 
sono classi "convenzionali"):
public class WidgetModule : IHttpModule
{
	protected WidgetModule() { }
	protected virtual void CreateWidget(object s, EventArgs a) {
	        HttpContext.Current.Items[Key] = new Widget();
	}
    	protected virtual void DiscardWidget(object s, EventArgs a) {
	        var widget = (IWidget)HttpContext.Current.Items[Key];
	        widget.Cleanup();
	        widget.Close();
	        widget.Dispose();
	}
	public void Init(HttpApplication context) {
		context.BeginRequest += CreateWidget;
	        context.EndRequest += DiscardWidget;
     	}
	public void Dispose() { }
	public static string Key = "WIDGET";
   	public static IWidget GetWidget() {
		var obj = HttpContext.Current.Items[Key];
	        return (IWidget)obj;
     	}
}
l'accesso a questo modulo viene "mascherato" con una injection factory 
nel container Unity che richiama un metodo STATICO del modulo. Quindi, 
mi chiedo, se dovessero esserci *due* istanze del mio modulo, il metodo 
statico in questione quale richiamerebbe? :-)


Ciao Giulio Petrucci,

non è un problema tuo, nel senso che Context.Items è una per richiesta 
Http, e il metodo statico è uno (punto), quindi accederesti ai dati 
giusti a priori.


 giusti a priori.
Afferrato.
:-)
Grazie,
Giulio
--