2009-10-31 15 views
49

En mi aplicación web ASP.NET me gustaría buscar el nombre que se le asignó cuando se creó en IIS, que es exclusivo del servidor. No me interesaba el nombre de dominio del sitio web, sino el nombre real que se le daba al sitio en IIS.Obtener el nombre de un sitio IIS para un sitio web ASP.NET

tengo que ser capaz de hacerlo de forma fiable durante IIS6 y 7.

Para que quede claro que estoy hablando el nombre dado en IIS, no el nombre de dominio y no la ruta del directorio virtual.

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

+0

Nos puedes contar un poco más sobre la motivación? –

+1

Estoy haciendo licencias para una aplicación web que escribí y necesito asegurarme de que una clave de licencia solo se use una vez por aplicación web, incluso en el mismo servidor. La aplicación web funciona con múltiples nombres de dominio asignados al sitio de IIS, por lo que no será vinculante la clave del nombre de dominio del sitio. En la misma unión en vano, la clave del nombre de la máquina tampoco funcionará, ya que mi aplicación podría instalarse para múltiples clientes en la misma máquina. En resumen, necesito algo que identifique de manera única el sitio web de IIS en una máquina en particular. Dado que IIS no permite múltiples sitios con el mismo nombre, creo que es el camino a seguir. –

+0

No quise decir que sonaba condescendiente, solo tengo curiosidad de por qué alguien querría hacer eso. –

Respuesta

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

Eso es exactamente lo que estaba buscando. Muchas gracias. ¿Sabes si funciona tanto para IIS6 como para 7? –

+0

Lo siento, no lo he probado en IIS 6. –

+1

Lo probé para IIS 7/5.1 a pocos minutos de edad, creo que funciona para IIS 6 (90%). –

10

Aquí es una related post en la recuperación de la ID del sitio.

Aquí un código que podría funcionar para usted:

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"); 
    } 

}

Aquí está el enlace a la original post.

No estoy seguro de si funcionará en IIS7, pero si instala los componentes de compatibilidad de IIS6 para IIS7 debería funcionar.

9

Usted está buscando ServerManager (Microsoft.Web.Administration) que proporciona acceso de lectura y escritura al sistema de configuración de IIS 7.0.

Revise a través de Microsoft.Web.Administration.SiteCollection, obtenga una referencia de su sitio web utilizando el Objeto del sitio y lea el valor de la propiedad Nombre.

// 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 
} 

También puede utilizar LINQ para consultar la colección ServerManager.Sites (véase el ejemplo siguiente)

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

Nota: Microsoft.Web.Administration funciona única con IIS7.

Para IIS6 puede usar tanto ADSI como WMI para hacer esto, pero le sugiero que vaya a WMI que es más rápido que ADSI. Si usa WMI, eche un vistazo a WMI Code Creator 1.0 (Gratis/Desarrollado por Microsoft). Generará el código para ti.

HTH

0

Usted tendrá que hacer el ServerManager.OpenRemote ("servidor") en primer lugar cuando se conecta a un servidor remoto.

Básicamente haciendo algo como esto

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

      } 

see msdn help

10

Como @belugabob y @CarlosAg ya se ha mencionado prefiero usar System.Web.Hosting.HostingEnvironment.SiteName en lugar de System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName() porque el método IApplicationHost.GetSiteName no está destinado a ser llamado directamente !(msdn)

¡Así que es mejor utilizar la propiedad HostingEnvironment.SiteName! (msdn)

creo que esto debería ser la respuesta correcta con respecto a la documentación;)

+1

Gracias por señalar esto. En mi caso, System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName() funcionó, pero luego me encontré con un "Tipo no resuelto para miembro" con serialización, que no pude rastrear. Después de cambiar a HostingEnvironment.SiteName, desapareció. Supongo que tiene algo que ver con que MarshalByRefObject no es compatible con la serialización. Solo en caso de que alguien sea golpeado por esto también, cambiar a HostingEnvironment.SiteName resolvió ese problema. –

0

Puede utilizar a continuación el código

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; 
} 
Cuestiones relacionadas