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

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

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

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

2 ответа

Решение

Вы можете добавить некоторый код в 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

Хотя решение 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) можно заменить подходом Сандрино, или вы можете отключить время простоя пула приложений: http://blog.smarx.com/posts/controlling-application-pool-idle-timeouts-in-windows-azure

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