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?



Réponses:


324

Essaye ça:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + 
    Request.ApplicationPath.TrimEnd('/') + "/";

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 ;)


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);

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('/') ;

À 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 .


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


4

Je vais avec

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]

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;

1

J'utilise le code suivant d'Application_Start

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


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


0

Veuillez utiliser le code ci-dessous                           

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);

Veuillez expliquer votre code afin que les autres utilisateurs puissent comprendre ses fonctionnalités. Merci!
Ignacio Ara


-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?


6
Request.Url.Authorityinclura le numéro de port s'il n'est pas standard
Andomar le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.