C # /. Caminho NET Server para página padrão / index
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
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).