Question

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.com http://www.sub.domainname.com/subdir/ devrait donner http://sub.domainname.com

À titre indicatif, je devrais pouvoir ajouter une URL du type "/ Dossier / Contenu / nomfichier.html" (comme généré par Url.RouteUrl () dans ASP.NET MVC) directement sur l’URL et cela devrait fonctionner.

Était-ce utile?

La solution

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

  

Édition: syntaxe mise à jour et utilisation de Request.Url.Authority comme suggéré

<*>quot;{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"

Autres conseils

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

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

Toutefois, si le domaine est http://www.domainname.com:500 , ce qui suit échouer.

Quelque chose comme ceci 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 la réponse acceptée ci-dessus de Carlos Muñoz. .

Request.Url.GetLeftPart(UriPartial.Authority)

Ceci est un schéma inclus.

AVERTISSEMENT! aux personnes qui utilisent 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 suffisant, 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 à autre. 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 "no duh". mais il convient de noter parce que c'était un bug très difficile à remarquer car il ne s'est passé que 0,1% du temps: P

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

Pourquoi ne pas utiliser

Request.Url.Authority

Il renvoie le domaine entier ET le port.

Vous devez toujours comprendre http ou https

Simple et court (prend en charge le schéma, le domaine et le port):

Utilisez 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

Autre moyen:


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

Que diriez-vous de:

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

Utilisation d’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();

Que diriez-vous de:

String domain = "http://" + Request.Url.Host
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top