Какой самый лучший метод в 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 () in ASP.NET MVC) прямо на URL-адрес, и он должен работать.

10 98

10 ответов:

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

изменить: обновленный синтаксис и использование 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() в глобальном.asax, то 99,9% времени это будет нормально, но 0,1% вы можете получить что-то другое, чем имя хоста вашего собственного сервера.

хороший примером этого является то, что я обнаружил не так давно. Мой сервер, как правило, хит http://proxyjudge1.proxyfire.net/fastenv Время от времени. Application_BeginRequest () с удовольствием обрабатывает этот запрос, так что если вы вызываете запрос.Url-адрес.Хозяин, когда он делает этот запрос, вы вернетесь proxyjudge1.proxyfire.net. некоторые из вас могут думать "нет duh", но стоит отметить, потому что это было очень трудно заметить, так как это произошло только в 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