Non Server.MapPath comporta in modo diverso in Macchina e il server locale?
-
01-10-2019 - |
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
}
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");