Ответ 1
Я решил это, добавив параметр web.config в AppSettings ( "SiteRootUrl" ). Простая и эффективная, но еще одна настройка конфигурации для поддержки.
Я хочу получить абсолютный корень Url приложения ASP.NET динамически. Это должен быть полный корневой URL-адрес приложения в форме: http (s)://hostname (: port)/
Я использовал этот статический метод:
public static string GetSiteRootUrl()
{
string protocol;
if (HttpContext.Current.Request.IsSecureConnection)
protocol = "https";
else
protocol = "http";
StringBuilder uri = new StringBuilder(protocol + "://");
string hostname = HttpContext.Current.Request.Url.Host;
uri.Append(hostname);
int port = HttpContext.Current.Request.Url.Port;
if (port != 80 && port != 443)
{
uri.Append(":");
uri.Append(port.ToString());
}
return uri.ToString();
}
НО, что, если у меня нет HttpContext.Current
в области видимости?
Я столкнулся с этой ситуацией в CacheItemRemovedCallback
.
Я решил это, добавив параметр web.config в AppSettings ( "SiteRootUrl" ). Простая и эффективная, но еще одна настройка конфигурации для поддержки.
Для WebForms этот код вернет абсолютный путь корневого приложения, независимо от того, насколько вложенным может быть приложение:
HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + ResolveUrl("~/")
В первой части выше приведена схема и доменное имя приложения (http://localhost
) без конечной косой черты. Код ResolveUrl
возвращает относительный путь к корню приложения (/MyApplicationRoot/
). Объединив их вместе, вы получите абсолютный путь к приложению веб-форм.
Использование MVC:
HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content("~/")
или, если вы пытаетесь использовать его непосредственно в представлении Razor:
@HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)@Url.Content("~/")
Вы можете попробовать получить необработанный URL-адрес и отключить все после косой черты. Вы также можете включить ResolveUrl("~/")
.
public static string GetAppUrl()
{
// This code is tested to work on all environments
var oRequest = System.Web.HttpContext.Current.Request;
return oRequest.Url.GetLeftPart(System.UriPartial.Authority)
+ System.Web.VirtualPathUtility.ToAbsolute("~/");
}
public static string GetFullRootUrl()
{
HttpRequest request = HttpContext.Current.Request;
return request.Url.AbsoluteUri.Replace(request.Url.AbsolutePath, String.Empty);
}
UrlHelper url = new UrlHelper(filterContext.RequestContext);
string helpurl = url.Action("LogOn", "Account", new { area = "" },
url.RequestContext.HttpContext.Request.Url.Scheme);
Может получить абсолютный URL
@saluce была отличная идея, но его код по-прежнему требует ссылки на объект и поэтому не может работать в некоторых блоках кода. При следующем, если у вас есть Current.Request
, будет работать следующее:
With HttpContext.Current.Request
Return .Url.GetLeftPart(UriPartial.Authority) + .ApplicationPath + If(.ApplicationPath = "/", Nothing, "/")
End With
Это будет работать независимо от протокола, порта или корневой папки.
Это всегда работало для меня
string root = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery, "");
Основано на Uri, но удаление строк запроса и обработка, когда это виртуальный каталог с IIS:
private static string GetSiteRoot()
{
string siteRoot = null;
if (HttpContext.Current != null)
{
var request = HttpContext.Current.Request;
siteRoot = request.Url.AbsoluteUri
.Replace(request.Url.AbsolutePath, String.Empty) // trim the current page off
.Replace(request.Url.Query, string.Empty); // trim the query string off
if (request.Url.Segments.Length == 4)
{
// If hosted in a virtual directory, restore that segment
siteRoot += "/" + request.Url.Segments[1];
}
if (!siteRoot.EndsWith("/"))
{
siteRoot += "/";
}
}
return siteRoot;
}