2009-08-07 2 views
3

Это один будет нужно немного объяснения ...Создание виртуального каталога в IIS с C#

Я хочу, чтобы настроить IIS автомагически так наши интеграционные тесты (с помощью WatiN) может работать на любых условиях. Для этого я хочу создать Setup и Teardown, которые будут соответственно создавать и уничтожать виртуальный каталог.

Решение, о котором я думал, состояло в том, чтобы использовать MSBuild Community Tasks для автоматизации IIS в коде с посмеянным IBuildEngine.

Однако, когда я пытаюсь создать виртуальный каталог, я получаю следующий код ошибки: 0x80005008. Edit: я удалил артефакты ранее активности, которая и теперь я получаю IndexOutOfRangeException

Я на Vista, с IIS7. Это код, я использую для запуска задачи:

var buildEngine = new MockedBuildEngine(); 
buildEngine.OnError += (o, e) => Console.WriteLine("ERROR" + e.Message); 
buildEngine.OnMessage += (o, e) => Console.WriteLine("MESSAGE" + e.Message); 
buildEngine.OnWarning += (o, e) => Console.WriteLine("WARNING: " + e.Message); 

var createWebsite = new MSBuild.Community.Tasks.IIS.WebDirectoryCreate() 
        { 
         ServerName = "localhost", 
         VirtualDirectoryPhysicalPath = websiteFolder.FullName, 
         VirtualDirectoryName = "MedicatiebeheerFittests", 
         AccessRead = true, 
         AuthAnonymous = true, 
         AnonymousPasswordSync = false, 
         AuthNtlm = true, 
         EnableDefaultDoc = true, 
         BuildEngine = buildEngine 
        }; 

createWebsite.Execute(); 

Кто-то знает, что здесь происходит? Или кто-то знает лучший способ сделать это?

+0

изолировали вы именно там, где вы получаете исключение? Это он в вашем MockedBuildEngine? –

+0

Это исключение из самой задачи. Я в этом уверен. – Lodewijk

ответ

6

Это код, мое приложение использует, что ссылается на System.DirectoryServices DLL:

using System.DirectoryServices; 
    using System.IO; 
    /// <summary> 
    /// Creates the virtual directory. 
    /// </summary> 
    /// <param name="webSite">The web site.</param> 
    /// <param name="appName">Name of the app.</param> 
    /// <param name="path">The path.</param> 
    /// <returns></returns> 
    /// <exception cref="Exception"><c>Exception</c>.</exception> 
    public static bool CreateVirtualDirectory(string webSite, string appName, string path) 
    { 
     var schema = new DirectoryEntry("IIS://" + webSite + "/Schema/AppIsolated"); 
     bool canCreate = !(schema.Properties["Syntax"].Value.ToString().ToUpper() == "BOOLEAN"); 
     schema.Dispose(); 

     if (canCreate) 
     { 
      bool pathCreated = false; 
      try 
      { 
       var admin = new DirectoryEntry("IIS://" + webSite + "/W3SVC/1/Root"); 

       //make sure folder exists 
       if (!Directory.Exists(path)) 
       { 
        Directory.CreateDirectory(path); 
        pathCreated = true; 
       } 

       //If the virtual directory already exists then delete it 
       IEnumerable<DirectoryEntry> matchingEntries = admin.Children.Cast<DirectoryEntry>().Where(v => v.Name == appName); 
       foreach (DirectoryEntry vd in matchingEntries) 
       { 
        admin.Invoke("Delete", new[] { vd.SchemaClassName, appName }); 
        admin.CommitChanges(); 
        break; 
       } 

       //Create and setup new virtual directory 
       DirectoryEntry vdir = admin.Children.Add(appName, "IIsWebVirtualDir"); 

       vdir.Properties["Path"][0] = path; 
       vdir.Properties["AppFriendlyName"][0] = appName; 
       vdir.Properties["EnableDirBrowsing"][0] = false; 
       vdir.Properties["AccessRead"][0] = true; 
       vdir.Properties["AccessExecute"][0] = true; 
       vdir.Properties["AccessWrite"][0] = false; 
       vdir.Properties["AccessScript"][0] = true; 
       vdir.Properties["AuthNTLM"][0] = true; 
       vdir.Properties["EnableDefaultDoc"][0] = true; 
       vdir.Properties["DefaultDoc"][0] = 
        "default.aspx,default.asp,default.htm"; 
       vdir.Properties["AspEnableParentPaths"][0] = true; 
       vdir.CommitChanges(); 

       //the following are acceptable params 
       //INPROC = 0, OUTPROC = 1, POOLED = 2 
       vdir.Invoke("AppCreate", 1); 

       return true; 
      } 
      catch (Exception) 
      { 
       if (pathCreated) 
        Directory.Delete(path); 
       throw; 
      } 
     } 
     return false; 
    } 
1

Это может быть немного растягивается, поскольку это не C# или MSBuild, но как насчет использования простого vbscript для этого?

http://msdn.microsoft.com/en-us/library/ms951564.aspx#autoadm_topic5

Это может быть сконфигурирован в задаче MSBuild.

+0

Мне нужно будет инициализировать vbscript изнутри C# в моем сценарии. Не очень, но это может сработать ... – Lodewijk

1

Как насчет того же подхода, предложенного Dylan, но непосредственно в C#?

См.: Creating Sites and Virtual Directories Using System.DirectoryServices для начальной точки.

+0

Это, по сути, люди MSBuild. Здесь есть еще один пример: http://stackoverflow.com/questions/266026/iis-api-create-virtual-directories (посмотрите на ответ, который говорит NOT TESTED). Как ни странно, еще одно предложение по этому вопросу - использовать WiX. Я использую функции WiX IIS в нескольких установщиках, которые я написал, и снова это открытый исходный код, чтобы вы могли посмотреть туда. Но я бы, наверное, только начинал с ответа, о котором я говорил. – Dylan

+0

Спасибо за ссылки msdn. Они будут очень полезны! – Lodewijk

Смежные вопросы