Как я могу получить baseurl сайта? - PullRequest
170 голосов
/ 14 сентября 2011

Я хочу написать небольшой вспомогательный метод, который возвращает базовый URL сайта. Вот что я придумал:

public static string GetSiteUrl()
{
    string url = string.Empty;
    HttpRequest request = HttpContext.Current.Request;

    if (request.IsSecureConnection)
        url = "https://";
    else
        url = "http://";

    url += request["HTTP_HOST"] + "/";

    return url;
}

Есть ли в этом какая-то ошибка, о которой вы можете подумать? Кто-нибудь может улучшить это?

Ответы [ 13 ]

309 голосов
/ 14 сентября 2011

Попробуйте это:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + 
    Request.ApplicationPath.TrimEnd('/') + "/";
164 голосов
/ 14 декабря 2012
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)

Вот и все;)

8 голосов
/ 14 декабря 2014

Популярное решение GetLeftPart не поддерживается в PCL-версии Uri, к сожалению.GetComponents, однако, поэтому, если вам нужна переносимость, это должно помочь:

uri.GetComponents(
    UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);
6 голосов
/ 03 мая 2013

Я считаю, что ответы выше не учитывают, когда сайт не находится в корне сайта.

Это для контроллера WebApi:

string baseUrl = (Url.Request.RequestUri.GetComponents(
                    UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/') 
                 + HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;
6 голосов
/ 14 марта 2013

Для меня @ warlock выглядит как лучший ответ здесь, но я всегда использовал это в прошлом;

string baseUrl = Request.Url.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.UriEscaped)   

Или в контроллере WebAPI;

string baseUrl = Url.Request.RequestUri.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.Unescaped)

, что удобно, так что вы можете выбрать нужный вам формат выхода.Мне непонятно, почему есть две такие разные реализации, и, насколько я могу судить, этот метод и @ warlock возвращают точно такой же результат в этом случае, но похоже, что GetLeftPart() также будет работать для несерверного Uri, какmailto тегов, например.

5 голосов
/ 18 февраля 2015

Я иду с

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
4 голосов
/ 22 ноября 2013

Основываясь на том, что написал Warlock, я обнаружил, что корневой каталог виртуального пути необходим, если вы не размещены в корневом каталоге вашей сети. (Это работает для контроллеров MVC Web API)

String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) 
+ Configuration.VirtualPathRoot;
4 голосов
/ 05 августа 2013

Это гораздо более надежный метод.

VirtualPathUtility.ToAbsolute("~/");
1 голос
/ 28 апреля 2015

Я использую следующий код из Application_Start

String baseUrl = Path.GetDirectoryName(HttpContext.Current.Request.Url.OriginalString);

1 голос
/ 21 октября 2014

Это работает для меня.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString : вернуть полный путь, такой же, как в браузере.
  • Request.Url.PathAndQuery : вернуть (полный путь) - (имя домена + PORT).
  • Request.ApplicationPath : вернуть «/» на размещенном сервере и «имя приложения»"при локальном развертывании IIS.

Поэтому, если вы хотите получить доступ к своему доменному имени, не забудьте включить имя приложения в случае:

  1. развертывания IIS
  2. Если ваше приложение развернуто на поддомене.
...