Принудительное приложение запускается на роли Azure Web

У меня есть веб-роль на лазури, и я бы хотел заставить 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();
    }
}
6
добавлено отредактировано
Просмотры: 2
nl ja de

3 ответы

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

3
добавлено
@Jordi: Я бы сказал, что GetResponseStream() и ReadToEnd() не нужны.
добавлено автор sharptooth, источник
@Jordi: Btw ваше решение отправит запросы на весь срок службы экземпляра. Почему бы не отправить только один запрос в OnStart() ?
добавлено автор sharptooth, источник
Я использую одно и то же решение для 4 производственных условий для клиентов. Это необходимо с несколькими узлами (экземплярами), случайные запросы внезапно будут очень медленными. Очевидно, потому, что они запускали приложение Start по этим запросам. Можете ли вы предоставить код, если хотите?
добавлено автор Ash, источник
это то, что я пытаюсь на данный момент XD
добавлено автор Jordi, источник
Я только что отредактировал свою версию с этим решением. Благодаря!
добавлено автор Jordi, источник
Экземпляр webrole выполняет запросы на свой собственный ip, тогда каждый экземпляр отвечает за то, что он остался жив. Если вы положили это на App_Start, вам все равно нужен первый запрос.
добавлено автор Jordi, источник
Ты прав :)
добавлено автор Jordi, источник

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

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

1
добавлено

Хорди, я недавно испытал ту же проблему.

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

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

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

Надеюсь, эта помощь. Давида.

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

2 - If you need to debug the code mind that you need to run VS in debug with the Azure project that refer to WebApp as a "Run Project", otherwise the WebRole will not be called

1
добавлено
Спасибо Брайан, это было то, что случилось со мной :(
добавлено автор Jordi, источник
Обратите внимание, что код в WebRole.cs работает в другом процессе, чем IIS. Поэтому некоторые виды инициализации (предварительная загрузка данных в память, открытие соединений и т. Д.) Там невозможно.
добавлено автор Brian Reischl, источник