Виртуальный каталог 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