Хобрук: Ваш путь к мастерству в программировании

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

У меня есть WCF, размещенный в Azure (WebRole). Этот WCF выполняет множество фоновых задач и отвечает на некоторые петиции.

Проблема в том, что если WCF не получает никаких петиций в течение длительного времени (10 часов и более), пул приложений перезапускается на экземпляре Azure, и задачи WCF останавливаются. Я провел небольшое исследование и могу включить функцию автозапуска в файле machine.config, но это не вариант с развертыванием в Azure.

Могу ли я включить автозапуск в файле web.config или развернуть файлы конфигурации?

04.12.2012

Ответы:


1

Вы можете добавить некоторый код в WebRole.cs для изменения пула приложений:

public class WebRole : RoleEntryPoint
{
    public override void Run()
    {
        using (var serverManager = new ServerManager())
        {
            var mainSite = serverManager.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"];
            var mainApplication = mainSite.Applications["/"];
            var mainApplicationPool = serverManager.ApplicationPools[mainApplication.ApplicationPoolName];
            mainApplicationPool["autoStart"] = true;
            mainApplicationPool["startMode"] = "AlwaysRunning";

            serverManager.CommitChanges();
        }

        base.Run();
    }

    public override bool OnStart()
    {
        // For information on handling configuration changes
        // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.

        return base.OnStart();
    }
}

Примечание. Чтобы использовать ServerManager, вам необходимо:

  • ссылка C:\Windows\system32\inetsrv\Microsoft.Web.Administration.dll (или доступна через NuGet)
  • добавьте <Runtime executionContext="elevated" /> в определение службы под элементом WebRole
04.12.2012
  • есть ли шанс сделать то же самое с файлом конфигурации? 04.12.2012
  • У меня нет WebRole.cs в моем проекте, но я попытался сделать это в Application_Start файла global.asax. Код вызывает исключение: UnauthorizedAccessException не было обработано пользовательским кодом. Имя файла: перенаправление.config. Ошибка: Не удается прочитать файл конфигурации из-за недостаточных разрешений 04.12.2012
  • Просто добавьте файл WebRole.cs в свою веб-роль. Также убедитесь, что вы добавили следующий элемент <Runtime executionContext="elevated" /> в определение службы под элементом WebRole. Application_Start — это часть веб-приложения, работающего в IIS, поэтому вам не следует вносить изменения в IIS оттуда. 04.12.2012
  • служба повторно развернута. Я подожду 24 часа, прежде чем дать ему согласие :) 04.12.2012
  • Это решение является частичным. Чтобы решить эту проблему, проверьте этот другой вопрос: stackoverflow.com/questions/14238569/ 11.01.2013
  • Поскольку код в основном изменяет applicationHost.config, какой смысл помещать код в метод Run() вместо OnStart()? 30.05.2014

  • 2

    Хотя решение Sandrino может сработать... вот решение, которое не требует запуска веб-роли в режиме повышенной безопасности, а также заставит приложение запускаться при запуске веб-роли (до того, как первый пользователь посетит сайт). Это решение также будет работать в более старых версиях IIS/Windows Server, для которых не требуется функция IIS 8 «Инициализация приложения».

    Просто добавьте WebRole.cs со следующим содержимым:

    using System;
    using System.Net;
    using System.Net.Security;
    using System.Threading;
    using Microsoft.WindowsAzure.ServiceRuntime;
    
    namespace Website
    {
        public class WebRole : RoleEntryPoint
        {
            public override bool OnStart()
            {
                WarmUpWebsite("HttpIn");
                return base.OnStart();
            }
    
            public override void Run()
            {
                while (true)
                {
                    WarmUpWebsite("HttpIn");
                    Thread.Sleep(TimeSpan.FromMinutes(1));
                }
            }
    
            public void WarmUpWebsite(string endpointName)
            {
                // Disable check for valid certificate. On som sites live HTTP request are redirected to HTTPS endpoint. And when running on staging SSL the certificate is invalid.
                RemoteCertificateValidationCallback allowAllCertificatesCallback = (sender, certificate, chain, sslPolicyErrors) => true;
                ServicePointManager.ServerCertificateValidationCallback += allowAllCertificatesCallback;
                try
                {
                    RoleInstanceEndpoint endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints[endpointName];
    
                    string address = String.Format("{0}://{1}:{2}", endpoint.Protocol, endpoint.IPEndpoint.Address, endpoint.IPEndpoint.Port);
    
                    //This will cause Application_Start in global.asax to run
                    new WebClient().DownloadString(address);
                }
                catch (Exception)
                {
                    // intentionally swallow all exceptions here.
                }
                ServicePointManager.ServerCertificateValidationCallback -= allowAllCertificatesCallback;
            }
        }
    }
    

    Авторы отправляются на: http://weblogs.thinktecture.com/cweyer/2011/01/poor-mans-approach-to-application-pool-warm-up-for-iis-in-a-windows-azure-web-role.html

    Параметр while(true) можно заменить подходом Sandrino или отключить тайм-аут простоя пула приложений: http://blog.smarx.com/posts/controlling-application-pool-idle-timeouts-in-windows-azure

    16.03.2014
  • Попробую в следующий раз. Спасибо 18.03.2014
  • Кажется, это помогает остановить переход моей веб-роли в спящий режим после 20 минут активности, но, похоже, не помогает при первоначальном запуске или последующих перезапусках, когда роль перезапускается через 29 часов. Затем первый удар снова занимает около 50 секунд. 12.12.2016
  • Новые материалы

    100 дней кода машинного обучения — День 097
    Подведение итогов дня 096 В дни 095 и 096 мы говорили о том, как мы слышим звук в пространстве: время интерауральной задержки, передаточная функция, связанная с головой, а также мы говорили..

    Какова ваша «история данных»?
    Представление концепций продуктов для данных и машинного обучения заинтересованным сторонам и руководству Все любят данные. Все любят говорить, как будто понимают данные. Всем нравится..

    Все, что вам нужно знать о «Внимании» и «Трансформерах» — Углубленное понимание — Часть 2
    Внимание, Самостоятельное внимание, Многоголовое внимание, Маскированное многоголовое внимание, Трансформаторы, BERT и GPT В предыдущем рассказе я объяснил, что такое механизм внимания, а также..

    Расставание с локальным хранилищем
    Что такое локальное хранилище Локальное хранилище — это механизм, который позволяет веб-приложениям хранить данные на стороне клиента. Это часть API веб-хранилища, которое также включает в себя..

    CycleGAN: как машинное обучение обучает непарному преобразованию изображения в изображение
    Недавно я прочитал статью CycleGAN ( ссылка ), которая показалась мне очень интересной, потому что модели CycleGAN обладают невероятной способностью точно преобразовывать изображения во что-то, чем..

    «Изучение передовых технологий: подробный обзор последних инноваций в области технологий…
    Технологии постоянно развиваются, и последние инновации в технологической отрасли могут изменить наш образ жизни и работы так, как мы никогда не считали возможным. В этой статье подробно..

    Позволяя машинам думать самостоятельно
    Позволяя машинам думать самостоятельно Чтобы создать «сильный ИИ», нам не нужно смотреть дальше когнитивных процессов человеческого мозга. Мы увидим, что процессы, включающие ожидание,..