Исключить определенные страницы из использования HTTPModule - PullRequest
15 голосов
/ 16 сентября 2008

Есть ли хороший способ исключить определенные страницы из использования модуля HTTP?

У меня есть приложение, которое использует пользовательский модуль HTTP для проверки сеанса. HTTPModule настроен так в веб-конфигурации:

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

Чтобы исключить модуль со страницы, я попытался сделать это (безуспешно):

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

Есть мысли?

Ответы [ 3 ]

13 голосов
/ 16 сентября 2008

HttpModules присоединяются к самому конвейеру обработки запросов ASP.NET. Сам httpModule должен позаботиться о том, чтобы выяснить, какие запросы он хочет обработать, а какие запросы он хочет игнорировать.

Это может быть достигнуто, например, путем просмотра свойства context.Request.Path.

11 голосов
/ 16 сентября 2008

Вы можете использовать HTTPHandler вместо HTTPModule. Обработчики позволяют вам указать путь при объявлении их в Web.Config.

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

Если вам необходимо использовать HTTPModule, вы можете просто проверить путь запроса и, если он исключен, обойти проверку.

5 голосов
/ 24 августа 2013

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

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);
    }
}

Общая идея заключается в том, чтобы указать в файле конфигурации, что именно должно быть обработано (или исключено из обработки), и использовать этот параметр конфигурации в модуле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...