Pregunta

En mi intento de preparar un proyecto para el futuro, estoy tratando de encontrar la mejor manera de recuperar la ruta completa y el nombre de archivo de la página índice / predeterminada en un directorio web usando C # y sin conocer la lista de posibilidades de nombre de archivo del servidor web .

'Server.MapPath (" / test / ")' me da 'C: \ www \ test \'

... también lo hace: 'Server.MapPath (Page.ResolveUrl (" / test / "))'

... pero necesito 'C: \ www \ test \ index.html'.

¿Alguien sabe de un método existente para recuperar el nombre de archivo que el servidor web servirá cuando alguien navegue a ese directorio, ya sea default.aspx o index.html, o lo que sea?

Gracias por cualquier ayuda, forraje

¿Fue útil?

Solución

ASP.NET no tiene conocimiento de esto. Debería consultar IIS para obtener la lista de documentos predeterminada.

La razón de esto es que IIS buscará en su carpeta web el primer archivo coincidente en la lista de documentos predeterminados de IIS y luego pasará a la extensión ISAPI correspondiente para ese tipo de archivo (por extensión) en las asignaciones de script.

Para obtener la lista de documentos predeterminada, puede hacer lo siguiente (usando el sitio web predeterminado como ejemplo donde el número IIS = 1):

using System;
using System.DirectoryServices;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (DirectoryEntry w3svc =
                 new DirectoryEntry("IIS://Localhost/W3SVC/1/root"))
            {
                string[] defaultDocs =
                    w3svc.Properties["DefaultDoc"].Value.ToString().Split(',');

            }
        }
    }
}

Entonces sería un caso de iterar la matriz defaultDocs para ver qué archivo existe en la carpeta, la primera coincidencia es el documento predeterminado. Por ejemplo:

// Call me using: string doc = GetDefaultDocument("/");
public string GetDefaultDocument(string serverPath)
{

    using (DirectoryEntry w3svc =
         new DirectoryEntry("IIS://Localhost/W3SVC/1/root"))
    {
        string[] defaultDocs =
            w3svc.Properties["DefaultDoc"].Value.ToString().Split(',');

        string path = Server.MapPath(serverPath);

        foreach (string docName in defaultDocs)
        {
            if(File.Exists(Path.Combine(path, docName)))
            {
                Console.WriteLine("Default Doc is: " + docName);
                return docName;
            }
        }
        // No matching default document found
        return null;
    }
}

Lamentablemente, esto no funcionará si se encuentra en un entorno ASP.NET de confianza parcial (por ejemplo, alojamiento compartido).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top