Как исключить Webresource.axd из запуска моих пользовательских HttpModules
Я искал в Интернете весь день, но ничего не нашел. В моем web.config я установил:
<modules runAllManagedModulesForAllRequests="false">
А также
<add name="MyModule" type="namespace.to.MyModule" preCondition="managedHandler" />
И это предотвращает запуск MyModule (в этом примере подключенного к PostAuthenticateRequest) на статических ресурсах, таких как изображения, CSS, JS и так далее. Но модуль по-прежнему запускается.axd-файлами внутри страницы, в частности он запускается из WebResource.axd
1 ответ
Я добавил эту проверку в мой HttpModule, и он работает:
' Skip the module for non aspx requests like .axd or url without default document
Private Sub Application_PostAuthenticateRequest(ByVal source As Object, ByVal e As EventArgs)
Dim request = DirectCast(source, HttpApplication).Request
If request.CurrentExecutionFilePathExtension.ToLower <> ".aspx" Then
Exit Sub
End If
Это связано с PostAuthenticateRequest. Если вы подключаетесь к другим событиям, таким как, например, OnEndRequest, остерегайтесь того, что у вас есть доступ к HttpContext, а не к HttpApplication, поэтому добавьте это вместо этого:
Protected Overridable Sub OnEndRequest(context As HttpContext)
' Skip the module for non aspx requests like .axd or url without default document
Dim request = context.Request
If request.CurrentExecutionFilePathExtension.ToLower <> ".aspx" Then
Exit Sub
End If
Также обратите внимание, что при вызове URL-адреса без документа, как, например, http://www.yoursite.com/ IIS инициирует запрос к http://www.yoursite.com/Default.aspx (или к любому заданному вами документу def). Так что даже если ваша страница пуста, вы вызовете 2 запроса. На сайте IIS говорится, что "для запросов документов по умолчанию первый запрос относится к URL-адресу без расширений. Поэтому IIS не запускает никаких управляемых модулей, помеченных предварительным условием управляемого обработчика во время начальной обработки запроса". Но это не правда. Даже если мой HttpModule помечен атрибутом precondition="managedHandler" с запросом вроде http://www.yoursite.com/ он все равно запускается два раза (один для / и один для /Default.asp). В любом случае, с помощью обходного пути, размещенного здесь выше, вы решаете и это.