2013-08-06 12 views

risposta

31

creare un'attività di avvio per disattivare il timeout di inattività:

  1. Nel progetto sito a cui fa riferimento il progetto ruolo web, aggiungere un file Startup.cmd nella cartella principale.

  2. Nelle proprietà per Startup.cmd, impostare Copia nella directory di output a Copia se più recente.

  3. aggiungere questa riga a Startup.cmd:

    if exist %windir%\system32\inetsrv\appcmd.exe %windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00 
    

    Il if exist %windir%\system32\inetsrv\appcmd.exe qualificatore è opzionale. Consente di utilizzare lo stesso codice su Azure Emulator Express, quindi non è necessario installare IIS o è necessario eseguire Visual Studio come amministratore.

  4. Salvare il file come UTF-8 senza firma. (. File> Opzioni di salvataggio avanzate in Visual Studio)

  5. Nel progetto ruolo web, in ServiceDefinition.csdef, aggiungere questo al WebRole:

    <Startup> 
        <Task commandLine="Startup.cmd" executionContext="elevated" /> 
    </Startup> 
    
+3

+1 Per una risposta molto utile. Ma ti manca la prima sezione dei parametri: applicationPools – huha

+0

Poiché il ruolo non è stato avviato emulando localmente, ho dovuto trovare il motivo. Trovo questo articolo https://azure.microsoft.com/en-us/documentation/articles/cloud-services-startup-tasks-common/ e ho seguito i suggerimenti lì. L'aggiunta di 'EXIT/B 0' sulla seconda riga di comando ha risolto il problema. Sospetto che, se si esegue Visual Studio non elevato, il comando non riesce e impedisce che il ruolo venga avviato. Preferisco piuttosto il ruolo iniziato anche con i timeout :-). – Zoka

+0

Infine buona risposta – Artyom

2

Nella radice del vostro Web Application progetto, creare un file denominato WebRole.cs con il seguente codice:

public class WebRole : RoleEntryPoint 
{ 
    public override void Run() 
    { 
     RemoveIISTimeouts(); 
     base.Run(); 
    } 

    private void RemoveIISTimeouts() 
    { 
     Process.Start(
      String.Format(@"{0}\system32\inetsrv\appcmd", Environment.GetEnvironmentVariable("windir")), 
      "set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00"); 
    } 
} 
+1

Si potrebbe anche usare l'attività di avvio .cmd per quello. – sharptooth

+1

Inserendo il comando config in una sovrascrittura 'RoleEntryPoint.Run', significa che è necessario contrassegnare il ruolo Web come richiesto autorizzazioni elevate? Se così fosse sarebbe un vantaggio usare l'attività di avvio, come suggerito da @sharptooth. –

+0

Non ho riscontrato problemi di autorizzazione con questo approccio. Non sono state richieste modifiche alle autorizzazioni. –

4

Un'altra opzione è quella di configurare IIS Idle Azione Time-Out a 'sospendere'. Puoi farlo come parte dello script di avvio del tuo ruolo web.

Il comando di cui avete bisogno è sulla scatola come parte dell'installazione di IIS (si noti che questo funzionerà con Windows Server 2012 R2 e versioni successive, con il proprio codice di riferimento .NET 4.5.1 e superiore).

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeoutAction:Suspend 

Dovrete aggiornare il file di configurazione di Azure Cloud Service (.cscfg) da utilizzare sistema operativo della famiglia 4, come indicato dalla ScottGu nel suo blog post.

Poiché le azioni di avvio vengono eseguite quando le provisioning delle istanze vengono eseguite e prima che l'applicazione Web venga distribuita su IIS, impostando i valori predefiniti del pool di applicazioni verrà defacto impostare l'azione di timeout dell'ID del pool di applicazioni su Sospensione.

+0

Attenzione però a questa soluzione, poiché * sospende * l'intero processo (a differenza della soluzione di Edward Brey?). Se hai attività in background di lunga durata, verranno sospese e prima eseguite dopo una nuova richiesta web. –

0

Questo è l'approccio che ho preso:

using (ServerManager iisManager = new ServerManager()) 
{ 
    Application app = iisManager.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"].Applications[0]; 

    TimeSpan ts = new TimeSpan(0, 00, 00); 

    iisManager.ApplicationPoolDefaults.ProcessModel.IdleTimeout = ts; 

    iisManager.CommitChanges(); 
} 

Richiede:

using Microsoft.Web.Administration; 
using Microsoft.WindowsAzure.ServiceRuntime; 
2

Non disturbare. In ogni caso, dovresti davvero avere una soluzione di monitoraggio per il tuo ruolo web.E ora che è incorporato nella dashboard di Azure, è più facile attivare il monitoraggio piuttosto che ottenere la configurazione di timeout di inattività corretta (soprattutto se si desidera mantenere il minimo privilegio).

+3

Sono andato giù per il percorso di monitoraggio degli endpoint, ma quello che ho trovato è che il problema si verificava ancora quando avevo diverse istanze, quindi suppongo che ogni istanza non sia stata colpita abbastanza spesso dal monitoraggio. In ogni modo? – Ian1971

+0

Ci scusiamo per il downvote, ma l'impostazione esiste e deve essere utilizzata direttamente, quindi non vedo alcun motivo per utilizzare il monitoraggio degli endpoint come soluzione alternativa. Come dimostrato nel commento di Ian, la soluzione alternativa non è sempre l'ideale e potrebbe esserci un altro scenario quando non funziona (ad esempio se non si utilizza il bilanciamento del carico round-robin). – sham

+0

@sham Ricorda che questo non è inteso come una soluzione universale, ma solo un'opzione praticabile per determinati scenari. Poiché l'approccio basato su impostazioni può essere uno sforzo sostanziale da implementare, il monitoraggio potrebbe anche essere la soluzione "migliore", se non comporta uno sforzo incrementale e accade di fare il lavoro. –

1

Oltre a @Edward Brey risposta, se si desidera modificare altre impostazioni comuni in questo script di avvio, ecco come lo fai

rem Preload 
%windir%\system32\inetsrv\appcmd list app /xml | %windir%\system32\inetsrv\appcmd set site /in -applicationDefaults.preloadEnabled:True 

rem Disable idle 
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00 

rem Auto start 
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.autoStart:true 

rem Always running 
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.startMode:AlwaysRunning 

rem Disable recycling 
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.recycling.periodicRestart.time:00:00:00 

Per visualizzare un elenco di opzioni disponibili per sezione, fare

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -? 
Problemi correlati