Microsoft Trainer e Software Architect
Sviluppatore professionista dal 2001 con VB6, SQL 2000 e Access creando applicazioni gestionali di varia natura. Passando rapidamente a .NET, windows e web, ho poi espanso le mie esperienze su Compact Framework, SQL Server Mobile ed infine BizTalk Server.
Negli ultimi anni mi sono focalizzato sempre più sullo sviluppo distribuito ed enterprise conseguendo nel contempo le seguenti certificazioni:
Microsoft Certified Trainer (MCT)Microsoft MCPD .NET 3.5 Enterprise Applications DeveloperMicrosoft MCTS .NET 3.5 WCF Applications DevelopmentMicrosoft MCTS .NET 3.5 ASP.NET Applications DevelopmentMicrosoft MCTS .NET 3.5 ADO.NET Applications DevelopmentMicrosoft MCTS .NET 3.5 Windows Applications DevelopmentMicrosoft MCTS .NET 2.0 Distributed Applications DevelopmentMicrosoft MCP .NET
Ciao a tutti
capita a volte di fare deploy di una applicazione web su Windows Azure, come nel mio caso di HomeFramework e ci si trova a chiedersi: come faccio ad impostare l’AppPool in automatico senza andare in DesktopRemoto su tutte le istanze del mio cloud, andando di fatto a vanificare ogni aspettativa cloud….
Fortunatamente la risposta è abbastanza semplice, ed è nell’assembly Microsoft.Web.Administration che giace sepolta e nascosta in C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll
Una volta aggiunto il semplice riferimento al nostro WebRole, è sufficiente andare in WebRole.cs/vb che automaticamente l’SDK di Windows Azure aggiunge ai nostri WebRole, e scrivere qualcosa come questo:
public override bool OnStart() { // To enable the AzureLocalStorageTraceListner, uncomment relevent section in the web.config DiagnosticMonitorConfiguration diagnosticConfig = DiagnosticMonitor.GetDefaultInitialConfiguration(); diagnosticConfig.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(1); diagnosticConfig.Directories.DataSources.Add(AzureLocalStorageTraceListener.GetLogDirectory());
try { using (ServerManager serverManager = new ServerManager()) { //leggo il nome del mio AppPool string appPoolName = serverManager.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"].Applications.First().ApplicationPoolName; Log.Verbose("Found AppPool {0}", appPoolName); //prendo l'AppPool per poterci fare modifiche var appPool = serverManager.ApplicationPools[appPoolName]; //cambio le credenziali (ovviamente posso anche dargliene di specifiche, ma poi dovrei gestire un dominio cloud... appPool.ProcessModel.IdentityType = ProcessModelIdentityType.LocalSystem; //salvo serverManager.CommitChanges(); Log.Information("Set AppPool {0} identity at {1}", appPoolName, appPool.ProcessModel.IdentityType); } } catch (Exception ex) { Log.Error(ex, "Unable to configure AppPool!"); }
return base.OnStart(); }
questo codice farà si che ad ogni deploy di Windows Azure, automaticamente sarà eseguita questa configurazione, così, quando l’applicazione sarà tirata su da IIS, automaticamente ci troveremo con le credenziali aumentate a (in questo esempio) LocalSystem
ovviamente se ne sconsiglia l’uso se non obbligatorio come nel mio caso ove avevo da creare endpoint dinamici che senza diritti non avrei potuto tirare su in HTTP…..
per via della sicurezza di Windows Azure, questo stessso codice non avrebbe i diritti per salvare le modifiche su IIS a meno di andare nel ServiceDefinition.csdef e aggiungere questa riga nel nodo del nostro WebRole:
<WebRole name="XXX" vmsize="XXX" enableNativeCodeExecution="XXX"> //cercare il vostro nodo
<Runtime executionContext="elevated" /> //aggiungere questa riga
a presto