2009-03-20 14 views
7

Tôi cần xóa một thư mục ảo và nhóm ứng dụng từ .NET như một phần của phương pháp gỡ cài đặt của tôi. Tôi thấy đoạn mã sau trên web ở đâu đó:Làm cách nào để xóa các đối tượng IIS khỏi C#?

private static void DeleteTree(string metabasePath) 
    { 
     // metabasePath is of the form "IIS://<servername>/<path>" 
     // for example "IIS://localhost/W3SVC/1/Root/MyVDir" 
     // or "IIS://localhost/W3SVC/AppPools/MyAppPool" 
     Console.WriteLine("Deleting {0}:", metabasePath); 

     try 
     { 
      DirectoryEntry tree = new DirectoryEntry(metabasePath); 
      tree.DeleteTree(); 
      tree.CommitChanges(); 
      Console.WriteLine("Done."); 
     } 
     catch (DirectoryNotFoundException) 
     { 
      Console.WriteLine("Not found."); 
     } 
    } 

nhưng có vẻ như để ném một COMException trên tree.CommitChanges();. Tôi có cần dòng này không? Đó có phải là cách tiếp cận chính xác không?

+1

Bạn có thể dán toàn bộ COMException không? – Kev

+0

Bạn thực sự nên sử dụng trình cài đặt Windows để thực hiện những việc này. Wix đã xây dựng các chức năng để tự động tạo và loại bỏ các đối tượng IIS. –

+0

@ Jesse - Sử dụng Wix bạn có thể nhắc người dùng cho một hồ bơi/trang web/vdir ứng dụng mới thay vì chọn những ứng dụng hiện có (dự án VS Web Setup chỉ cho phép bạn chọn các đối tượng IIS hiện có)? – Kev

Trả lời

6

Nếu bạn đang xóa các đối tượng như hồ bơi ứng dụng, thư mục ảo hoặc các ứng dụng IIS, bạn cần phải làm điều đó như thế này:

string appPoolPath = "IIS://Localhost/W3SVC/AppPools/MyAppPool"; 
using(DirectoryEntry appPool = new DirectoryEntry(appPoolPath)) 
{ 
    using(DirectoryEntry appPools = 
       new DirectoryEntry(@"IIS://Localhost/W3SVC/AppPools")) 
    { 
     appPools.Children.Remove(appPool); 
     appPools.CommitChanges(); 
    } 
} 

Bạn tạo một đối tượng DirectoryEntry cho mục mà bạn muốn xóa sau đó tạo a DirectoryEntry cho cha mẹ của nó. Sau đó, bạn yêu cầu cha mẹ xóa đối tượng đó.

Bạn cũng có thể làm được điều này cũng như:

string appPoolPath = "IIS://Localhost/W3SVC/AppPools/MyAppPool"; 
using(DirectoryEntry appPool = new DirectoryEntry(appPoolPath)) 
{ 
    using(DirectoryEntry parent = appPool.Parent) 
    { 
     parent.Children.Remove(appPool); 
     parent.CommitChanges(); 
    } 
} 

Tùy thuộc vào các nhiệm vụ trong tay tôi sẽ sử dụng một trong hai phương pháp.

+0

là có một cách dễ dàng để có được cha mẹ, khi tôi có DirectoryEntry con? appPool.Parent sẽ hoạt động? – Grzenio

+0

appPool.Parent sẽ hoạt động tốt. – Kev

+0

vấn đề vỏ nhỏ với "appPoolpath" vrs "appPoolPath". khác với câu trả lời tuyệt vời đó – Simon

Các vấn đề liên quan