2011-10-05 32 views
1

我需要创建一个新的网站IIS 6.0(在Windows服务器2003 R2 SP2),并创建一个新的虚拟目录.NET框架4.0将其分配给创建的网站编程方式创建IIS 6.0的网站和应用程序池与指定的.NET版本

这里是我的代码:

public static int CreateWebSite(string webSiteName, string PhysicalPath, string PortNumber, string HostHeader, string DefaultDoc, string appPoolName, out string errorMessage) 
    { 
     errorMessage = string.Empty; 
     try 
     { 
      DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC"); 
      // Find unused ID value for new web site 
      int siteID = 1; 
      foreach (DirectoryEntry e in root.Children) 
      { 
       if (e.SchemaClassName == "IIsWebServer") 
       { 
        int ID = Convert.ToInt32(e.Name); 
        if (ID >= siteID) 
        { 
         siteID = ID + 1; 
        } 
       } 
      } 

      DirectoryEntry site = (DirectoryEntry)root.Invoke("Create", "IIsWebServer", siteID); 
      site.Invoke("Put", "ServerComment", webSiteName); 
      site.Invoke("Put", "KeyType", "IIsWebServer"); 

      site.Invoke("Put", "ServerBindings", ":" + PortNumber + ":" + HostHeader); 

      site.Invoke("Put", "ServerState", 2); 
      site.Invoke("Put", "FrontPageWeb", 1); 
      site.Invoke("Put", "DefaultDoc", DefaultDoc); 

      site.Invoke("Put", "ServerAutoStart", 1); 
      site.Invoke("Put", "ServerSize", 1); 
      site.Invoke("SetInfo"); 

      DirectoryEntry siteVDir = site.Children.Add("Root", "IISWebVirtualDir"); 

      if (appPoolName != "") 
      { 
       object[] param = { 0, appPoolName, true }; 
       siteVDir.Invoke("AppCreate3", param); 
      } 

      siteVDir.Properties["AppIsolated"][0] = 2; 

      siteVDir.Properties["Path"][0] = PhysicalPath; 

      siteVDir.Properties["AccessFlags"][0] = 513; 
      siteVDir.Properties["AspEnableParentPaths"][0] = true; 
      siteVDir.Properties["AppFriendlyName"][0] = webSiteName; 
      siteVDir.Properties["FrontPageWeb"][0] = 1; 
      siteVDir.Properties["AppRoot"][0] = "LM/W3SVC/" + siteID + "/Root"; 
      siteVDir.Properties["AppFriendlyName"][0] = "Root"; 
      siteVDir.Properties["AspSessionTimeout"][0] = "60"; 
      siteVDir.Properties["AuthFlags"].Value = 4;//integrity windows Authentication checked 
      siteVDir.Properties["AuthAnonymous"][0] = true;//Anonymouse uncheck 
      siteVDir.Properties["HttpErrors"].Add("401,1,FILE," + PhysicalPath + "/Lib/CustomError/SSOLoginError.htm"); 
      siteVDir.Properties["HttpErrors"].Add("401,2,FILE," + PhysicalPath + "/Lib/CustomError/SSOLoginError.htm"); 
      siteVDir.Properties["HttpErrors"].Add("401,3,FILE," + PhysicalPath + "/Lib/CustomError/SSOLoginError.htm"); 
      siteVDir.Properties["HttpErrors"].Add("401,4,FILE," + PhysicalPath + "/Lib/CustomError/SSOLoginError.htm"); 
      siteVDir.Properties["HttpErrors"].Add("401,5,FILE," + PhysicalPath + "/Lib/CustomError/SSOLoginError.htm"); 
      siteVDir.Properties["HttpErrors"].Add("401,7,FILE," + PhysicalPath + "/Lib/CustomError/SSOLoginError.htm"); 

      //For SSO, Set special settings for WinLogin.aspx page -- This has beed added after version 8.1.1001 
      DirectoryEntry deLoginDir; 
      deLoginDir = siteVDir.Children.Add("WinLogin.aspx", siteVDir.SchemaClassName); 
      deLoginDir.Properties["AuthAnonymous"][0] = false;//Anonymouse uncheck 
      deLoginDir.Properties["AuthFlags"].Value = 4;//integrity windows Authentication checked 
      deLoginDir.CommitChanges(); 
      //////////////////////////////////////////// 

      siteVDir.CommitChanges(); 

      siteVDir.Invoke("AppDelete"); 
      siteVDir.Invoke("AppCreate", true); 
      siteVDir.Invoke("AppEnable"); 

      site.CommitChanges(); 

      #region AssignApplicationPool 

      DirectoryEntry vDir = new DirectoryEntry("IIS://localhost/W3SVC/" + siteID.ToString() + "/Root"); 
      string className = vDir.SchemaClassName.ToString(); 
      if (className.EndsWith("VirtualDir")) 
      { 
       object[] param = { 0, appPoolName, true }; 
       vDir.Invoke("AppCreate3", param); 
       vDir.Properties["AppIsolated"][0] = "2"; 
       vDir.CommitChanges(); 
      } 
      else 
      { 
       return -1; 
      } 

      if (Environment.OSVersion.Version.Major < 6) 
      { 
       try 
       { 
        const string aspNetV1 = "1.0.3705"; 
        const string aspNetV11 = "1.1.4322"; 
        const string aspNetV2 = "2.0.50727"; 
        const string aspNetV4 = "4.0.30319"; 
        const string targetAspNetVersion = aspNetV4; 

        //loop through the script maps 
        for (var i = 0; i < siteVDir.Properties["ScriptMaps"].Count; i++) 
        { 
         //replace the versions if they exists 
         siteVDir.Properties["ScriptMaps"][i] = 
          siteVDir.Properties["ScriptMaps"][i].ToString().Replace(aspNetV1, targetAspNetVersion); 
         siteVDir.Properties["ScriptMaps"][i] = 
          siteVDir.Properties["ScriptMaps"][i].ToString().Replace(aspNetV11, targetAspNetVersion); 
         siteVDir.Properties["ScriptMaps"][i] = 
          siteVDir.Properties["ScriptMaps"][i].ToString().Replace(aspNetV2, targetAspNetVersion); 
        } 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.Message); 
        errorMessage = ex.Message + Environment.NewLine + ex.StackTrace; 
       } 
      } 
      else 
      { 
       string appPoolPath = @"IIS://localhost/W3SVC/AppPools/" + appPoolName; 
       try 
       { 
        var appPoolEntry = new DirectoryEntry(appPoolPath); 
        appPoolEntry.Properties["managedRuntimeVersion"].Value = "v4.0"; 
        appPoolEntry.Invoke("SetInfo", null); 
        appPoolEntry.CommitChanges(); 
        appPoolEntry.Close(); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.Message); 
        errorMessage = ex.Message + Environment.NewLine + ex.StackTrace; 
       } 

       siteVDir.CommitChanges(); 
       siteVDir.Close(); 
      } 

      #endregion 


      return siteID; 
     } 
     catch 
     { 
      return -1; 
     } 
    } 

此代码应工作在IIS 6.0(Windows 2003中)和IIS 7.5及更高版本(Windows 7和Windows 2008)的罚款。在Windows 7和2008中,每个东西看起来都不错!但在2003年的窗户,我有一些问题:

  1. Asp.net网站的版本不会更改为V4
  2. 应用程序池似乎并不正确,其在INETMGR节点仅具有名根一个节点不是网站名称
  3. 在网站属性窗口 - >主目录选项卡中,应用程序名称为空

我的代码有什么问题?

在此先感谢

回答

0
DirectoryEntry sited = new DirectoryEntry(string.Format("IIS://localhost/w3svc/{0}/Root", websiteID.ToString())); 
sited.Properties["AccessRead"].Add(true); 
PropertyValueCollection testScriptMap = sited.Properties["ScriptMaps"]; 

object[] allValues = (object[])testScriptMap.Value; 
object[] newValues = new object[allValues.Length]; 
string oldVersion = "v1.1.4322"; 
string newVersion = "v2.0.50727"; 
//... etc to 4.0.30319 ..... 
for (int i = 0; i < allValues.Length; i++) 
{ 
    if (allValues[i] is string) 
    { 
     string temp = allValues[i] as string; 
     if (temp.Contains(oldVersion)) 
     { 
      newValues[i] = temp.Replace(oldVersion, newVersion); 
     } 
     else 
     { 
      newValues[i] = allValues[i]; 
     } 

    } 
    else 
    { 
     newValues[i] = allValues[i]; 
    } 
} 
testScriptMap.Value = newValues; 

sited.CommitChanges(); 
相关问题