Comment puis-je obtenir le baseurl du site?

183

Je veux écrire une petite méthode d'aide qui renvoie l'URL de base du site. Voici ce que j'ai proposé:

public static string GetSiteUrl()
{
    string url = string.Empty;
    HttpRequest request = HttpContext.Current.Request;

    if (request.IsSecureConnection)
        url = "https://";
    else
        url = "http://";

    url += request["HTTP_HOST"] + "/";

    return url;
}

Y a-t-il une erreur à laquelle vous pouvez penser? Quelqu'un peut-il améliorer cela?

Jaggu
la source

Réponses:

324

Essaye ça:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + 
    Request.ApplicationPath.TrimEnd('/') + "/";
Frank Allenby
la source
13
C'est la seule réponse que j'ai trouvée qui traite du cas où un site est une application qui est un enfant d'un site Web de haut niveau dans IIS.
John
6
string.Format ("{0} {1} /", Request.Url.GetLeftPart (UriPartial.Authority), Request.ApplicationPath.TrimEnd ('/'))
diegohb
2
Request.Url.Scheme ne fonctionne pas toujours lorsque vous avez configuré http interne et la terminaison SSL configurée pour https en interne sur un serveur, mais exécutant https * à l'extérieur. Pour contourner cela, j'ai simplement créé une clé AppSetting spécifique à l'environnement "UrlScheme" avec la valeur "http" ou "https" en fonction de l'emplacement du site Web. Ce paramètre dans le web.config est accessible par ConfigurationManager.AppSettings ["Key"]
Ben Sewards
3
Cela ne prend pas en compte l'équilibrage de charge, où le décryptage se produit, ou les proxys de transfert. Vous pouvez vous retrouver avec une adresse incorrecte en utilisant cela, alors soyez prudent et sachez où votre site Web a été déployé.
Conor Gallagher
$ "{System.Web.HttpContext.‌ Current.Request.Url.GetLeftPart (UriPartial.Authority)} {System.Web.HttpContext.Cur‌ rent.Request.ApplicationPath? .TrimEnd ('/')} /";
Ryan Penfold
166
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)

C'est tout ;)

démoniste
la source
25
Cela ne fonctionne pas pour le chemin virtuel ou d'application. Vous devez utiliser Request.ApplicationPath en plus de la partie gauche.
Warlock
L'URL de base est httpx: //domaine.com: [port] / vous devez ajouter vous-même le chemin de l'application à cette solution
Pawel Cioch
9

La GetLeftPartsolution populaire n'est Urimalheureusement pas prise en charge dans la version PCL de . GetComponentsest, cependant, si vous avez besoin de portabilité, cela devrait faire l'affaire:

uri.GetComponents(
    UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);
Todd Menier
la source
6

Je pense que les réponses ci-dessus ne tiennent pas compte du moment où le site n'est pas à la racine du site Web.

Ceci est un pour le contrôleur WebApi:

string baseUrl = (Url.Request.RequestUri.GetComponents(
                    UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/') 
                 + HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;
rufo
la source
À partir d'un contrôleur, utilisez Configuration.VirtualPathRoot car il est indépendant de l'hôte.
Darrel Miller
5

Pour moi, @ warlock's semble être la meilleure réponse ici jusqu'à présent, mais j'ai toujours utilisé cela dans le passé;

string baseUrl = Request.Url.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.UriEscaped)   

Ou dans un contrôleur WebAPI;

string baseUrl = Url.Request.RequestUri.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.Unescaped)

ce qui est pratique pour que vous puissiez choisir le format d'échappement souhaité. Je ne sais pas pourquoi il existe deux implémentations aussi différentes, et pour autant que je sache, cette méthode et @ warlock retournent exactement le même résultat dans ce cas, mais il semble que GetLeftPart()cela fonctionnerait également pour les mailtobalises comme les Uri non serveur, par exemple .

cirrus
la source
renvoie une URL invalide pour les cas où vous êtes derrière le tunnel ngrok et https
Mohammad Zekrallah
5

C'est une méthode beaucoup plus infaillible.

VirtualPathUtility.ToAbsolute("~/");
Daniel A. White
la source
L'appel @Daniel ne reviendra pas simplement /si vous hébergez dans un domaine d'application, par exemple yourserver / yourapplicationname / yourrootpath
vibs2006
@ vibs2006 yea son genre de question ambiguë
Daniel A. White
4

Je vais avec

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
Talha
la source
1
Cela ajoutera le protocole: (HttpContext.Request.ServerVariables ["HTTPS"] == "off"? "Http: //": "https: //") + HttpContext.Request.ServerVariables ["HTTP_HOST"]
onemorecupofcoffee
4

Sur la base de ce que Warlock a écrit, j'ai trouvé que la racine du chemin virtuel est nécessaire si vous n'êtes pas hébergé à la racine de votre site Web. (Cela fonctionne pour les contrôleurs d'API Web MVC)

String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) 
+ Configuration.VirtualPathRoot;
SpazDude
la source
1

J'utilise le code suivant d'Application_Start

String baseUrl = Path.GetDirectoryName(HttpContext.Current.Request.Url.OriginalString);

Crispijn Lange
la source
1

Cela fonctionne pour moi.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString : renvoie le chemin complet identique à celui affiché par le navigateur.
  • Request.Url.PathAndQuery : renvoie le (chemin complet) - (nom de domaine + PORT).
  • Request.ApplicationPath : renvoie "/" sur le serveur hébergé et "nom de l'application" sur le déploiement IIS local.

Donc, si vous souhaitez accéder à votre nom de domaine, pensez à inclure le nom de l'application en cas de:

  1. Déploiement IIS
  2. Si votre application s'est déployée sur le sous-domaine.

=====================================

Pour le dev.x.us/web

il renvoie ce texte fort

FAHID
la source
0

Veuillez utiliser le code ci-dessous                           

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);
Pranav Joseph
la source
Veuillez expliquer votre code afin que les autres utilisateurs puissent comprendre ses fonctionnalités. Merci!
Ignacio Ara
-1
 string baseURL = HttpContext.Request.Url.Host;
shebin c babu
la source
-2

vous pourriez éventuellement ajouter dans le port pour non port 80 / SSL?

quelque chose comme:

if (HttpContext.Current.Request.ServerVariables["SERVER_PORT"] != null && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "80" && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "443")
            {
                port = String.Concat(":", HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString());
            }

et l'utiliser dans le résultat final?

Mark Redman
la source
6
Request.Url.Authorityinclura le numéro de port s'il n'est pas standard
Andomar le