ASP.NET - в Global.asax обнаружить запрос страницы ASPX против других вещей

У меня есть приложение ASP.NET, где я хочу установить некоторые дополнительные заголовки HTTP (связанные с истечением срока действия страницы), если запрос для нормальной страницы ASPX. Однако я не хочу добавлять эти заголовки для таких вещей, как изображения, обработчики AXD, статические HTML-страницы и т. Д.

Как лучше всего определить в обработчике начала запроса Global.asax, что текущий запрос относится к странице ASP.NET?

Мне кажется неправильным смотреть на URL «aspx», потому что тогда, когда они запрашивают корневые страницы (такие как myapp.com/ или myapp.com/products), он не будет работать. И это только кажется хрупким.

Спасибо,

~ Джастин

13.10.2009 14:34:32
7 ОТВЕТОВ
РЕШЕНИЕ

Вы можете использовать HttpContext.Current.Request. CurrentExecutionFilePath и посмотрите, заканчивается ли это ".aspx".

1
13.10.2009 14:47:00
Хм, это кажется довольно безопасным подходом.
RationalGeek 13.10.2009 14:56:08
Не работает при использовании маршрутизации страниц для сопоставления дружественных URL-адресов с реальными страницами.
George Filippakos 19.02.2016 01:06:57

void Application_BeginRequest (отправитель объекта, EventArgs e) {

    string pathAndQuery = Request.Url.PathAndQuery.ToString();

    if (pathAndQuery.Contains(".aspx"))
    //etc

хотя может быть лучше проверить с помощью регулярного выражения, а не содержит

РЕДАКТИРОВАТЬ: извините, пропустил последние две строки ... не знал, что у вас есть подкаталоги

но вам не нужно проверять файлы aspx. все, что сопоставлено в iis с aspnet_isapi.dll, будет обработано. Вы можете сделать что-то вроде этого:

    if (!pathAndQuery.Contains(".axd")){ //etc.
0
13.10.2009 14:47:27

Я бы предложил вам создать для этого HTTP-модуль. HTTP-модули предназначены именно для таких задач.

http://www.15seconds.com/Issue/020417.htm

3
13.10.2009 14:43:04
Я думаю, что реализация модуля HTTP для добавления одного заголовка HTTP в этом случае излишня. Мы уже широко используем модули HTTP, и я не хочу допускать путаницы. Спасибо за идею, хотя.
RationalGeek 13.10.2009 14:57:04
Похоже, самый подходящий подход для меня
RichardOD 13.10.2009 15:28:48

Для настройки срока действия кэша на уровне папки, вы можете сделать это в IIS. Проверьте это: http://www.software-architects.com/TechnicalArticles/CachinginASPNET/tabid/75/Default.aspx#iis

0
13.10.2009 15:17:45

В .Net 4.0 и выше вы можете проверить ...

HttpContext.Current.Request.CurrentExecutionFilePathExtension

который должен вернуть ".aspx"

Вы получите правильное расширение без каких-либо значений строки запроса, даже если ваш запрос относится к странице по умолчанию (например, «www.myhost.com/myfolder/»).

0
19.03.2014 17:35:11

Фреймворк ASP.Net уже выполняет работу по идентификации страницы aspx и делает что-то еще. Почему снова то же самое? Вместо этого используйте идентифицированный обработчик и затем действуйте соответственно. Если обработчик Application_PreRequestHandlerExecute, свойство this.Context.Handler устанавливается платформой. Проверьте тип этого свойства, чтобы он соответствовал типу класса страниц ASPX. Ваш код в Global.asax.cs будет выглядеть примерно так:

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        if(this.Context.Handler is System.Web.UI.Page)
        {
            //Do what you need to do for aspx requests
        }
    }

Этот подход является преимуществом работы во всех условиях маршрутизации и перезаписи URL и, безусловно, лучше (на мой взгляд), чем любое сравнение строк в URL.

2
9.06.2016 07:26:18

Если вы используете маршрутизацию / дружественные URL-адреса, вы можете использовать HttpRequest.GetFriendlyUrlFileExtension()метод расширения (в Microsoft.AspNet.FriendlyUrlsсборке), чтобы получить базовый тип файла (например, «.aspx»)

0
4.07.2016 20:12:39