Какой лучший способ получить текущий домен в ASP.NET? - PullRequest
98 голосов
/ 15 сентября 2008

Мне интересно, как лучше всего получить текущий домен в ASP.NET?

Например:

http://www.domainname.com/subdir/ должно дать http://www.domainname.com http://www.sub.domainname.com/subdir/ должно дать http://sub.domainname.com

В качестве руководства я должен иметь возможность добавить URL-адрес, например "/Folder/Content/filename.html" (скажем, сгенерированный Url.RouteUrl () в ASP.NET MVC), прямо на URL, и он должен работать .

Ответы [ 10 ]

178 голосов
/ 21 мая 2010

Тот же ответ, что и у Мэтта Митчелла, но с некоторыми изменениями. Вместо этого проверяется порт по умолчанию.

Редактировать: обновлен синтаксис и используется Request.Url.Authority, как предложено

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"
37 голосов
/ 15 сентября 2008

Согласно этой ссылке хорошая отправная точка:

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 

Однако, если домен http://www.domainname.com:500, это не удастся.

Что-то вроде следующего соблазнительно решить эту проблему:

int defaultPort = Request.IsSecureConnection ? 443 : 80;
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 
  + (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : "");

Однако порты 80 и 443 будут зависеть от конфигурации.

Таким образом, вы должны использовать IsDefaultPort, как в Принято Ответ выше от Карлоса Муньоса.

28 голосов
/ 31 декабря 2011
Request.Url.GetLeftPart(UriPartial.Authority)

Это включенная схема.

19 голосов
/ 01 мая 2011

ПРЕДУПРЕЖДЕНИЕ! Всем, кто использует Current.Request .Url.Host. Поймите, что вы работаете на основе ТЕКУЩЕГО ЗАПРОСА, и что текущий запрос ВСЕГДА не будет с вашим сервером, а иногда может быть с другими серверами.

Так что, если вы используете это в чем-то вроде Application_BeginRequest () в Global.asax, то в 99,9% случаев все будет хорошо, но в 0,1% вы можете получить что-то, кроме имени хоста вашего собственного сервера.

Хорошим примером этого является то, что я обнаружил не так давно. Мой сервер имеет тенденцию время от времени нажимать http://proxyjudge1.proxyfire.net/fastenv. Application_BeginRequest () с радостью обрабатывает этот запрос, поэтому, если вы вызовете Request.Url.Host, когда он делает этот запрос, вы получите proxyjudge1.proxyfire.net. Некоторые из вас, возможно, думают «нет дух», но стоит отметить, потому что это было очень трудно заметить, поскольку это происходило только в 0,1% случаев: P

Эта ошибка вынудила меня вставить хост домена в виде строки в файлах конфигурации.

13 голосов
/ 18 июля 2011

Почему бы не использовать

Request.Url.Authority

Возвращает весь домен И порт.

Вам все еще нужно вычислить http или https

2 голосов
/ 20 августа 2017

Простой и короткий способ (поддерживает схему, домен и порт):

Использование Request.GetFullDomain()

// Add this class to your project
public static class HttpRequestExtensions{
    public static string GetFullDomain(this HttpRequestBase request)
    {
        var uri= request?.UrlReferrer;
        if (uri== null)
            return string.Empty;
        return uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
    }
}

// Now Use it like this:
Request.GetFullDomain();
// Example output:    https://www.example.com:5031
// Example output:    http://www.example.com:5031
// Example output:    https://www.example.com
1 голос
/ 24 февраля 2010

Другой способ:


string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);
1 голос
/ 15 сентября 2008

Как насчет:

NameValueCollection vars = HttpContext.Current.Request.ServerVariables;
string protocol = vars["SERVER_PORT_SECURE"] == "1" ? "https://" : "http://";
string domain = vars["SERVER_NAME"];
string port = vars["SERVER_PORT"];
0 голосов
/ 01 апреля 2015

Использование UriBuilder:

    var relativePath = ""; // or whatever-path-you-want
    var uriBuilder = new UriBuilder
    {
        Host = Request.Url.Host,
        Path = relativePath,
        Scheme = Request.Url.Scheme
    };

    if (!Request.Url.IsDefaultPort)
        uriBuilder.Port = Request.Url.Port;

    var fullPathToUse = uriBuilder.ToString();
0 голосов
/ 15 сентября 2008

Как насчет:

String domain = "http://" + Request.Url.Host
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...