it-swarm-ru.tech

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

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

Например:

http://www.domainname.com/subdir/ должен дать http://www.domainname.comhttp: //www.sub.domainname .com/subdir / должен привести к http://sub.domainname.com

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

98
Matt Mitchell

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

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

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"
180
Carlos Muñoz

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

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

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

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

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

37
Matt Mitchell
Request.Url.GetLeftPart(UriPartial.Authority)

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

28
izlence

ВНИМАНИЕ! Всем, кто использует 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

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

19
Thirlan

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

Request.Url.Authority

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

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

13
Korayem

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

Используйте 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
2
RAM

Как насчет:

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"];
1
Derek Lawless

По-другому:


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

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