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

Мне интересно, какой лучший способ получить текущий домен в 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-адрес, и он должен работать.

Ответ 1

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

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host +
(Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port)

Ответ 2

По эта ссылка хорошая отправная точка:

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, как в Принятый ответ выше от Карлоса Муньоса.

Ответ 3

Request.Url.GetLeftPart(UriPartial.Authority)

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

Ответ 4

ПРЕДУПРЕЖДЕНИЕ! Каждому, кто использует 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

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

Ответ 5

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

Request.Url.Authority

Он возвращает весь домен и порт.

Вам все равно нужно указать http или https

Ответ 6

Как насчет:

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"];

Ответ 7

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


string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);

Ответ 8

Использование 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();

Ответ 9

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

var MyUri= Request.UrlReferrer;

// Use this like:
Var fullDomain = myUri.Scheme + Uri.SchemeDelimiter + myUri.Authority;

// Example output:    https://www.example.com:5031
// Example output:    http://www.example.com:5031
// Example output:    https://www.example.com

Ответ 10

Как насчет:

String domain = "http://" + Request.Url.Host