Подтвердить что ты не робот

Как получить URL-адрес корневого сайта?

Я хочу получить абсолютный корень 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.

4b9b3361

Ответ 1

Я решил это, добавив параметр web.config в AppSettings ( "SiteRootUrl" ). Простая и эффективная, но еще одна настройка конфигурации для поддержки.

Ответ 2

Для 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("~/")

Ответ 3

Вы можете попробовать получить необработанный URL-адрес и отключить все после косой черты. Вы также можете включить ResolveUrl("~/").

Ответ 4

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("~/");

}

Ответ 5

public static string GetFullRootUrl()
{   
    HttpRequest request = HttpContext.Current.Request;
    return request.Url.AbsoluteUri.Replace(request.Url.AbsolutePath, String.Empty);
}

Ответ 6

 UrlHelper url = new UrlHelper(filterContext.RequestContext);
 string helpurl = url.Action("LogOn", "Account", new { area = "" },
                      url.RequestContext.HttpContext.Request.Url.Scheme);

Может получить абсолютный URL

Ответ 7

@saluce была отличная идея, но его код по-прежнему требует ссылки на объект и поэтому не может работать в некоторых блоках кода. При следующем, если у вас есть Current.Request, будет работать следующее:

With HttpContext.Current.Request
    Return .Url.GetLeftPart(UriPartial.Authority) + .ApplicationPath + If(.ApplicationPath = "/", Nothing, "/")
End With

Это будет работать независимо от протокола, порта или корневой папки.

Ответ 8

Это всегда работало для меня

string root = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery, "");

Ответ 9

Основано на 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;
}