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-последовательностей.

Сноска

Ответ 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(".")