Chào các bạn. Hôm nay mình sẽ thảo luận với các bạn về 1 chủ đề mới: Quản lý IIS bằng trình duyệt.
1. Bài toán đặt ra
Trong 1 công ty có nhiều team cùng phát triển và dùng chung 1 con window server để deploy các trang nội bộ lên 1 IIS chung. Bộ phận IT sẽ giới hạn số người truy cập vào cùng 1 lúc . Vấn đề đặt ra là có rất nhiều service với nhiều team khác nhau nên tại một thời điểm có thể có rất nhiều người muốn truy cập vào để deploy, restart, chỉnh cấu hình....
2. Ý tưởng
Ý tưởng của mình là xây 1 con website có thể thao tác với IIS ở server. Khi đó người dùng chỉ cần đăng nhập vào nó dựa trên quyền được cấp để thao tác với IIS.
3. Giải pháp
Mình sẽ dựng 1 con web sử dụng asp.net core razor page. Để thao tác với IIS mình sẽ sử dụng thư viện Microsoft.Web.Administration. Database là sqlite vì chỉ cần 1 file nhỏ đơn giản.
4. Bắt đầu code thôi
4.1. Quản lý website
Tạo 1 class website để hiển thị thông tin các website có trên IIS
public class Website { public long Id { get; set; } public string Name { get; set; } public string State { get; set; } public int Port { get; set; } }
Lấy tất cả website:
public void GetAllSites() { using (ServerManager server = new ServerManager()) { this.Websites = new List<Website>(); foreach (var item in server.Sites) { var web = new Website() { Name = item.Name, State = item.State.ToString(), Id = item.Id }; foreach (var b in item.Bindings) { web.Port =b.EndPoint.Port; break; } this.Websites.Add(web); } } }
Start /Stop website:
public void OnPostStart(long site) { using (ServerManager server = new ServerManager()) { foreach (var item in server.Sites) { if(item.Id == site && (item.State == ObjectState.Stopped || item.State == ObjectState.Stopping)) { item.Start(); break; } } } this.GetAllSites(); } public void OnPostStop(long site) { using (ServerManager server = new ServerManager()) { foreach (var item in server.Sites) { if (item.Id == site && (item.State == ObjectState.Started || item.State == ObjectState.Starting)) { item.Stop(); break; } } } this.GetAllSites(); }
Các thao tác khác mình chưa làm đến các bạn có thể chờ mình cập nhật vào github phía dưới.
4.2. Quản lý pool
Lấy tất cả các pool:
public class AppPool { public string Name { get; set; } public string State { get; set; } } public void GetAllPools() { using (ServerManager server = new ServerManager()) { this.AppPools = new List<AppPool>(); foreach (var item in server.ApplicationPools) { this.AppPools.Add(new AppPool() { Name = item.Name, State =item.State.ToString() }); } } }
Start/ Stop pool:
public void OnPostStop(string pool) { using (ServerManager server = new ServerManager()) { foreach (var item in server.ApplicationPools) { if(item.Name == pool) { item.Stop(); } } } this.GetAllPools(); } public void OnPostStart(string pool) { using (ServerManager server = new ServerManager()) { foreach (var item in server.ApplicationPools) { if (item.Name == pool) { item.Start(); } } } this.GetAllPools(); }
Các thao tác khác mình chưa làm đến các bạn có thể chờ mình cập nhật vào github phía dưới.
4.3. Các phần khác
Ngoài ra còn các phần mình dự kiến sẽ có trong dự án này như login, phân quyền user .... Các bạn có thể theo dõi tiến độ của nó tại github của mình iis.dashboard