2008-09-16 6 views
15

Existe-t-il un bon moyen d'exclure certaines pages de l'utilisation d'un module HTTP?Exclure certaines pages de l'utilisation d'un HTTPModule

J'ai une application qui utilise un module HTTP personnalisé pour valider une session. Le HttpModule est configuré comme celui-ci dans la configuration web:

<system.web> 
    <!-- ... --> 
    <httpModules> 
    <add name="SessionValidationModule" 
     type="SessionValidationModule, SomeNamespace" /> 
    </httpModules> 
</system.web> 

Pour exclure le module de la page, j'ai essayé de le faire (sans succès):

<location path="ToBeExcluded"> 
    <system.web> 
    <!-- ... --> 
    <httpModules> 
     <remove name="SessionValidationModule" /> 
    </httpModules> 
    </system.web> 
</location> 

Toute pensée?

Répondre

11

Vous pouvez utiliser un HTTPHandler au lieu d'un HTTPModule. Les gestionnaires vous permettent de spécifier un chemin lorsque vous les déclarez dans Web.Config.

<add verb="*" path="/validate/*.aspx" type="Handler,Assembly"/> 

Si vous devez utiliser un HttpModule, vous pouvez simplement vérifier le chemin de la demande et si elle est un être exclu, contourner la validation. HttpModules se rattache au pipeline de traitement des demandes ASP.NET lui-même.

+0

J'utilise la même méthode et ça ne marche pas. Je ne sais pas comment c'est la réponse acceptée. – Kehlan

+0

J'ai essayé d'utiliser un gestionnaire à la place, mais cela ne semble pas être applicable car un gestionnaire redirige le contexte http. J'ai demandé à ce sujet ici: http://stackoverflow.com/questions/27124737/asp-net-httphandler-prevents-page-from-loading?noredirect=1#comment42750773_27124737 – user1531921

13

Le module http doit lui-même prendre soin de déterminer les requêtes sur lesquelles il veut agir et celles qu'il veut ignorer. Cela peut, par exemple, être obtenu en examinant la propriété context.Request.Path.

5

Voici un exemple simple de filtrage des requêtes par extension ... l'exemple ci-dessous exclut des fichiers de traitement avec les extensions spécifiques. Filtrage par nom de fichier ressemblera presque le même avec quelques petits changements ...

public class AuthenticationModule : IHttpModule 
{ 
    private static readonly List<string> extensionsToSkip = AuthenticationConfig.ExtensionsToSkip.Split('|').ToList(); 

    // In the Init function, register for HttpApplication 
    // events by adding your handlers. 
    public void Init(HttpApplication application) 
    { 
     application.BeginRequest += new EventHandler(this.Application_BeginRequest); 
     application.EndRequest += new EventHandler(this.Application_EndRequest); 
    } 

    private void Application_BeginRequest(Object source, EventArgs e) 
    { 
     // we don't have to process all requests... 
     if (extensionsToSkip.Contains(Path.GetExtension(HttpContext.Current.Request.Url.LocalPath))) 
      return; 

     Trace.WriteLine("Application_BeginRequest: " + HttpContext.Current.Request.Url.AbsoluteUri); 
    } 

    private void Application_EndRequest(Object source, EventArgs e) 
    { 
     // we don't have to process all requests... 
     if (extensionsToSkip.Contains(Path.GetExtension(HttpContext.Current.Request.Url.LocalPath))) 
      return; 

     Trace.WriteLine("Application_BeginRequest: " + HttpContext.Current.Request.Url.AbsoluteUri); 
    } 
} 

idée générale est de spécifier dans le fichier de configuration exactement ce que doit être traité (ou exclu du traitement) et d'utiliser ce paramètre de configuration dans le module.

+0

Vieille question, mais excellente réponse et exemple de code! La seule suggestion de moi est d'utiliser 'HastSet <>' au lieu de 'List <>' pour extensionsToSkip qui devrait aboutir à des recherches plus rapides et pas de doublons. – BenSwayne

Questions connexes