Pergunta

Em minha tentativa de ainda mais à prova de futuro um projeto que eu estou tentando encontrar a melhor maneira de recuperar o caminho completo e nome da página de índice / default em um diretório web utilizando C # e sem conhecer a lista do servidor web de possibilidades de nome de arquivo .

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

... faz assim: 'Server.MapPath (Page.ResolveUrl ( "test / /"))'

... mas eu preciso 'C: \ www \ test \ index.html'.

Alguém sabe de um método existente de recuperar o nome do arquivo que o servidor irá servir-se quando alguém navega para esse diretório? - seja ele default.aspx, ou index.html, ou qualquer

Obrigado por qualquer ajuda, forragem

Foi útil?

Solução

ASP.NET não tem conhecimento disso. Você precisaria consulta IIS para a lista de documentos padrão.

A razão para isso é que o IIS vai olhar na sua pasta web para o primeiro arquivo correspondente no IIS lista de documentos padrão, em seguida, entregar para a extensão ISAPI correspondente para esse tipo de arquivo (por extensão) nos mapeamentos de script.

Para obter a lista de documentos padrão que você pode fazer o seguinte (usando o site padrão como um exemplo onde o IIS Number = 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(',');

            }
        }
    }
}

Seria então um caso de iteração a matriz defaultDocs para ver qual arquivo existe na pasta, o primeiro jogo é o documento padrão. Por exemplo:

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

Infelizmente este não vai funcionar se você estiver em um ambiente ASP.NET confiança parcial (por exemplo, hospedagem compartilhada).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top