2010-08-11 24 views
0

Je reçois cette exception lorsque j'essaie d'accéder à l'objet HttpContext.Current.Request."La requête n'est pas disponible dans ce contexte" dans un IHttpModule

J'ai vu les réponses à l1, l2 et l3 ... donc ... ma question est alors:

Pour ce qui dans le monde sont IHttpModules maintenant? Je voulais développer un module qui est frappé à chaque fois qu'un appel entrera sur le site web, donc je peux enregistrer l'URL accédée, l'adresse IP de l'utilisateur, etc ..., mais maintenant il semble que je ne puisse plus le faire IIS7. Y a-t-il une solution de contournement? (en plus de passer en "mode classique").

alt text http://userserve-ak.last.fm/serve/126/24432467.jpg

Vive.

+0

Pas une réponse à votre question, mais une alternative. Pourquoi ne pas créer une classe 'BasePage' qui hérite de la classe' System.Web.Ui.Page'. Maintenant, toutes vos pages peuvent hériter de 'BasePage'.Ensuite, à partir de là, vous pouvez ajouter votre propre événement 'Page_Load' dans' BasePage' qui effectue la journalisation. –

Répondre

3

Quand est-ce que vous faites cela? est-ce dans un événement de module? Il devrait également être parfaitement réalisable dans une piscine intégrée. En fin de ligne il y a des changements sur la façon dont ASP.NET se connecte à IIS lors de l'exécution en mode intégré qui le rend "plus de première classe". Cela signifie que certains événements se déclenchent avant, par exemple, Application_Start va maintenant se déclencher en dehors du contexte d'une requête réelle. D'autres exemples s'attendent à avoir une identité authentifiée par Windows dans BeginRequest, puisque maintenant BeginRequest arrive même avant que IIS s'authentifie, ce qui n'était pas le cas dans le passé. Si votre application dépend de l'ancien comportement incorrect, vous pouvez toujours changer votre AppPool pour qu'il fonctionne en mode classique et cela fonctionnera très bien.

Vous devriez être en mesure de saisir la demande dans toutes les notifications qui demande spécifiques telles que BeginRequest, EndRequest, PostAuthorizeRequest, etc. En outre, je recommande de ne pas utiliser HttpContext.Current car qui engage un regard supplémentaire dans un hachage table et généralement vous pouvez obtenir directement le contexte d'une autre manière, en particulier dans le contexte d'un module, donc par exemple si vous manipulez la BeginRequest, vous devriez être en mesure de le faire:

HttpApplication application = (HttpApplication)sender; 
    HttpContext context = application.Context; 

et vous économiserez la recherche . De votre description, il semble que vous deviez implémenter un module qui gère BeginRequest et EndRequest et que tout devrait bien se passer.

0

Je l'ai posté à l'origine comme un commentaire parce que ce n'est pas vraiment une réponse, mais ensuite j'ai vu que vous êtes à la recherche d'un "travail autour" alors voici mon idée d'un travail autour.

/App_Code/BasePage.vb

Public Class BasePage : Inherits System.Web.UI.Page 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     ''# Do all your logging here 
    End Sub 
End Class 

/Default.aspx.vb

Partial Class _Default : Inherits BasePage 
    ''# This is simply your code behind for each page (notice it inherits BasePage) 
    ''# You can still have your Page_Load events along with custom methods in here, 
    ''# and it will not affect the logging portion of your app. 
End Class 

Fondamentalement, ce que vous faites est la création d'une seule classe qui fait le même travail à chaque chargement de page, quelle que soit la page chargée. Ensuite, chaque page de votre application héritera de la classe BasePage afin de l'activer.

+0

Cela peut bien sûr être converti en C# si vous utilisez C# en utilisant http://converter.telerik.com –

+0

J'apprécie vraiment, mais je n'utilise pas les classes d'interface utilisateur ASP.NET: P Merci! – vtortola

+0

qu'est-ce que vous utilisez? –