Принудительный запуск приложения в веб-роли 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 не будет вызываться