none
ASP.NET, HttpHandlers, HttpContext et évènements RRS feed

  • Question

  • Bonjour,

    voilà je suis débutant en ASP.NET,et je rencontre actuellement un problème.
    Je suis développe une architecture n-tiers avec une couche présentation, une couche applicative, une couche entreprise, et une couche persistance.

    Le problème se situe dans ma couche de présentation. En effet, j'ai réalisé un HttpHandler qui intercepte donc l'url, et traite celui-ci.

    public void ProcessRequest(HttpContext context)
    {
    
                // Keep the outpout
                TextWriter outpout = HttpContext.Current.Response.Output;
    
                // Instanciate the corresponding controller
                IControlleur ctrl =  ServiceFactory.GetServiceGeneric(KnownAssociationsController[context.Request.Path]);
    
                // Initialize the controller (and create the view reagrding virtual Path)
                HttpSessionState sessionState = context.Session;
                ctrl.Init();
    
                // Get the controller View and execute the page
                HttpContext.Current.Server.Execute(ctrl.GetView() as IHttpHandler, outpout, true);
    
    }


    Je lui passe donc en paramètre mon HttpContext courant, je récupère le flux d'écriture, je récupère une instance de mon "controlleur" via la méthode ServiceFactory.GetServiceGeneric, initialise mon controlleur et exécute la vue.

    Et c'est là que tout se complique ! dans une WebForm, j'ai un bouton qui rappatrie une liste d'objet depuis ma Base de Données SQL Server 2005. Une fois que j'ai cliqué sur ce bouton, la première chose qui se passe, dans le process, est l'appel au HttpHandler, avant même de passer dans l'évènement "click" du bouton. Un nouveau controlleur est donc créé, mais à aucun moment, on ne récupère l'ancien context dans lequel est stocké l'évènement "click" en attente...du coup, je ne récupère jamais mes données, ne passe même jamais dans la méthode relative au click...

    Du coup aucun affichage de résultat....

    Je ne suis pas certain d'avoir été assez clair....mais si c'est le cas...pourriez-vous m'aider ? et si ça n'est pas le cas...vos questions sont les bienvenues ;)

    D'avance merci à vous.
    jeudi 30 juillet 2009 09:42

Réponses

  • Merci bien à toi Nikho.

    Cependant, j'ai déjà mes couches d'accès aux données et métiers ;)

    J'ai trouvé la solution finalement. Pour faire simple, une fois le controlleur récupéré, je récupère maintenant la vue par la méthode getView() (personnalisée).
    Puis je cast cette vue en Page, qui implémente HttpHandler.
    Je la cast ensuite en IHttpHandler afin de pouvoir executer la méthode ProcessRequest(HttpContext ctx).
    et je fais donc un page.ProcessRequest(ctx) avec ctx qui correspond au HttpContext passé en paramètre du premier appel ;)

    Partant de là, mon IsPostBack est  à true, alors qu'avant il ne l'etait pas ;)

    public void ProcessRequest(HttpContext context)
            {
                // Instanciate the corresponding controller
                IControlleur ctrl =  ServiceFactory.GetServiceGeneric(KnownAssociationsController[context.Request.Path]);
    
                ctrl.Init();
                
                IHttpHandler pageHandler = ctrl.GetView() as Page;
                pageHandler.ProcessRequest(context);
    
            }

    Ceci est donc solutionné ;) Mais merci tout de même à toi d'avoir pris du temps pour me répondre ;)
    • Marqué comme réponse GregLeOuf jeudi 30 juillet 2009 15:42
    jeudi 30 juillet 2009 15:41

Toutes les réponses

  • Lors d'un click sur le boutton un postback est effectué sur ta page. Il est normal ton handler soit alors. A toi eventuellement de filtrer en fonction des paramètre de l'url et d'effectuer le traitement de ton choix.
    Ceci étant, il semble que tu soit en train d'implémenter un modèle MVC ( ou MVC2 ). Ce  modèle courant en java l'est moins en asp.net ou il existe une gestion côté serveur des composants. On considère parfois que le code behind de la page peut regrouper un partie des traitements dévolu à un controleur. Néanmoins il existe aujourdhui un projet asp.net MVC ( http://www.asp.net/mvc/ ) qui pourrait de simplifier la tache.
    Sinon une architecture n tiers avec couche de service BLL appelées depuis l'IHM,une couche d'accès aux données, et une couche metier peut être une alternative.
    jeudi 30 juillet 2009 14:43
    Modérateur
  • Merci bien à toi Nikho.

    Cependant, j'ai déjà mes couches d'accès aux données et métiers ;)

    J'ai trouvé la solution finalement. Pour faire simple, une fois le controlleur récupéré, je récupère maintenant la vue par la méthode getView() (personnalisée).
    Puis je cast cette vue en Page, qui implémente HttpHandler.
    Je la cast ensuite en IHttpHandler afin de pouvoir executer la méthode ProcessRequest(HttpContext ctx).
    et je fais donc un page.ProcessRequest(ctx) avec ctx qui correspond au HttpContext passé en paramètre du premier appel ;)

    Partant de là, mon IsPostBack est  à true, alors qu'avant il ne l'etait pas ;)

    public void ProcessRequest(HttpContext context)
            {
                // Instanciate the corresponding controller
                IControlleur ctrl =  ServiceFactory.GetServiceGeneric(KnownAssociationsController[context.Request.Path]);
    
                ctrl.Init();
                
                IHttpHandler pageHandler = ctrl.GetView() as Page;
                pageHandler.ProcessRequest(context);
    
            }

    Ceci est donc solutionné ;) Mais merci tout de même à toi d'avoir pris du temps pour me répondre ;)
    • Marqué comme réponse GregLeOuf jeudi 30 juillet 2009 15:42
    jeudi 30 juillet 2009 15:41