Domanda

Nel mio tentativo di realizzare un progetto a prova di futuro, sto cercando di trovare il modo migliore per recuperare il percorso completo e il nome del file dell'indice / pagina predefinita in una directory Web usando C # e senza conoscere l'elenco delle possibilità del nome del server Web .

'Server.MapPath (" / test / ")' mi dà 'C: \ www \ test \'

... così fa: 'Server.MapPath (Page.ResolveUrl (" / test / "))'

... ma ho bisogno di 'C: \ www \ test \ index.html'.

Qualcuno sa di un metodo esistente per recuperare il nome del file che il server web servirà quando qualcuno accede a quella directory - sia default.aspx, o index.html, o altro?

Grazie per l'aiuto, foraggio

È stato utile?

Soluzione

ASP.NET non ne è a conoscenza. Dovresti interrogare IIS per l'elenco di documenti predefinito.

La ragione di ciò è che IIS cercherà nella cartella Web il primo file corrispondente nell'elenco documenti predefinito IIS, quindi passerà all'estensione ISAPI corrispondente per quel tipo di file (per estensione) nelle mappature degli script.

Per ottenere l'elenco di documenti predefinito è possibile effettuare le seguenti operazioni (utilizzando il sito Web predefinito come esempio in cui il numero 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(',');

            }
        }
    }
}

Sarebbe quindi un caso di iterare l'array defaultDocs per vedere quale file esiste nella cartella, la prima corrispondenza è il documento predefinito. Ad esempio:

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

Purtroppo questo non funzionerà se ci si trova in un ambiente ASP.NET parzialmente attendibile (ad esempio hosting condiviso).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top