Як я можу отримати базовий сайт?


183

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

Чи є в цьому помилка, яку ви можете подумати? Чи може хтось покращити це?



Відповіді:


324

Спробуйте це:

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

13
Це єдина відповідь, яку я знайшов, що стосується випадку, коли веб-сайт додаток, який є дочірнім веб-сайтом верхнього рівня в IIS.
Іван

6
string.Format ("{0} {1} /", Request.Url.GetLeftPart (UriPartial.Authority), Request.ApplicationPath.TrimEnd ('/'))
diegohb

2
Request.Url.Scheme не завжди працює, коли у вас на сервері встановлений внутрішній http і встановлено припинення SSL для https, але запускається https * зовні. Щоб обійти це, я просто створив специфічний для середовища середовище AppSetting Key "UrlScheme" зі значенням "http" або "https" залежно від місця проживання веб-сайту. Цей параметр у web.config можна отримати за допомогою ConfigurationManager.AppSettings ["Key"]
Бен Сьюардс

3
Це не враховує балансування навантаження, де відбувається розшифрування або проксі-проксі. Ви можете скористатися цією неправильною адресою, тому будьте уважні та знайте, куди було розміщено ваш веб-сайт.
Conor Gallagher

$ "{System.Web.HttpContext.‌ Current.Request.Url.GetLeftPart (UriPartial.Authority)} {System.Web.HttpContext.Cur‌ rent.Request.ApplicationPath? .TrimEnd ('/')} /";
Ryan Penfold

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

Це воно ;)


25
Це не працює для віртуального або прикладного шляху. Додатково до лівої частини слід використовувати Request.ApplicationPath.
Warlock

базовий URL - це httpx: //domain.com: [порт] / ви повинні додати шлях до програми до цього рішення
Pawel Cioch

9

На жаль, популярне GetLeftPartрішення не підтримується у версії PCL Uri, на жаль. GetComponentsОднак, тож якщо вам потрібна портативність, це слід зробити:

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

6

Я вважаю, що відповіді вище не враховують, коли сайт не знаходиться в корені веб-сайту.

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

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

Зсередини контролера використовуйте Configuration.VirtualPathRoot, оскільки він не залежить від хоста.
Даррел Міллер

5

Для мене @ warlock виглядає як найкраща відповідь досі, але я завжди використовував це в минулому;

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

Або в контролері WebAPI;

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

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


повертає недійсну URL-адресу для випадків, коли ви знаходитесь за тунелем ngrok та https
Мохаммед Зекралла


4

Я йду з

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

1
Це додасть протокол: (HttpContext.Request.ServerVariables ["HTTPS"] == "вимкнено"? "Http: //": "https: //") + HttpContext.Request.ServerVariables ["HTTP_HOST"]
onemorecupofcoffee

4

Спираючись на те, що написав Уорлок, я виявив, що корінь віртуального шляху потрібен, якщо ви не розміщені в корені веб-сторінок. (Це працює для контролерів MVC Web API)

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

1

Я використовую наступний код від Application_Start

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


1

Це працює для мене.

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

Тож якщо ви хочете отримати доступ до свого доменного імені, врахуйте, що ім'я програми буде включено у разі:

  1. Розгортання IIS
  2. Якщо ваша програма розгорнута на піддомені.

======================================

Для dev.x.us/web

він повертає цей сильний текст


0

Будь ласка, використовуйте наведений нижче код                           

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);

Поясніть свій код, щоб інші користувачі могли зрозуміти його функціональність. Дякую!
Ігнасіо Ара


-2

ви могли б додати в порт для непорту 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());
            }

і використовувати це в кінцевому результаті?


6
Request.Url.Authorityвключить номер порту, якщо він нестандартний
Andomar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.