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

StackOverflow https://stackoverflow.com/questions/61817

Вопрос

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

Это было полезно?

Решение

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

Редактировать:Обновленный синтаксис и использование Request.Url.Authority как было предложено

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"

Другие советы

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

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

Request.Url.GetLeftPart(UriPartial.Authority)

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

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

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

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

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

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

Request.Url.Authority

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

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

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

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

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


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

Как насчет:

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

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

Как насчет:

String domain = "http://" + Request.Url.Host
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top