2010-03-12 6 views
12

Ich habe den Prozess der Erstellung einer neuen IIS-Website erfolgreich automatisiert, aber der Code, den ich geschrieben habe, kümmert sich nicht um Anwendungspools, sondern wird nur zu DefaultAppPool hinzugefügt. Allerdings möchte ich diese neu erstellte Website zu einem vorhandenen Anwendungspool hinzufügen.Wenn ich programmatisch eine neue IIS-Website erstelle, wie kann ich sie zu einem vorhandenen Anwendungspool hinzufügen?

Hier ist der Code, den ich verwende, um die neue Website zu erstellen.

 var w3Svc = new DirectoryEntry(string.Format("IIS://{0}/w3svc", webserver)); 
     var newsite = new object[] { serverComment, new object[] { serverBindings }, homeDirectory }; 
     var websiteId = w3Svc.Invoke("CreateNewSite", newsite); 
     site.Invoke("Start", null); 
     site.CommitChanges(); 

< Update>

Obwohl dies nicht direkt auf die Frage bezieht, sind hier einige Beispielwerte oben verwendet wird. Dies könnte jemandem helfen, genau zu verstehen, was der obige Code leichter macht.

  • Webserver: "localhost"
  • Servercomment: "testing.dev"
  • Serverbindings: ": 80: testing.dev"
  • homedirectory: "C: \ inetpub \ wwwroot \ Test \"

< /update>

Wenn ich k jetzt der Name des Anwendungspools, in dem ich diese Website haben möchte, wie kann ich sie finden und diese Seite hinzufügen?

Antwort

6

Sie haben die AppPool auf dem virtuellen Verzeichnis zuweisen (nicht der Webserver) und stellen Sie die AppIsolated Eigenschaft auf 2, die gepoolten-Prozess bedeuten;)

http://msdn.microsoft.com/en-us/library/ms525598%28v=VS.90%29.aspx

Relevante Code Probe von Link:

static void AssignVDirToAppPool(string metabasePath, string appPoolName) 
{ 
    // metabasePath is of the form "IIS://<servername>/W3SVC/<siteID>/Root[/<vDir>]" 
    // for example "IIS://localhost/W3SVC/1/Root/MyVDir" 
    // appPoolName is of the form "<name>", for example, "MyAppPool" 
    Console.WriteLine("\nAssigning application {0} to the application pool named {1}:", metabasePath, appPoolName); 

    try 
    { 
    DirectoryEntry vDir = new DirectoryEntry(metabasePath); 
    string className = vDir.SchemaClassName.ToString(); 
    if (className.EndsWith("VirtualDir")) 
    { 
     object[] param = { 0, appPoolName, true }; 
     vDir.Invoke("AppCreate3", param); 
     vDir.Properties["AppIsolated"][0] = "2"; 
     Console.WriteLine(" Done."); 
    } 
    else 
     Console.WriteLine(" Failed in AssignVDirToAppPool; only virtual directories can be assigned to application pools"); 
    } 
    catch (Exception ex) 
    { 
    Console.WriteLine("Failed in AssignVDirToAppPool with the following exception: \n{0}", ex.Message); 
    } 
} 

Beachten Sie, dass, wenn Sie nicht explizit ein neues virtuelles Verzeichnis der Anwendung hinzugefügt werden, wird die metabasePath si "IIS://<servername>/W3SVC/<siteID>/Root"

+1

Danke für den Link - Ich habe diesen Ansatz versucht, aber als ich Ihre Antwort gelesen habe, wurde mir klar, dass ich nie den richtigen metabasePath (in das root virtuelle Verzeichnis für die Anwendung) geschickt habe! Es ist alles gut jetzt. Danke noch einmal. –

+0

Nr. Tatsächlich basiert die IIS-Logik auf virtuellen Verzeichnissen. Fast alle "Website" -Verwendungen müssen im virtuellen Root-Verzeichnis (IISVirtualDir) und nicht auf dem Webserver (IISWebServer) ausgeführt werden. Wenn Sie versuchen können, WMI (DCOM erforderlich) anstelle von ADSI zu verwenden. Es ist flexibler (vor allem über die Erlaubnis). In IIS 7 haben wir endlich die Microsoft.Web.Administration;) – JoeBilly

0

Sie müssen den AppPool von IIS://{0}/W3SVC/AppPools, und fügen Sie es an die siteAppPoolId. Etwas wie:

var appPool = new DirectoryEntry(
    string.Format("IIS://{0}/W3SVC/AppPools/{1}", webServer, appPoolName) 
); 
site.Properties["AppPoolId"].Value = appPool; 
+0

Eine Sache, nach der ich gesucht habe, war eine "AppPoolId" -Eigenschaft auf appPool, aber es scheint keine zu geben. Können Sie etwas darüber sagen, warum wir den AppPool (Type DirectoryEntry) direkt dem AppPoolId Value zuweisen? –

+0

@Ian - Eigentlich könnte ich da falsch sein. Möglicherweise müssen Sie AppPoolId nur den appPoolName (die Zeichenfolge) zuweisen. –

+0

Hm, nun, das ist kein Fehler, aber die Website ist immer noch im Standard-App-Pool. Ich frage mich, ob neben der AppPoolId noch etwas anderes gesetzt werden muss? –

0

site.Properties ["AppPoolId"] [0] = "poolname";