Исключить определенные страницы из использования 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>
Какие-нибудь мысли?
3 ответа
Вы можете использовать HTTPHandler вместо HTTPModule. Обработчики позволяют вам указать путь при объявлении их в Web.Config.
<add verb="*" path="/validate/*.aspx" type="Handler,Assembly"/>
Если вам необходимо использовать HTTPModule, вы можете просто проверить путь запроса и, если он исключен, обойти проверку.
HttpModules присоединяются к самому конвейеру обработки запросов ASP.NET. Сам httpModule должен позаботиться о том, чтобы выяснить, какие запросы он хочет обработать и какие запросы он хочет игнорировать.
Это может быть достигнуто, например, путем просмотра свойства context.Request.Path.
Вот простой пример фильтрации запросов по расширению... Пример, приведенный ниже, исключает из обработки файлы с конкретными расширениями. Фильтрация по имени файла будет выглядеть почти одинаково с небольшими изменениями...
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);
}
}
Общая идея заключается в том, чтобы указать в файле конфигурации, что именно должно быть обработано (или исключено из обработки), и использовать этот параметр конфигурации в модуле.