Может ли кто-нибудь объяснить разницу между Server.MapPath("."), Server.MapPath("~"), Server.MapPath(@"\") и Server.MapPath("/")?
Server.MapPath( "." ), Server.MapPath( "~" ), Server.MapPath(@ "\" ), Server.MapPath( "/" ). В чем разница?
Ответ 1
Server.MapPath указывает относительный или виртуальный путь для сопоставления в физическом каталоге.
-  Server.MapPath(".")1 возвращает текущий физический каталог исполняемого файла (например, aspx)
-  Server.MapPath("..")возвращает родительский каталог
-  Server.MapPath("~")возвращает физический путь к корню приложения
-  Server.MapPath("/")возвращает физический путь к корню имени домена (не обязательно совпадает с корнем приложения)
Пример:
Скажем, вы указали приложение веб-сайта (http://www.example.com/) на
C:\Inetpub\wwwroot
и установил приложение вашего магазина (суб-веб как виртуальный каталог в IIS, помеченный как приложение) в
D:\WebApps\shop
Например, если вы вызываете Server.MapPath() в следующем запросе:
http://www.example.com/shop/products/GetProduct.aspx?id=2342
то
-  Server.MapPath(".")1 возвращаетD:\WebApps\shop\products
-  Server.MapPath("..")возвращаетD:\WebApps\shop
-  Server.MapPath("~")возвращаетD:\WebApps\shop
-  Server.MapPath("/")возвращаетC:\Inetpub\wwwroot
-  Server.MapPath("/shop")возвращаетD:\WebApps\shop
Если Path начинается с косой черты (/) или обратной косой черты (\), MapPath() возвращает путь, как если бы путь был полным, виртуальным путем.
Если Путь не начинается с косой черты, MapPath() возвращает путь относительно каталога обрабатываемого запроса.
Примечание: в С#, @ является оператором строковой строки, означающим, что строка должна использоваться как "как есть" и не обрабатываться для escape-последовательностей.
Сноска
-  Server.MapPath(null)иServer.MapPath("")будет производить этот эффект тоже.
Ответ 2
Просто чтобы увеличить на @splattne немного:
 MapPath(string virtualPath) вызывает следующее:
public string MapPath(string virtualPath)
{
    return this.MapPath(VirtualPath.CreateAllowNull(virtualPath));
}
 MapPath(VirtualPath virtualPath) в свою очередь вызывает MapPath(VirtualPath virtualPath, VirtualPath baseVirtualDir, bool allowCrossAppMapping), который содержит следующее:
//...
if (virtualPath == null)
{
    virtualPath = VirtualPath.Create(".");
}
//...
Итак, если вы вызываете MapPath(null) или MapPath(""), вы фактически вызываете MapPath(".")
