Newsgroup: it.comp.lang.delphi
Titolo: [BDS2006] Usare IHTTPHandler

Salve.
La documentazione MS disponibile qui:
http://msdn2.microsoft.com/en-us/library/system.web.ihttphandler_members.aspx
e relativi esempi, parlano di una pagina ASPX, questo mi fa pensare che
dovrei usare la pagina in mixed mode, vale a dire che va compilata al
volo e questo mi seccherebbe tanto tanto tanto.
Esiste un modo senza usare il codice direttamente nella pagina ASPX per
collegare un assembly Delphi.NET e dire ad IIS di richiamarla?
Qualche delucidazione?
Grazie in anticipo,
Andrea

 Qualche delucidazione?
Forse non ho capito il problema, però se desideri creare un HTTPHandler, 
non è sufficiente creare una classe che implementi l'interfaccia 
*IHttpHandler* e compilarla all'interno dell'assembly sottoforma di DLL 
che contiene il codice della tua applicazione 
ASP.NET
, aggiungendo poi 
al file "web.config" la chiave di configurazione apposita per renderlo 
operativo?
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

   Marco.
Andrea

 AutoEventWireup="false" Inherits="System.TObject" %>
Ci sono molte cose che mi lasciano perplesso. Se non disponi di un 
server web IIS su cui puoi intervenire a livello di amministrazione 
della macchina, non puoi configurare il compilatore Delphi.NET per poter 
sfruttare questo linguaggio nel "code inline" della pagina, quindi 
l'attributo Language="Delphi" dovrai sostituirlo con C# o VB.
Dato che hai specificato Codebehind="MyHTTPHandler.pas", significa poi 
che hai una unit in cui è contenuto il codice dell'handler HTTP e, 
pertanto, puoi benissimo fare riferimento a quella classe nella 
configurazione dell'handler in quanto verrà compilata nella DLL generata 
per l'applicazione 
ASP.NET
 (in codice intermedio).
Considerando questi fattori, non capisco quindi il ruolo di 
Inherits="System.Object".
Non ho ancora approfondito l'argomento, e in passato mi è capitato di 
creare solamente degli "HTTP Modules", ma non credo sia necessario 
disporre di una pagina per introdurre un handler HTTP nell'applicazione 
ASP.NET
. Basta creare una classe che implementi l'opportuna interfaccia, 
compilarla all'interno della DLL per l'applicazione 
ASP.NET
 che 
conterrà, presumubilmente, anche il codice delle pagine che 
costituiscono l'applicazione stessa, e infine aggiungere la chiave nel 
file di configurazione "web.config" per rendere operativo l'handler, 
specificare gli indirizzi che deve gestire e la classe che si prende 
cura di farlo, quella che hai scritto precedentemente.
Per curiosità, qual è lo scopo finale per cui hai deciso di implementare 
un HTTP handler?
Potrebbe essere materiale interessante per una nuova pillolina... :-P


   Marco.
Andrea

 zero bytes? Questo non capisco...
Un "HTTP Handler", come dice il nome stesso, si occupa di gestire una 
particolare richiesta HTTP con le modalità e le opzioni previste così 
come configurato nel file "web.config".
La pagina in questo caso non c'entra nulla. Non devi scrivere alcun file 
.aspx. Devi solo creare una classe che implementi l'interfaccia 
specifica *IHttpHandler*, quindi i metodi previsti da questa interfaccia 
che avranno il compito di gestire l'input e l'output per una determinata 
richiesta HTTP.
Non c'è alcuna pagina ASPX in gioco. O meglio, potresti configurare il 
tuo handler per essere richiamato ad ogni richiesta di una pagina ASPX, 
ad esempio, ma non è necessario introdurre pagine, né ereditare esse da 
classi particolari, nulla di tutto questo.
Occorre semplicemente indicare ad IIS, attraverso il file "web.config", 
che esiste un handler da invocare quando al server viene inoltrata una 
determinata richiesta.
Per fare un esempio pratico con cui hai sicuramente già avuto a che 
fare, basta citare l'handler che si occupa del "tracing" in 
ASP.NET
: 
esiste un handler di questo meccanismo che può essere invocato 
richiedendo la pagina (virtuale, inesistente, fittizia) che corrisponde 
l'indirizzo "trace.axd"; l'handler che intercetta tale tipo di richiesta 
interviene e restituisce un output HTML con i dati raccolti durante il 
tracing in forma tabellare.
In ogni caso, non esiste alcun legame - necessario, s'intende - tra 
l'handler e le singole pagine.
Se consulti la "Microsoft .NET SDK Documentation" relativo a questo 
argomento, ci sono tutte le istruzioni che servono.


   Marco.
Andrea

 Qualche delucidazione?
Allora, dopo essere tornato da Londra, ho trovato un
esempio by DrBob di come funziona.
Seguendo come sta messo lě il web.config adesso accetta l'HTTPHandler,
purtroppo perň dice di non riuscire a caricare il tipo(cosa abbastanza
curiosa, se chiedete a me).
Ecco il codice dell'handler:
   TMyHTTPHandler = class( TObject, IHttpHandler )
   public
     procedure ProcessRequest(context: HttpContext);
     function get_IsReusable: Boolean;
   end;
implementation
function TMyHTTPHandler.get_IsReusable: Boolean;
begin
   Result := True;
end;
procedure TMyHTTPHandler.ProcessRequest(context: HttpContext);
var ResponseStr : String;
     Doc : TDocument;
begin
   Doc := TDocument.Create;
   Doc.Title := 'Test handler';
   Doc.Heading := 'This ěs a heading';
   Doc.Content := 'This is a content';
   ResponseStr := IHttpDocument( Doc ).AsHtml;
   context.Response.Write( ResponseStr );
   Doc.Free;
end;
Al solito, si tratta di una implementazione molto di base( la classe 
TDocument č altrettanto banalmente semplice).
L'unico mio dubbio č che potrebbe esistere una interfaccia IHTTPDocument
dichiarata da qualche altra parte(ma con i namespace dovrei specificarla 
se fosse diversa, no?).
Il fatto che non riesce a caricarlo non puň dipendere dal fatto che il 
namespace č dichiarato male in quanto ho seguito le regole di Delphi e
Reflector conferma che non ho fatto 'azzate.
Reflector conferma anche che riesce a caricare il tipo(altrimenti
andrebbe in errore, no?), quindi ho finito le idee.
Qualche intuizione brillante/colpo di genio?
Grazie in anticipo,
Andrea

> Qualche intuizione brillante/colpo di genio?
Needless to say... facendo cut&paste da Reflector sul nome
dell'assembly, improvvisamente funziona.
Chissà che differenza c'era!
Andrea

 curiosa, se chiedete a me).
Devi postare il contenuto specifico del file "web.config" per vedere se 
il riferimento alla classe è corretto.
Ricordati che l'assembly generato da Delphi ripone la classe in un 
"namespace" che è determinato dalla parte del nome della unit che 
precede l'ultimo punto.
Es.
la unit "Company.Product.Section.AName"
equivale al namespace
"Company.Product.Section"
