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

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

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

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


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


РЕДАКТИРОВАТЬ: Если быть точным, я хочу предпринять некоторые шаги в конце запроса, если этот запрос был обработан действием контроллера (хм, когда я думаю об этом сейчас, может быть, фильтр действия, который вызывается для все действия были бы лучше, чем модуль - есть ли какой-то фильтр, который не вызывается при возврате действия перенаправления?).

1 Ответ

3 голосов
/ 22 марта 2011

Вы можете посмотреть тип контента:

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
}

ОБНОВЛЕНИЕ:

Хорошо, я только что заметил, что ваш вопрос был помечен 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))
        {
            ...
        }
    }
}
...