Принудительный запуск приложения в веб-роли Azure

У меня есть веб-роль на Azure, и я хотел бы вызвать Application_Start, не дожидаясь первого запроса.

Мне удалось установить для свойства "Запускать автоматически" значение true на моем сайте

Автозапуск WCF в Azure WebRole

Но Application_Start не вызывается, пока не поступит первый запрос.

Я точно не знаю, упускаю ли я что-то важное здесь. Сервер W2008 R2 и версия IIS 7.5

Спасибо!

РЕШЕНИЕ

Я поместил код решения здесь. Я надеюсь, кто-то поможет. Я просто добавил WebRole.cs и просто поместил этот код для выполнения пинга каждые 30 секунд. Пожалуйста, netice Я просматриваю Service.svc, потому что это моя конечная точка, ваша конечная точка может быть другой. Обратите внимание, что я спрашиваю "Endpoint1". Если у вас более одной конечной точки, вы должны просмотреть эту строку.

public class WebRole : RoleEntryPoint
{        
    public override void Run()
    {            
        var localuri = new Uri( string.Format( "http://{0}/Service.svc", RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].IPEndpoint ) );

        while (true)
        {
            try
            {                    
                var request = (HttpWebRequest)WebRequest.Create(localuri);
                request.Method = "GET";
                var response = request.GetResponse();
            }
            catch { }
            System.Threading.Thread.Sleep(30000);
        }            
    }

    public override bool OnStart()
    {               
        return base.OnStart();
    }
}

3 ответа

Решение

IIS запускается только тогда, когда поступает первый запрос. Обходной путь - отправить HTTP-запрос на ту же виртуальную машину изнутри. OnStart или ваш RoleEntryPoint потомок - это легко использовать WebRequest или эквивалентный класс.

Вы можете попробовать добавить код в ваш WebRole.cs, чтобы запросить несколько URL-адресов с вашего сайта. Я пробовал это, и это, кажется, работает несколько. Но отлаживать это сложно, так что я так и не получил этого.

Другой вариант - использовать инициализацию приложения IIS. Вы не можете использовать его в IIS 7.5, но вы можете получить IIS 8, если обновите свои роли до Windows 2012 (установите osFamily="3" в вашем.cscfg).

Джорди, я недавно столкнулся с той же проблемой.

На основании моего теста Application_Start() вызывается ТОЛЬКО при первом запросе ISS к WebApp. (если вы попытаетесь запустить VS в Debug без открытия какой-либо страницы (см. параметры в proj/debug), вы увидите, что Application_Start() также не будет вызываться, если вы не запускаете WebApp в Azure)

Я полагаю, что вам нужно что-то делать при запуске WebRole, хорошо поместите ваш код в WebRole.cs;) Здесь вы можете переопределить OnStart() и OnStop() и поместить ваш код, который будет выполняться при запуске WebRole.

Я использовал этот способ для запуска BakgroundWorker, который выполняет некоторые запланированные задачи независимо от IIS.

Я надеюсь, что это поможет. Давида.

Примечание: 1 - если у вас нет WebRole.cs, создайте его в корне проекта и напишите внутри: public class WebRole: RoleEntryPoint { public override bool OnStart() { ... ваш код... вернуть base.OnStart(); }}

2 - Если вам нужно отладить код, помните, что вам нужно запустить VS в отладке с проектом Azure, который называет WebApp "Выполнить проект", в противном случае WebRole не будет вызываться

Другие вопросы по тегам