Quelle est la meilleure méthode dans ASP.NET pour obtenir le domaine actuel?
-
09-06-2019 - |
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.
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