Как я могу получить baseurl сайта?

Я хочу написать небольшой вспомогательный метод, который возвращает базовый 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;
}

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

Ответ 1

Попробуйте следующее:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + 
    Request.ApplicationPath.TrimEnd('/') + "/";

Ответ 2

string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)

Что это;)

Ответ 3

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

uri.GetComponents(
    UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);

Ответ 4

Для меня, @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

Я иду с

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]

Ответ 6

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

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

string baseUrl = (Url.Request.RequestUri.GetComponents(
                    UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/') 
                 + HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;

Ответ 7

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

String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) 
+ Configuration.VirtualPathRoot;

Ответ 8

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

VirtualPathUtility.ToAbsolute("~/");

Ответ 9

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

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

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

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

Ответ 10

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

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

Ответ 11

вы могли бы добавить в порт для порта 80/SSL?

что-то вроде:

if (HttpContext.Current.Request.ServerVariables["SERVER_PORT"] != null && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "80" && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "443")
            {
                port = String.Concat(":", HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString());
            }

и использовать это в конечном результате?