Признать, запрашивает ли клиент страницу или что-то еще в пользовательском HttpModule ASP.NET MVC?

63
3

Я написал пользовательский HttpModule, который делает что-то каждый раз при срабатывании события RequestEnd.


public void Init(HttpApplication context) {
context.EndRequest += EndEventHandler;
}

Но я хочу, чтобы он что-то делал, только когда событие EndRequest запускается для запроса страницы html. Не когда это запрос для CSS файла, изображения или чего-то еще. Как я могу узнать, какой контент запрашивается в этом конкретном запросе, чтобы я мог решить, что делать?


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


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

спросил(а) 2021-01-19T16:17:49+03:00 6 месяцев назад
1
Решение
89

Вы можете посмотреть тип содержимого:


if (HttpContext.Current.Response.ContentType == "text/html")
{
... you will be returning an HTML
}

или если вы хотите ограничить только статические HTML-страницы, вы также можете посмотреть запрос:


if (HttpContext.Current.Request.Url.AbsolutePath.EndsWith(".html"))
{
... it was a static html page that was requested
}

удаp >

UPDATE:


Хорошо, я только что заметил, что ваш вопрос был помечен asp.net-mvc. Сначала, когда я увидел HttpModule, я думал, что вы делаете обычное приложение ASP.NET(я даже не мог представить HttpModule в приложении MVC).


Теперь, когда это было ясно, вы, очевидно, могли бы использовать глобальный фильтр действий , в котором вы можете переопределить методы OnActionExecuting и OnActionExecuted который будет вызываться соответственно до и после выполнения действия контроллера.


Что касается вашего вопроса о действии перенаправления в методе OnActionExecuted, вы можете посмотреть filterContext.Result и посмотреть, является ли он типом RedirectToRouteResult:


public class MyActionFilter : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
if (!(filterContext.Result is RedirectToRouteResult))
{
...
}
}
}

ответил(а) 2021-01-19T16:17:49+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема