2016-06-13 16 views
2

我有清除未使用站點的服務。以編程方式刪除受保護站點損壞其他綁定

using (var serverMgr = new ServerManager()) 
{ 
    var sitename = $"site-{instanceName}"; 

    if (IsWebsiteExists(serverMgr, sitename)) 
    { 
     logger.Debug($"Deleting instance '{sitename}' from www server..."); 
     var site = serverMgr.Sites.SingleOrDefault(x => x.Name == sitename); 
     if (site != null) 
     { 
      serverMgr.Sites.Remove(site); 
     } 

     var appPool = serverMgr.ApplicationPools.SingleOrDefault(x => x.Name == sitename); 
     if (appPool != null) 
     { 
      serverMgr.ApplicationPools.Remove(appPool); 
     } 
     serverMgr.CommitChanges(); 
    } 
} 

以上代碼正常工作,但會損壞其他使用相同證書的網站。其他網站意外地在https綁定中有未選定的證書,並且它們停止工作。這真的很煩人。

爲什麼?是我的代碼中的錯誤,或者我應該改變它?它是IIS的錯誤?

+0

您使用的主機名的過濾在您的綁定?你有沒有嘗試先刪除綁定? – Maciek

+1

是的。每個站點都是一個租戶。每個租戶都有自己的應用程序在子域下工作。每個站點也有自己的apppool。所有網站在一個域下工作,並且我有一個通配符SSL證書。我沒有先刪除綁定,但聽起來很奇怪。 – dariol

+0

綁定在站點級配置,所以如果他們爲你搞砸了,我真的會嘗試擺脫他們。你可以試試這個嗎?停止站點,刪除ssl綁定並刪除站點? – Maciek

回答

1

Site類表示IIS中Site的所有常用方法和屬性。所有配置也都是由嵌套類型完成的。這意味着:我們沒有辦法創建新的NestedObject,我們必須從工廠(ServerManager)得到它,它會從一些靜態垃圾中獲得所需的全部內容(在IIS情況下更糟糕)

我們的目標是刪除網站,而不會影響,嵌套類型負責證書。該類型是綁定。 Site has readonly Binding Property,它返回BindingCollection這是嵌套發生的地方。此集合由需要綁定的每個人共享。另外,每個人都可以擰他人即ServerManager爲我們創建Site對象,以某種方式更深入地(IIS c#clone)爲我們特定的Site對象創建綁定對象。刪除Site對象時,將從IIS中刪除,並且此Site Object的Bindings對象也正在刪除。 IIS通過自己的界面來做到這一點,而且C#代碼也必須這樣做,並且必須防止我們改變這種行爲(只有IIS團隊可以改變它,我認爲;))。但是,我們可以deffend反對這種nonsens;)

嘗試這樣的代碼:

 Site site = _server.Sites[name]; 
     if (site == null) 
     return; 

     var bindings = site.Bindings.ToList(); 

     foreach (Binding binding in bindings) 
     { 
      site.Bindings.Remove(binding, true); 
     } 
      _server.Sites.Remove(site); 

      _server.CommitChanges(); 

刪除(結合,真)只刪除配置,而不是綁定本身。它東西方婦女網絡功能,requiers實際Microsoft.Web.Administrative MSDN:https://msdn.microsoft.com/en-us/library/mt668014(v=vs.90).aspx

此功能之前,這是很好的解決方案: 「序列化」綁定對象,並把它放回去 - 不是像通常只保存所需要的添加somwhere數據捆綁。字典? MemoryStream的?沒關係。大圖:

Wana使用共享綁定刪除頁面? 找到所有共享這些綁定的頁面,記住它們。 「序列化」綁定。 刪除頁面。 迭代之前發現的站點的集合,將綁定放回給每個人。即一個迭代可以看看:_siteFromColletion.Bindings.Add(bindingInfo,CERTHASH,certStorename)

bindingInfo是字符串 CERTHASH字節數組 certStorename是字符串 所有你需要添加與認證文件結合網站

HND!

+0

謝謝。我試圖通過'removeOnlyConfig'參數使用重載刪除綁定,但項目不編譯。我有最新版本的Microsoft.Web.Administration,vs2015告訴我有過載但無法編譯。 Wrrrr ... – dariol

+0

好的。我認爲我找到了解決方案。 – dariol

+0

似乎「Microsoft.Web.Administration」無法升級到最新版本,但也不會將目標.NET Framework版本增加到4.6.1 –

0

解決方案是刪除綁定配置節本身。從xml內部刪除配置部分的內容,但僅在本網站內部。你的回答卡米爾給了我一個提示。

using (var serverMgr = new ServerManager()) 
{ 
    if (IsWebsiteExists(serverMgr, sitename)) 
    { 
     var site = serverMgr.Sites.SingleOrDefault(x => x.Name == sitename); 
     if (site != null) 
     { 
      logger.Trace($"Stopping site '{sitename}'..."); 
      site.Stop(); 
      logger.Trace($"Deleting bindings collection for '{sitename}'..."); 

      site.Bindings.Delete(); // <-- deleting bindings config section itself 
     } 
     serverMgr.CommitChanges(); 
    } 
} 
+0

您的代碼不會刪除該網站。我在調用'site.Bindings.Delete'之後嘗試刪除該網站,問題依然存在。 –

0

刪除刪除網站之前所有綁定:

using (var iisManager = new ServerManager) 
{ 
    Site site = iisManager.Sites[siteName]; 
    site.Bindings.Clear(); 
    iisManager.CommitChanges(); 

    site = iisManager.Sites[siteName]; 
    iisManager.Sites.Remove(site); 
    iisManager.CommitChanges(); 
} 

取出綁定後打電話到CommitChanges是很重要的。此外,您必須事後再次查詢該網站,否則您將獲得InvalidOperationException

另外,使用這種方法,在移除站點後調用CommitChanges時,某些系統上不會獲得NotImplementedException,因此它一次解決了兩個煩人的問題。

如果你的目標的.NET Framework 4.6.1或更高版本,你也可以使用此解決方案:https://stackoverflow.com/a/37802922/2279059

相關問題