«Запрос не доступен в этом контексте» в IHttpModule - PullRequest
0 голосов
/ 11 августа 2010

Я получаю это исключение при попытке получить доступ к объекту HttpContext.Current.Request.

Я видел ответы в l1 , l2 и l3 ... так что ... тогда мой вопрос:

Для чего в мире сейчас IHttpModules?

Я хотел разработать модуль, который срабатывает при каждом входе на майский веб-сайт, чтобы я мог регистрировать URL-адрес, к которому обращался пользователь, IP-адрес и т. Д., Но теперь, похоже, я больше не могу это делать в IIS7 , Есть ли обходной путь? (кроме перехода в «Классический режим»).

альтернативный текст http://userserve -ak.last.fm / serve / 126 / 24432467.jpg

Приветствие.

Ответы [ 2 ]

4 голосов
/ 12 августа 2010

Когда ты это делаешь? это в модульном событии? Это должно быть прекрасно выполнимо и в интегрированном пуле. В итоге произошли изменения в том, как ASP.NET подключается к IIS при работе в интегрированном режиме, что делает его «более первым классом». Это означает, что определенные события запускаются раньше, например Application_Start теперь будет запускаться вне контекста фактического запроса. Другие примеры предполагают наличие удостоверения подлинности Windows в BeginRequest, поскольку теперь BeginRequest происходит еще до проверки подлинности IIS, чего не было в прошлом.

Если ваше приложение зависит от старого плохого поведения, вы все равно можете изменить свой AppPool для работы в Классическом режиме, и он будет работать просто отлично.

Вы должны иметь возможность получать запрос в любых уведомлениях, относящихся к конкретному запросу, таких как BeginRequest, EndRequest, PostAuthorizeRequest и т. Д. Кроме того, я бы рекомендовал не использовать HttpContext.Current, поскольку это требует дополнительного поиска в хеш-таблице, и обычно вы можете получить контекст напрямую другими способами, особенно в контексте модуля, например, если вы обрабатываете BeginRequest, Вы должны быть в состоянии сделать:

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

и вы сохраните поиск.

Из вашего описания звучит так, как будто вы должны реализовать модуль, который обрабатывает BeginRequest и EndRequest, и с вами все будет в порядке.

0 голосов
/ 11 августа 2010

Я опубликовал это первоначально как комментарий, потому что это не совсем ответ, но потом я увидел, что вы ищете «обходной путь», так что вот моя идея обходного пути.

/ 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

По сути, вы создаете один класс, который выполняет одинаковую работу при каждой загрузке страницы независимо от того, какая страница загружается. Тогда каждая страница в вашем приложении будет наследоваться от класса BasePage, чтобы активировать его.

...