2009-10-31 2 views
49

내 ASP.NET 웹 응용 프로그램에서 서버에 고유 한 IIS에서 만들어진 이름이 무엇인지 살펴보고 싶습니다. 나는 웹 사이트의 도메인 이름에 관심이 없지만 IIS의 사이트에 주어진 실제 이름은 관심이 있습니다.ASP.NET 웹 사이트에서 IIS 사이트 이름 가져 오기

내가 IIS6에 대한 신뢰성을 할 및 7

것은 내가 IIS에서 지정된 이름이 아닌 도메인 이름이 아닌 가상 디렉토리 경로에 대해서 이야기하고 명확하게 할 수 있어야합니다. 여기

Value from IIS I'd like to read from C# http://img252.imageshack.us/img252/6621/capturedz.png

+0

아래에 사용할 수 있습니까? –

+1

필자가 작성한 웹 응용 프로그램에 대한 라이센스를 부여하고 있으며 라이센스 키가 동일한 서버에서도 웹 응용 프로그램 당 한 번만 사용되는지 확인해야합니다. 웹 응용 프로그램은 IIS 사이트에 할당 된 여러 도메인 이름으로 작동하므로 사이트의 도메인 이름에 키를 바인딩 할 수 없습니다. 동일한 머신에서 여러 클라이언트에 대해 내 앱을 설치할 수 있기 때문에 동일한 헛된 바인딩에서 컴퓨터 이름에 대한 키를 사용할 수 없습니다. 간단히 말해서 특정 컴퓨터에서 IIS 웹 사이트를 고유하게 식별 할 필요가 있습니다. IIS는 같은 이름을 가진 여러 사이트를 허용하지 않기 때문에 그 길을 갈 수 있습니다. –

+0

나는 외눈 박이 소리에서 벗어나려하지 않았다. 나는 왜 누군가가 그렇게하고 싶어하는지 궁금하다. –

답변

55
System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName(); 
+0

에 대한 복제본이 아닙니다. 정확히 내가 찾고 있던 것입니다. 정말 고맙습니다. IIS6과 7 모두에서 작동하는지 여부를 알고 있습니까? –

+0

죄송합니다, IIS 6에서 테스트하지 않았습니다. –

+1

IIS 7/5.1에서 몇 분 동안 테스트했는데 IIS 6 (90 %)에서 작동한다고 생각합니다. –

10

는 사이트 ID를 검색에 related post입니다. 여기

당신을 위해 일 수있는 몇 가지 코드 :

using System.DirectoryServices; 
using System; 

public class IISAdmin 
{ 
    public static void GetWebsiteID(string websiteName) 
    { 
     DirectoryEntry w3svc = new DirectoryEntry("IIS://localhost/w3svc"); 

    foreach(DirectoryEntry de in w3svc.Children) 
    { 
     if(de.SchemaClassName == "IIsWebServer" && de.Properties["ServerComment"][0].ToString() == websiteName) 
     { 
      Console.Write(de.Name); 
     } 

    } 

    } 
    public static void Main() 
    { 
    GetWebsiteID("Default Web Site"); 
    } 

}

가 여기에 original post에 대한 링크입니다.

IIS7에서 작동하는지 잘 모르겠지만 IIS7 용 IIS6 호환성 구성 요소를 설치하면 작동합니다.

9

당신은 읽고 IIS 7.0 구성 시스템에 대한 쓰기 액세스를 제공 ServerManager (Microsoft.Web.Administration)을 찾고 있습니다.

Microsoft.Web.Administration.SiteCollection을 반복하고 사이트 개체를 사용하여 웹 사이트에 대한 참조를 가져오고 Name 속성 값을 읽습니다.

// Snippet   
using (ServerManager serverManager = new ServerManager()) { 

var sites = serverManager.Sites; 
foreach (Site site in sites) { 
     Console.WriteLine(site.Name); // This will return the WebSite name 
} 

당신은 또한 ServerManager.Sites 수집을 쿼리 LINQ를 사용할 수 있습니다

// Start all stopped WebSites using the power of Linq :) 
var sites = (from site in serverManager.Sites 
      where site.State == ObjectState.Stopped 
      orderby site.Name 
      select site); 

     foreach (Site site in sites) { 
      site.Start(); 
     } 

(아래 예 참조) : Microsoft.Web.Administration는 IIS7 작동합니다.

IIS6의 경우 ADSI와 WMI를 모두 사용할 수 있지만 ADSI보다 빠른 WMI를 사용하는 것이 좋습니다. WMI를 사용하는 경우 WMI Code Creator 1.0 (Microsoft에서 무료/개발)을 확인하십시오. 그것은 당신을 위해 코드를 생성합니다.

HTH

0

원격 서버에 연결할 때 먼저 ServerManager.OpenRemote ("서버 이름")을 수행해야합니다.

는 기본적으로 @belugabob 및 @CarlosAg으로이

  using (ServerManager srvMgr = ServerManager.OpenRemote("serverName")) 
      { 

      } 

see msdn help

10

같은 일을 이미 IApplicationHost.GetSiteName 방법을 직접 호출 할 수 없습니다 때문에 오히려 대신 System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()System.Web.Hosting.HostingEnvironment.SiteName를 사용하는 거라고 언급 !(msdn)

그래서 HostingEnvironment.SiteName 속성을 사용하는 것이 더 낫습니다! 나는이 문서에 대한 올바른 답해야한다고 생각 (msdn)

)

+1

감사합니다. 내 경우에는 System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()가 작동하지만 직렬화를 사용하여 추적 할 수없는 "유형이 멤버 용으로 해결되지 않았습니다."라는 오류가 발생했습니다. HostingEnvironment.SiteName으로 전환 한 후 사라졌습니다. 직렬화와 호환되지 않는 MarshalByRefObject와 관련이 있다고 가정합니다. HostingEnvironment.SiteName으로 전환하면 해당 문제가 해결되었습니다. –

0

당신은 동기 부여에 좀 더 정교한 코드

private string WebsiteName() 
{ 
    string websiteName = string.Empty; 
    string AppPath = string.Empty; 
    AppPath = Context.Request.ServerVariables["INSTANCE_META_PATH"]; 
    AppPath = AppPath.Replace("/LM/", "IIS://localhost/"); 
    DirectoryEntry root = new DirectoryEntry(AppPath); 
    websiteName = (string)root.Properties["ServerComment"].Value; 
    return websiteName; 
} 
관련 문제