web-dev-qa-db-fra.com

Des modules HTTP et des gestionnaires HTTP dans ASP.Net MVC?

On m'a posé une question en entrevue sur la façon de mettre en œuvre HTTP module et HTTP handler dans ASP.Net MVC. Je sais qu'ils sont utilisés dans ASP.Net pour écrire la logique de prétraitement avant l'appel de la page aspx. Mais dans ASP.Net MVC, nous avons des filtres pour cela, donc je leur ai dit que nous utilisons des filtres pour cela. Ai-je donné la bonne réponse?

17
rohit singh

( Filtres d'action vous permet de vous connecter uniquement aux événements spécifiques MVC , tandis que les modules HTTP vous permettent de vous connecter à ASP.Net événements . Donc, même dans MVC, pour implémenter un module HTTP et un gestionnaire HTTP, vous devrez implémenter l'interface correspondante.

  • Si vous souhaitez que votre fonctionnalité ne soit exécutée qu'une seule fois par demande Http, vous devez utiliser un HttpModule.
  • ActionFilters peut être exécuté plusieurs fois en un seul trajet vers le serveur.

Pour expliquer les modules HTTP et les gestionnaires HTTP, le module HTTP et le gestionnaire HTTP sont utilisés par MVC pour injecter une logique de prétraitement dans la chaîne de demande.

  • Les gestionnaires HTTP sont des préprocesseurs basés sur les extensions tandis que les modules HTTP sont des préprocesseurs basés sur les événements.
    • Par exemple: si vous voulez changer la façon dont les fichiers jpg sont traités, vous implémenterez un gestionnaire HTTP personnalisé par rapport à si vous voulez exécuter des fichiers supplémentaires lors du traitement de la demande, vous implémenterez un module HTTP personnalisé. Il n'y a toujours qu'un seul gestionnaire HTTP pour une demande spécifique mais il peut y avoir plusieurs modules HTTP.

Pour implémenter un gestionnaire HTTP:

Vous implémentez la classe IHttpHandler et implémentez la méthode ProcessRequest et la propriété IsResuable. La propriété IsResuable détermine si le gestionnaire peut être réutilisé ou non.

public class MyJpgHandler: IHttpHandler 
{

    public bool IsReusable => false;

    public void ProcessRequest(HttpContext context) 
    {
       // Do something
    }
}

Ensuite, nous devons spécifier quel type de demande sera traité par notre gestionnaire personnalisé dans web.config fichier:

<httpHandlers>
    <add verb="*" path="*.jpg" type="MyJpgHandler"/>
</httpHandlers>

Pour implémenter un module HTTP:

Nous devons implémenter IHttpModule et enregistrer les événements requis dans la méthode Init. À titre d'exemple simple, si nous voulions enregistrer toutes les demandes:

public class MyHttpModule: IHttpModule 
{

    public MyHttpModule() {}

    public void Init(HttpApplication application) 
    {
        application.BeginRequest += new EventHandler(this.context_BeginRequest);
        application.EndRequest += new EventHandler(this.context_EndRequest);
    }

    public void context_BeginRequest(object sender, EventArgs e) 
    {
        StreamWriter sw = new StreamWriter(@ "C:\log.txt", true);
        sw.WriteLine("Request began at " + DateTime.Now.ToString());
        sw.Close();
    }

    public void context_EndRequest(object sender, EventArgs e) 
    {
        StreamWriter sw = new StreamWriter(@ "C:\log.txt", true);
        sw.WriteLine("Request Ended at " + DateTime.Now.ToString());
        sw.Close();
    }

    public void Dispose() {}
}

Et enregistrez notre module dans web.config fichier:

<httpModules>
    <add name="MyHttpModule " type="MyHttpModule " />
</httpModules>
23
Ujain