Question

Je reçois cette exception lorsque je tente d'accéder à l'objet HttpContext.Current.Request.

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

Pour ce qui dans le monde sont IHttpModules maintenant?

Je voulais développer un module qui se fait frapper chaque fois qu'un appel entrer sur le site peut, pour que je puisse enregistrer l'URL accessible, l'adresse IP de l'utilisateur, etc ..., mais maintenant il semble que je ne peux plus le faire dans IIS7 . Y at-il solution de contournement? (En plus de passer à "mode classique").

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

Vive.

Était-ce utile?

La solution

Quand faites-vous cela? est-il un événement module? Il doit être parfaitement faisable dans une piscine intégrée aussi bien. Ligne de fond il y a des changements sur la façon dont les crochets ASP.NET pour IIS lors de l'exécution en mode intégré qui le rend « plus de première classe ». Cela signifie que certains événements incendie avant, par exemple Application_Start va maintenant le feu en dehors du contexte d'une demande réelle. D'autres exemples attendent d'avoir une identité de Windows assermentée dans le BeginRequest, depuis maintenant arrive même IIS avant BeginRequest authentifie, qui n'a pas été le cas dans le passé.

Si votre application dépend de l'ancien mauvais comportement, vous pouvez toujours changer AppPool pour exécuter en mode classique et il fonctionne 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 une table de hachage et vous pouvez généralement 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.

D'après votre description, il semble que vous devriez implémentez un module poignées BeginRequest et EndRequest et vous devriez être bien.

Autres conseils

a publié ce billet à l'origine comme un commentaire parce que ce n'est pas vraiment une réponse, mais j'ai vu que vous êtes à la recherche d'un « travail autour » voici donc 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

En fait ce que vous faites est la création d'une seule classe qui fait le même travail sur chaque chargement de page, peu importe quelle page est en cours de chargement. Ensuite, chaque page dans votre application hérite de la classe BasePage pour l'activer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top