2016-06-13 1 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

예. 각 사이트는 1 명의 세입자를위한 것입니다. 각 세입자는 하위 도메인에서 작동하는 자체 응용 프로그램을 가지고 있습니다. 각 사이트에도 자체 apppool이 있습니다. 모든 사이트는 하나의 도메인에서 작동하며 하나의 와일드 카드 SSL 인증서가 있습니다. 바인딩을 먼저 삭제하지는 않지만 이상하게 들립니다. – dariol

+0

바인딩은 사이트 수준에서 구성되므로 실제로 물건을 꺼내면 1면을 없애려고합니다. 이거 좀 해보시겠습니까? 사이트를 중지하고 SSL 바인딩을 삭제하고 사이트를 삭제 하시겠습니까? – Maciek

답변

1

사이트 클래스는 IIS의 사이트에 대한 모든 일반적인 메서드와 속성을 나타냅니다. 또한 모든 구성은 중첩 유형에 의해 수행됩니다. 이것은 함축적입니다 : 우리는 새로운 NestedObject를 생성 할 방법이 없습니다. 우리는 팩토리 (ServerManager)에서 가져와야 할 것이고, 정적 인 쓰레기 (IIS의 경우는 더욱 악화 될 것입니다)에서 모두 필요합니다.

우리의 목표는 삭제하는 것입니다. 사이트에 영향을 미치지 않고 인증서를 담당하는 중첩 된 Type입니다. 그 타입은 바인딩입니다. 사이트 BindingCollection을 반환하는 읽기 전용 바인딩 속성이 있습니다.이 위치는 중첩이 발생하는 곳입니다. 이 컬렉션은 Binding이 필요한 모든 사람들이 공유합니다. 또한 모든 사람들이 다른 사람들을 조롱 할 수 있습니다. 즉, ServerManager가 우리를 위해 Site 객체를 생성합니다. 더 깊은 무언가 (IIS C# clone)는 특정 Site 객체에 대한 바인딩 객체를 만듭니다. 사이트 개체를 삭제하면 IIS에서 제거되고이 사이트 개체의 Bindings 개체도 삭제됩니다. IIS는 자체 인터페이스를 통해이 작업을 수행합니다. C# 코드도 필요하며이 동작을 변경하지 못하게해야합니다 (IIS 팀 만 변경할 수 있습니다.)). 그러나 우리는이 nonsens에 대해 deffend 수

try 코드 같은) :

 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(); 

제거 (바인딩, true)를 자체를 바인딩하지 만 구성을 제거합니다. 이 기능을하기 전에이 있었다 좋은 솔루션을 https://msdn.microsoft.com/en-us/library/mt668014(v=vs.90).aspx

: 그 neww 기능은 실제 Microsoft.Web.Administrative MSDN을 requiers 객체를 바인딩 "직렬화", 그것을 다시 넣어 -하지 좋아 대개 추가에 필요한 somwhere 데이터를 저장 제본. 사전? MemoryStream? 상관 없어요. 큰 그림 :

공유 바인딩이있는 Wana 삭제 페이지? 해당 바인딩을 공유하는 모든 페이지를 찾아서 저장하십시오. 바인딩을 "직렬화"하십시오. 페이지 삭제. 이전에 찾은 사이트 모음을 반복하여 바인딩을 모든 사람에게 다시 보냅니다. 즉, 하나의 반복이 보일 수 있습니다 : _siteFromColletion.Bindings.Add (bindingInfo, certHash, certStorename를)

bindingInfo입니다 문자열 certHash 바이트 배열 certStorename 문자열 당신이 HND

사이트

에 certifcate 바인딩을 추가 할 필요!

+0

감사합니다. 'removeOnlyConfig'매개 변수로 오버로드를 사용하여 바인딩을 제거하려고하지만 프로젝트가 컴파일되지 않습니다. 나는 최신 버전의 Microsoft.Web.Administration을 가지고있다. vs2015에 과부하가 있지만 컴파일 할 수 없다는 것을 알려준다. Wrrrr ... – dariol

+0

Ok. 나는 해결책을 찾았다 고 생각합니다. – dariol

+0

'Microsoft.Web.Administration'은 4.6.1로 대상 .NET Framework 버전을 늘리지 않고 최신 버전으로 업그레이드 할 수없는 것 같습니다 –

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 프레임 워크 4.6.1을 대상으로하는 이상, 당신은 또한이 솔루션을 사용할 수있는 경우 : https://stackoverflow.com/a/37802922/2279059

관련 문제