Виртуальный каталог root против корневого сайта по умолчанию

Я использую IIS 5.1, в котором у нас есть только один веб-сайт по умолчанию,

У меня есть два проекта v2 и v3

мой веб-сайт указывает на проекты v2, и у меня есть несколько папок с изображениями, стилями и т.д.

на домашней странице обоих проектов у меня есть

img src="\images\edlogo.gif" alt="logo"/>

но это показывает то же изображение, которое находится в каталоге v2, Как я могу показать разные изображения для обоих проектов. с помощью "\" получить корень веб-сайта, но как мне получить корневой каталог виртуального каталога на этом веб-сайте?

5 ответов

Решение

Этот статический метод возвращает вам полный http-путь к корневой папке вашего приложения (веб-сайт или виртуальный каталог)

public static string GetAppRootUrl(bool endSlash) { 
   string host = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
   string appRootUrl = HttpContext.Current.Request.ApplicationPath;
   if (!appRootUrl.EndsWith("/")) //a virtual
   {
       appRootUrl += "/";
   }
   if (!endSlash)
   {
       appRootUrl = appRootUrl.Substring(0, appRootUrl.Length - 1);
   }
   return host + appRootUrl;
}

Итак, вы можете написать на своей странице:

<img src="<%= Server.HtmlEncode(GetAppRootUrl(false)) %>/images/edlogo.gif" alt="logo"/>

В вашем сообщении чего-то не хватает, вы можете опубликовать это, пожалуйста?

Вы могли бы использовать относительный путь

 <img src="../images/edlogo.gif" alt="logo"/>

Ваш пример кода всегда будет получать его из корневого каталога.

Используйте относительные URL. Смотрите здесь, например, "images / bg.jpg" на странице "http: //v2/default.html" будет указывать на "http: //v2/images/bg.jpg", в то время как тот же код на странице "http: //v2/v3/default.html "будет указывать на" http: //v2/v3/images/bg.jpg "

Итак, ваш код становится:

img src="images\edlogo.gif" alt="logo"/>

Тем не менее, неприятным побочным эффектом является то, что вы не можете перемещать свою домашнюю страницу в структуре каталогов своего веб-сайта, не разрывая ссылку.

Мне любопытно, однако, почему вы выбрали бы такой вид настройки? Разве не было бы проще сделать v3 веб-сайтом и поместить его на тот же уровень каталогов, что и v2?

Может быть, вы можете использовать HttpRuntime.AppDomainAppVirtualPath или же Request.ApplicationPath,

Тоже Page.ResolveUrl("~") Полезно.

Пример использования моего виртуального каталога /v2

    HttpRuntime.AppDomainAppVirtualPath = /v2
    Request.ApplicationPath = /v2
    Request.FilePath = /v2/Inicio.aspx
    GetAppRootUrl(false) = http://localhost:2029/v2
    Page.ResolveUrl("~") = /v2/

Просмотрите класс и методы System.Web.VirtualPathUtility (.Net 2.0 и более поздние версии).

http://msdn.microsoft.com/en-us/library/system.web.virtualpathutility.aspx

Просмотрите объект System.Web.HttpRequest

http://msdn.microsoft.com/en-us/library/system.web.httprequest.filepath(v=vs.100).aspx

Public Function GetRoot() As String
    Return System.Web.VirtualPathUtility.MakeRelative(Request.FilePath, Request.ApplicationPath)
End Function
Другие вопросы по тегам