web-dev-qa-db-fra.com

Quelle est la meilleure méthode dans ASP.NET pour obtenir le domaine actuel?

Je me demande quel est le meilleur moyen d'obtenir le domaine actuel en ASP.NET?

Par exemple:

http://www.domainname.com/subdir/ devrait donner http://www.domainname.comhttp: //www.sub.domainname .com/subdir / devrait donner http://sub.domainname.com

En guise de guide, je devrais pouvoir ajouter une URL telle que "/Folder/Content/filename.html" (telle que générée par Url.RouteUrl () dans ASP.NET MVC) directement sur l'URL et cela devrait fonctionner.

98
Matt Mitchell

Même réponse que MattMitchell mais avec quelques modifications. Cela vérifie le port par défaut à la place.

Edit: Mise à jour de la syntaxe et utilisation de Request.Url.Authority comme suggéré

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

Selon ce lien , un bon point de départ est:

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

Toutefois, si le domaine est http://www.domainname.com:5 cela échouera.

Quelque chose comme ce qui suit est tentant de résoudre ce problème:

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

Cependant, les ports 80 et 443 dépendent de la configuration.

En tant que tel, vous devez utiliser IsDefaultPort comme dans le Réponse acceptée ci-dessus de Carlos Muñoz.

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

C'est schéma inclus.

28
izlence

AVERTISSEMENT! À quiconque utilise Current.Request . Url.Host. Comprenez que vous travaillez sur la base de la requête en cours et que la requête en cours ne sera PAS TOUJOURS avec votre serveur et peut parfois l'être avec d'autres serveurs.

Donc, si vous utilisez ceci dans quelque chose comme Application_BeginRequest () dans Global.asax, 99,9% du temps sera correct, mais 0,1% vous obtiendrez autre chose que le nom d'hôte de votre propre serveur.

Un bon exemple de ceci est quelque chose que j'ai découvert il n'y a pas longtemps. Mon serveur a tendance à frapper http://proxyjudge1.proxyfire.net/fastenv de temps en temps. Application_BeginRequest () gère volontiers cette demande. Par conséquent, si vous appelez Request.Url.Host, vous récupérerez proxyjudge1.proxyfire.net. Certains d’entre vous pensent peut-être "non duh" mais il convient de le noter car c’était un bug très difficile à remarquer car il ne s’est produit que dans 0,1% des cas: P

Ce bogue m'a obligé à insérer mon hôte de domaine sous forme de chaîne dans les fichiers de configuration.

19
Thirlan

Pourquoi ne pas utiliser

Request.Url.Authority

Il retourne le domaine entier ET le port.

Vous devez toujours comprendre http ou https

13
Korayem

Simple et court moyen (il supporte schéma, domaine et port):

tilisez 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

Que diriez-vous:

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

Autrement:


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

Utiliser 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