Автозапуск 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