Как вызвать какой-то код один раз за запрос страницы - PullRequest
1 голос
/ 12 августа 2011

Я пытаюсь выполнить какой-то код один раз для любого запроса страницы, поэтому я поместил этот код в метод Application_PreRequestHandlerExecute в Global.asax.Проблема в том, что для каждого запроса страницы этот метод вызывается, возможно, 10 или более раз.Итак, вопрос в том, как заставить мой код вызываться только один раз за запрос?Я попытался добавить это к методу Application_PreRequestExecute:

const string key = "scanning_forms";
object chack = HttpContext.Current.Items[key];
if (chack == null)
{
    // Code I want to execute only once
}

Проблема в том, что по какой-то причине проверка всегда ложна!Есть идеи?Кстати, я использую Sitecore.Я не думаю, что это должно быть значительным, хотя.

Спасибо,

Сачин

Ответы [ 7 ]

4 голосов
/ 15 августа 2011

Чувак, похоже, это слишком сложное решение для решения довольно простой проблемы. Поскольку вы пометили этот #sitecore, я предполагаю, что вам нужно это решение в контексте решения Sitecore.

В вашем решении должен быть только 1 файл макета (на устройство). Он будет выполнен для каждого запроса страницы. Поместите туда свой код, например, в Page_Load ().

И даже если у вас есть несколько макетов, вы можете создать общий базовый класс (например, Layout), и каждый кодовый файл макета наследуется от него. А затем сделайте, как указано выше.

1 голос
/ 12 августа 2011

Посмотрите на изменение конвейера HttpRequest в Web.Config для Sitecore.Простое решение - добавить собственный конвейерный процессор.Тем не менее, могут быть соображения производительности для этого подхода.Другим соображением является использование подслоя или веб-управления в деталях компоновки для элементов Sitecore.

1 голос
/ 12 августа 2011

Я не совсем уверен, будет ли работать решение Kit (я бы предположил, что запросы на ресурсы / страницы / и т. Д. Раздельные).

Я полагаю, вам нужно будет проверить в вашем текущем методе, действительно лизапрос относится к странице (т. е. проверьте, относится ли запрос к файлу * .aspx, или проверьте, обрабатывается ли запрос PageHandler)

Редактировать:

Iможет показаться, что такая проверка до запуска вашего кода должна работать (при условии, что свойство Handler заполняется к моменту запуска вашего кода):

if(HttpContext.Current.Handler is Page)
1 голос
/ 12 августа 2011

Вы можете установить переменную сеанса и проверить, существует ли она:

if (Session["RequestMade"] == null) {
    //Do logic
    Session["RequestMade"] = true;
}

Тем не менее, Я не уверен, что вы должны делать это для начала. Не могли бы вы предоставить больше информации о том, чего вы пытаетесь достичь?

0 голосов
/ 13 августа 2011

В своей собственной разработке я заметил одну вещь: когда вы запускаете код ASP.NET внутри Visual Studio с помощью встроенного отладчика, файловые методы global.asax вызываются даже для файлов изображений и CSS и других несерверных типы файлов. Однако при развертывании кода на сервере IIS этого не сделает (при обычной настройке). У вас есть эта проблема в производственной среде? Или только на вашей локальной машине?

Если вы решите, что проблема заключается в том, что метод вызывается для всех изображений и других ресурсов, и это продолжает оставаться проблемой, тогда вы можете заключить код в блок if, чтобы убедиться, что вы находитесь на ASP. NET страница, прежде чем продолжить. Примерно так:

// This code only runs if the local file requested has ".aspx" in the name somewhere.
if(HttpContext.Current.Request.LocalPath.ToString().IndexOf(".aspx") > 0)
{
    const string key = "scanning_forms";
    object chack = HttpContext.Current.Items[key];
    if (chack == null)
    {
        // Code I want to execute only once
    }
}

Я набрал это по памяти, так что это может быть неправильно. Также это приведет к ложным срабатываниям, если у вас есть файл типа C:\INETPUB\WWWROOT\MYSITE\Resources for .aspx files\images\banner.gif. Так что вы, вероятно, захотите сделать проверку более надежной. Я оставлю это тебе.

0 голосов
/ 12 августа 2011

Возможно, вы захотите переместить свой код в Application_BeginRequest, который срабатывает один раз за запрос.Это раньше в жизненном цикле.См. http://www.techrepublic.com/article/working-with-the-aspnet-globalasax-file/5771721.

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

0 голосов
/ 12 августа 2011

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

Что касается обеспечения того, что он вызывается только один раз, вы делаете что-то вроде HttpContext.Current.Items.Add (ключ,что-то) да?

...