2013-05-07 13 views
5

Sto tentando di automatizzare la creazione di applicazioni IIS e per questo sto utilizzando la libreria Microsoft.Web.Administration. Ecco parte del codice che sto usando:Creazione di applicazioni IIS mediante Microsoft.Web.La libreria di amministrazione crea due applicazioni invece di una

IISHelper.cs

public static void CreateApplicationPool(string applicationPoolName) 
{ 
    using (ServerManager serverManager = new ServerManager()) 
    { 
     if (serverManager.ApplicationPools[applicationPoolName] != null) 
      return; 
     ApplicationPool newPool = serverManager.ApplicationPools.Add(applicationPoolName); 
     newPool.ManagedRuntimeVersion = "v4.0"; 
     serverManager.CommitChanges(); 
    } 
} 

public static void CreateSite(string siteName, string path) 
{ 
    using (ServerManager serverManager = new ServerManager()) 
    { 
     var sites = serverManager.Sites; 
     if (sites[siteName] == null) 
     { 
      sites.Add(siteName, "http", "*:80:", path); 
      serverManager.CommitChanges(); 
     } 
    } 
} 

public static void CreateApplication(string siteName, string applicationName, string path) 
{ 
    using (ServerManager serverManager = new ServerManager()) 
    { 
     var site = GetSite(serverManager, siteName); 
     var applications = site.Applications; 
     if (applications["/" + applicationName] == null) 
     { 
      applications.Add("/" + applicationName, path); 
      serverManager.CommitChanges(); 
     } 
    } 
} 

public static void CreateVirtualDirectory(string siteName, string applicationName, string virtualDirectoryName, string path) 
{ 
    using (ServerManager serverManager = new ServerManager()) 
    { 
     var application = GetApplication(serverManager, siteName, applicationName); 
     application.VirtualDirectories.Add("/" + virtualDirectoryName, path); 
     serverManager.CommitChanges(); 
    } 
} 

public static void SetApplicationApplicationPool(string siteName, string applicationPoolName) 
{ 
    using (ServerManager serverManager = new ServerManager()) 
    { 
     var site = GetSite(serverManager, siteName); 
     if (site != null) 
     { 
      foreach (Application app in site.Applications) 
      { 
       app.ApplicationPoolName = applicationPoolName; 
      } 
     }     
     serverManager.CommitChanges(); 
    } 
} 

E qui è il codice principale che chiama i metodi di cui sopra classe IISHelper

string siteName = "TestSite"; 
string applicationName = "TestApp"; 
string virtualDirectoryName = "TestVirtualDirectory"; 
string applicationPoolName = "TestAppPool"; 
string physicalPath = @"C:\inetpub\mynewsite"; 

IISHelper.CreateApplicationPool(applicationPoolName); 
IISHelper.CreateSite(siteName, physicalPath); 
IISHelper.CreateApplication(siteName, applicationName, physicalPath); 
IISHelper.CreateVirtualDirectory(siteName, applicationName, virtualDirectoryName, physicalPath); 
IISHelper.SetApplicationApplicationPool(siteName, applicationPoolName); 

Dopo l'esecuzione di questa codice Sto ottenendo con successo l'applicazione con il sito e il pool di applicazioni appropriato sotto IIS, ma quando seleziono "Visualizza applicazione" nel menu del pool di applicazioni appena creato vedo lì due applicazioni, ma sono sur e ci deve essere una sola applicazione. Ci sto lavorando per evitare la creazione di due applicazioni ma non riesco a trovare un modo. Ecco una foto illustrando che:

enter image description here

Quindi ecco la mia domanda: perché dopo i suddetti esecuzione di codice vengono create due applicazioni e su come modificare il codice per evitare questo problema?

+2

Dove si fa riferimento a GetSite e GetApplication? – thestar

+0

Sito statico pubblico GetSite (ServerManager serverManager, string siteName) { return serverManager.Sites.FirstOrDefault (x => x.Name == siteName); } Application GetApplication ( ServerManager ServerManager, stringa siteName, stringa applicationName) { serverManager.Sites privati ​​statici di ritorno .FirstOrDefault (x => x.Name == siteName) ?. Applicazioni .FirstOrDefault (x => x.Path == "/" + applicationName); } –

risposta

2

Ogni sito deve includere una "Applicazione di root" che è ciò che viene visualizzato come seconda app. Fondamentalmente quando richiedi il tuo sito sopra come 'http://example.com/' (o qualunque nome host tu imposti nei binding) tu richiedi da quell'app root, inoltre stai creando/TestApp che verrà richiesto quando chiami 'http://example.com/TestApp'. Quando crei il sito e fornisci il percorso fisico, crea internamente un'app di root "/" per esso. Per vedere questo è possibile aprire% windir% \ system32 \ inetsrv \ applicationHost.config.

Quindi tecnicamente quello che stai vedendo è corretto, ma potresti non volere realmente una nuova app? e ha solo bisogno dell'app di root? Hai davvero bisogno/TestApp di essere nell'URL?