Вот что у нас получилось:
РЕДАКТИРОВАТЬ : изменено на HttpWebRequest
, так что перенаправления поддерживаются
a) Когда виртуальная машина развернута /При исправлении ОС мы опрашиваем конечную точку httpsIn в OnStart()
public class WebRole : RoleEntryPoint
{
public override bool OnStart()
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// Note: the Web Requests all run in IIS, not from this process.
// So, we aren't disabling certs globally, just for checks against our own endpoint.
ServicePointManager.ServerCertificateValidationCallback += (o, certificate, chain, errors) => true;
var address = GetAddress("httpIn");
var request = (HttpWebRequest)WebRequest.Create(address);
request.MaximumAutomaticRedirections = 1;
request.AllowAutoRedirect = false;
var response = request.GetResponse() as HttpWebResponse;
//_logger.WriteEventLog($"Response: '{response?.StatusCode}'");
return base.OnStart();
}
static Uri GetAddress(string endpointName)
{
var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints[endpointName];
var address = $"{endpoint.Protocol}://{endpoint.IPEndpoint.Address}:{endpoint.IPEndpoint.Port}";
return new Uri(address);
}
}
b) Для AppPool Recycle мы сообщаем о занятости в Global.asax
public class RoleEnvironmentReadyCheck
{
bool _isBusy = true;
public RoleEnvironmentReadyCheck()
{
RoleEnvironment.StatusCheck += RoleEnvironment_StatusCheck;
}
void RoleEnvironment_StatusCheck(object sender, RoleInstanceStatusCheckEventArgs e)
{
if (_isBusy)
{
e.SetBusy();
}
}
public void SetReady()
{
_isBusy = false;
}
}
public class WebApiApplication : HttpApplication
{
protected void Application_Start()
{
var roleStatusCheck = new RoleEnvironmentReadyCheck();
//SuperLoadCache()
roleStatusCheck.SetReady();
}
}
в) Для повторов в AppPool мы выбираем время дня (03:00) и разбиваем роли на 30 минут и останавливаем время простоя в скрипте PowerShell ConfigureIIS.ps1
$InstanceId = $env:INSTANCEID
$role = ($InstanceId -split '_')[-1]
$roleId = [int]$role
$gapInMinutes = 30
$startTime = New-TimeSpan -Hours 3
$offset = New-TimeSpan -Minutes ($gapInMinutes * $roleId)
$time = $startTime + $offset
$timeInDay = "{0:hh\:mm\:ss}" -f $time
Write-Host "ConfigureIIS with role: $role to $timeInDay"
& $env:windir\system32\inetsrv\appcmd set config -section:system.applicationHost/applicationPools /applicationPoolDefaults.processModel.idleTimeout:"00:00:00" /commit:apphost
& $env:windir\system32\inetsrv\appcmd set config -section:system.applicationHost/applicationPools /applicationPoolDefaults.recycling.logEventOnRecycle:"Time,Requests,Schedule,Memory,IsapiUnhealthy,OnDemand,ConfigChange,PrivateMemory" /commit:apphost
& $env:windir\system32\inetsrv\appcmd set config -section:system.applicationHost/applicationPools /applicationPoolDefaults.recycling.periodicRestart.time:"00:00:00" /commit:apphost
& $env:windir\system32\inetsrv\appcmd set config -section:system.applicationHost/applicationPools /~"applicationPoolDefaults.recycling.periodicRestart.schedule" /commit:apphost
& $env:windir\system32\inetsrv\appcmd set config -section:system.applicationHost/applicationPools /+"applicationPoolDefaults.recycling.periodicRestart.schedule.[value='$timeInDay']" /commit:apphost
и передать RoleId в ConfigureIIS.cmd
PowerShell -ExecutionPolicy Unrestricted .\ConfigureIIS.ps1 >> "%TEMP%\StartupLog.txt" 2>&1
EXIT /B 0
, установленный в ServiceDefinition.csdef
<Task commandLine="ConfigureIIS.cmd" executionContext="elevated" taskType="simple">
<Environment>
<Variable name="INSTANCEID">
<RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/@id"/>
</Variable>
</Environment>
</Task>