2012-03-01 1 views
1

La documentation MSDN indique:Est-ce que HttpContext.RemapHandler est supposé changer quel gestionnaire traite la requête?

HttpContext.RemapHandler, méthode - Vous permet de spécifier un gestionnaire pour la demande.

J'essaie de déplacer le traitement de la demande d'un gestionnaire à un autre en fonction d'une condition dans le premier gestionnaire. La méthode HttpContext.RemapHandler semble initialiser une instance du deuxième gestionnaire mais n'appelle pas la méthode HttpHandler.ProcessRequest; la réponse est vide. La méthode HttpContext.RemapHandler fait-elle ce que je pense qu'elle devrait faire - transférer le traitement à un nouveau HttpHandler et appeler la méthode HttpHandler.ProcessRequest? Ou devrais-je utiliser une autre approche comme une autre méthode ou un HttpModule?

EDIT: Il s'avère que je devrais utiliser un HTTPHandlerFactory. J'ai la solution qui fonctionne bien maintenant.

Alors, à quoi sert exactement HttpContext.RemapHandler?

Répondre

6

Vous pouvez utiliser HttpContext.RemapHandler que vous avez spécifié, si un autre HttpHandler appels RemapHandler (par exemple ASP.NET MVC qui enregistre MvcHandler dans PostResolveRequestCache) votre IHttpModule de feu ne sera jamais. C'est peut-être pourquoi IHttpHandler.Process n'a jamais été appelé.

Si ceci est votre problème, vous pouvez simplement définir une voie d'ignorer dans MvcApplication.RegisterRoutes comme ceci:

routes.IgnoreRoute("your_path/{*pathInfo}"); 

Aussi, rappelez-vous que, avec le développement Web Visual Studio Server et IIS6, RemapHandler ne fonctionnera pas .

Voici un exemple de la façon de choisir la bonne façon de reprogrammer le gestionnaire en fonction de si oui ou non pipelinier intégré est activé et toujours en mesure d'accéder à la session:

public void Init(HttpApplication application) 
{ 
    if (HttpRuntime.UsingIntegratedPipeline) 
    // For IIS 7 and IIS 8 
    application.PostAuthorizeRequest += Application_PostAuthorizeRequest; 
    else 
    // For IIS 6 
    application.PostMapRequestHandler += Application_PostMapRequestHandler; 
} 

private void Application_PostAuthorizeRequest(object sender, EventArgs e) 
{ 
    ((HttpApplication)sender).Context.RemapHandler(_myHandler); 
} 

private void Application_PostMapRequestHandler(object sender, EventArgs e) 
{ 
    ((HttpApplication)sender).Context.Handler = _myHandler; 
} 

La différence entre l'utilisation d'un HttpHandlerFactory et HttpModule dans ce cas est que ce dernier vous permet de décider quand utiliser IHttpHandler indépendamment des mappages ASP.NET IHttpHandler. Plus d'informations sur MSDN: HTTP Handlers and HTTP Modules Overview.

+0

Effacer la réponse, en particulier la partie sur le gestionnaire mvc !. Thnx! –

+0

RemapHandler fonctionnera correctement dans PostAuthorizeRequest si vous utilisez .NET 2.0 Service Pack 2. –

Questions connexes