Как получить текущее доменное имя в ASP.NET

84

Я хочу получить текущее доменное имя в asp.net c #.

Я использую этот код.

string DomainName = HttpContext.Current.Request.Url.Host;

Мой URL есть, localhost:5858но он только возвращается localhost.

Теперь я использую свой проект на localhost. Я хочу получить localhost: 5858.

Другой пример, когда я использую этот домен

www.somedomainname.com

я хочу получить somedomainname.com

Пожалуйста, дайте мне идею, как получить текущее доменное имя.

Джатин Гадхия
источник
1
Имя хоста и имя домена - это две разные вещи. Вам нужен домен, который сопоставлен с вашим конкретным IP-адресом или именем хоста компьютера, на котором он работает?
Роб Гудвин
var base_url = "@ Request.Url.GetLeftPart (UriPartial.Authority) @ Url.Content (" ~ / ")"
принц Прасад

Ответы:

81

Использование Request.Url.Hostуместно - это способ получения значения HTTP- Host:заголовка, который указывает, какое имя хоста (доменное имя) хочет UA (браузер), поскольку часть пути к ресурсам HTTP-запроса не включает имя хоста.

Обратите внимание, что localhost:5858это не имя домена, это спецификатор конечной точки, также известный как «авторитет», который включает имя хоста и номер порта TCP. Это извлекается путем доступа Request.Uri.Authority.

Кроме того, она не действует , чтобы получить somedomain.comот www.somedomain.comпотому что веб - сервер может быть настроены для другого сайта по www.somedomain.comсравнению с somedomain.com, однако , если вы уверены , что это справедливо в вашем случае , то вам необходимо вручную разобрать имя хоста, несмотря на использование String.Split('.')произведения в щепотка.

Обратите внимание, что конфигурация веб-сервера (IIS) отличается от конфигурации ASP.NET, и что ASP.NET фактически полностью игнорирует конфигурацию привязки HTTP веб-сайтов и веб-приложений, под которыми он работает. Тот факт, что и IIS, и ASP.NET используют одни и те же файлы конфигурации ( web.config), является красной селедкой.

Дай
источник
121

Попробуйте получить «левую часть» URL-адреса, например:

string domainName = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);

Это даст вам либо http://localhost:5858или https://www.somedomainname.comвы на местном или производстве ли. Если вы хотите отбросить wwwчасть, вам следует настроить IIS для этого, но это уже другая тема.

Обратите внимание, что полученный URL-адрес не будет иметь косой черты в конце.

Артуро Торрес Санчес
источник
7
На мой взгляд, это должен быть лучший ответ.
Эндрю
Это отлично сработало для моих нужд. Однако одно небольшое исправление: при запросе части Authority возвращаемая строка не будет включать конечный разделитель пути. Таким образом:http://localhost:60333
Will
1
var base_url = "@ Request.Url.GetLeftPart (UriPartial.Authority) @ Url.Content (" ~ / ")"
Prince Prasad
1
Похоже, это не работает на Asp.Net Core 2.2. Я получаю, что «HttpContext» не содержит определения для «Current», и не может быть найден доступный метод расширения «Current», принимающий первый аргумент типа «HttpContext» (вам не хватает директивы using или ссылки на сборку?).
Stian
@Stian По-видимому, на это уже есть ответ: stackoverflow.com/questions/31243068/… . Эти ответы сосредоточены только на части URI.
Артуро Торрес Санчес
42

Вот скриншот Request.RequestUriи все его свойства для всеобщего ознакомления.

введите описание изображения здесь

ThiagoPXP
источник
18

Вы можете попробовать следующий код:

 Request.Url.Host +
    (Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port)
Раджив Мехта
источник
6

www.somedomain.com это домен / хост. Поддомен - важная часть. www.часто используется взаимозаменяемо с отсутствием такового, но это должно быть настроено как правило (даже если оно установлено по умолчанию), потому что они не эквивалентны. Подумайте о другом субдомене, например mx.. У него, вероятно, другая цель, чем у www..

Учитывая это, я бы посоветовал не делать таких вещей. Тем не менее, раз уж вы спрашиваете, я полагаю, у вас есть веская причина.

Лично я бы посоветовал www.для этого специальный корпус .

string host = HttpContext.Current.Request.Url.GetComponents(UriComponents.HostAndPort, UriFormat.Unescaped);;

if (host.StartsWith("www."))
    return host.Substring(4);
else
    return host;

В противном случае, если вы действительно на 100% уверены, что хотите отрубить любой поддомен, вам понадобится что-то посложнее.

string host = ...;

int lastDot = host.LastIndexOf('.');

int secondToLastDot = host.Substring(0, lastDot).LastIndexOf('.');

if (secondToLastDot > -1)
    return host.Substring(secondToLastDot + 1);
else
    return host;

Получение порта происходит так же, как и другие люди.

Мэтью Хауген
источник
1

HttpContext.Current.Request.Url.Host возвращает правильные значения. Если вы запустите его на www.somedomainname.com, он даст вам www.somedomainname.com. Если вы хотите получить и 5858, вам нужно использовать

HttpContext.Current.Request.Url.Port 
artm
источник
1

у Request.ServerVariablesменя объект работает. Я не знаю ни одной причины не использовать его.

ServerVariables["SERVER_NAME"]и ServerVariables["HTTP_URL"]должен получить то, что ищешь

Пи Джей Лейрер
источник
1

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

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
Йогеш Патель
источник
4
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода.
Д-р Роб Ланг,
1

Вот быстрый и простой способ просто получить имя URL-адреса.

            var urlHost = HttpContext.Current.Request.Url.Host;

            var xUrlHost = urlHost.Split('.');
            foreach(var thing in xUrlHost)
            {
                if(thing != "www" && thing != "com")
                {
                    urlHost = thing;
                }
            }
dstineback
источник
0

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

@ Request.Url.GetLeftPart (UriPartial.Authority)

Хирен Патель
источник
В этом ответе не уточняется, почему это работает, и фактически он идентичен одному из существующих ответов.
Arturo Torres Sánchez
0

Чтобы получить базовый URL в MVC даже с поддоменом www.somedomain.com/subdomain:

var url = $"{Request.Url.GetLeftPart(UriPartial.Authority)}{Url.Content("~/")}";
Иван-Сан
источник
0

Я использую это так в asp.net core 3.1

 var url =Request.Scheme+"://"+ Request.Host.Value;
zoha_sh
источник