Исключить определенные страницы с помощью HTTPModule

Есть ли хороший способ исключить определенные страницы из 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>

Любые мысли?

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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