Domanda

Ho avuto un vero e proprio incubo con Server.MapPath(). Quando chiamo Server.MapPath("~") nella mia applicazione in esecuzione in ASP.NET Development Server restituisce directory principale che termina in una barra rovesciata come f:\projects\app1\, ma io lo chiamo in versione pubblicata, installata in IIS, restituisce directory root senza alcuna barra rovesciata come c:\inetpub\wwwroot\app1. Perché questo accade? Come poteva evitare?

Ho fatto 2 scenari su una stessa macchina:. Windows Server 2008 R2 x64, Visual Studio 2010 x64, IIS 7

UPDATE:

Perché mi preoccupo a questo proposito? Ineed ho scritto un sito personalizzato fornitore di mappe in base alla struttura di file / cartelle. Estrae elenco di file / cartelle di directory principale "~", sostituisce la sezione directory root con Server.MapPath("~") al fine di generare URL di file .aspx per il controllo di Menu ASP.NET. Penso seguente codice spiega quello che sto facendo:

    string mainRoot = HttpContext.Current.Server.MapPath("~");

    DirectoryInfo di = new DirectoryInfo(mainRoot); 

    //added to solve this problem with Server.MapPath
    if (!mainRoot.EndsWith(@"\"))
        mainRoot += @"\";


    FileInfo[] files = di.GetFiles("*.aspx");
    foreach (FileInfo item in files)
    {
        string path = item.FullName.Replace(mainRoot, "~/").Replace(@"\", "/");

        //do more here
    }
È stato utile?

Soluzione

Potrebbe essere da quando si imposta la directory virtuale di IIS all'interno, a seconda se si è utilizzato una barra finale, quando la sua creazione.

Ma è veramente importante? Perché dovresti anche la cura che cosa Server.MapPath("~") rendimenti? Non riesco a immaginare che ci si mai usarlo proprio così. Molto più probabile è quando è effettivamente necessario un percorso per qualcosa di all'interno la vostra applicazione:

Server.MapPath("~/Something/Foo.txt");

Inoltre, ogni volta che si costruisce percorsi, si dovrebbe cercare di prendere l'abitudine di usare Path.Combine , perché non è necessario preoccuparsi di trailing slash a tutti allora:

string fullPath = Path.Combine(Server.MapPath("~"), @"Something\Foo.txt");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top