Wie kann ich die Basis der Website erhalten?


183

Ich möchte eine kleine Hilfsmethode schreiben, die die Basis-URL der Site zurückgibt. Folgendes habe ich mir ausgedacht:

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

Gibt es einen Fehler, an den Sie denken können? Kann jemand dies verbessern?



Antworten:


324

Versuche dies:

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

13
Dies ist die einzige Antwort, die ich gefunden habe und die sich mit dem Fall befasst, dass eine Site eine Anwendung ist, die ein Kind einer Top-Level-Website in IIS ist.
John

6
string.Format ("{0} {1} /", Request.Url.GetLeftPart (UriPartial.Authority), Request.ApplicationPath.TrimEnd ('/'))
diegohb

2
Request.Url.Scheme funktioniert nicht immer, wenn Sie internes http konfiguriert und die SSL-Beendigung für https intern auf einem Server eingerichtet haben, aber https * außerhalb ausführen. Um dies zu umgehen, habe ich einfach einen umgebungsspezifischen AppSetting-Schlüssel "UrlScheme" mit dem Wert "http" oder "https" erstellt, je nachdem, wo sich die Website befindet. Auf diese Einstellung in der web.config kann von ConfigurationManager.AppSettings ["Key"] zugegriffen werden
Ben Sewards

3
Dies berücksichtigt nicht den Lastenausgleich, bei dem die Entschlüsselung erfolgt, oder die Weiterleitung von Proxys. Sie können damit eine falsche Adresse erhalten. Seien Sie also vorsichtig und wissen Sie, wo Ihre Website bereitgestellt wurde.
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)

Das ist es ;)


25
Dies funktioniert nicht für den virtuellen Pfad oder den Anwendungspfad. Sie sollten zusätzlich zum linken Teil Request.ApplicationPath verwenden.
Hexenmeister

Basis-URL ist httpx: //domain.com: [Port] / Sie müssen App-Pfad selbst zu dieser Lösung hinzufügen
Pawel Cioch

9

Die beliebte GetLeftPartLösung wird in der PCL-Version von Urileider nicht unterstützt . GetComponentsWenn Sie jedoch Portabilität benötigen, sollte dies den Trick tun:

uri.GetComponents(
    UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);

6

Ich glaube, dass die obigen Antworten nicht berücksichtigen, wenn sich die Website nicht im Stammverzeichnis der Website befindet.

Dies ist ein für WebApi-Controller:

string baseUrl = (Url.Request.RequestUri.GetComponents(
                    UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/') 
                 + HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;

Verwenden Sie innerhalb eines Controllers Configuration.VirtualPathRoot, da es hostunabhängig ist.
Darrel Miller

5

Für mich sieht @ warlock's hier wie die beste Antwort aus, aber ich habe dies in der Vergangenheit immer verwendet.

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

Oder in einem WebAPI-Controller;

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

Dies ist praktisch, damit Sie auswählen können, welches Escape-Format Sie möchten. Ich bin mir nicht sicher, warum es zwei so unterschiedliche Implementierungen gibt, und soweit ich das beurteilen kann, geben diese Methode und @ warlocks in diesem Fall genau das gleiche Ergebnis zurück, aber es sieht so aus, als GetLeftPart()würde dies beispielsweise auch für Nicht-Server-Uri-ähnliche mailtoTags funktionieren .


Gibt eine ungültige URL für Fälle zurück, in denen Sie sich hinter ngrok tunnel und https
Mohammad Zekrallah befinden.

5

Dies ist eine viel narrensicherere Methode.

VirtualPathUtility.ToAbsolute("~/");

@ Daniel Aufruf wird nicht einfach zurückgegeben, /wenn Sie in einer Anwendungsdomäne hosten,
vibs2006

@ Vibs2006 Ja, es ist eine mehrdeutige Frage
Daniel A. White

4

Ich gehe mit

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

1
Dadurch wird das Protokoll hinzugefügt: (HttpContext.Request.ServerVariables ["HTTPS"] == "off"? "HttpContext.Request.ServerVariables [" HTTP_HOST "]
onemorecupofcoffee

4

Basierend auf dem, was Warlock geschrieben hat, habe ich festgestellt, dass das virtuelle Pfadstammverzeichnis benötigt wird, wenn Sie nicht im Stammverzeichnis Ihres Webs gehostet werden. (Dies funktioniert für MVC Web API-Controller.)

String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) 
+ Configuration.VirtualPathRoot;

1

Ich verwende folgenden Code von Application_Start

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


1

Das funktioniert bei mir.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString : Gibt den vollständigen Pfad zurück, der dem Browser entspricht.
  • Request.Url.PathAndQuery : Geben Sie den (vollständigen Pfad) - (Domänennamen + PORT) zurück.
  • Request.ApplicationPath : Gibt "/" auf dem gehosteten Server und "Anwendungsname" auf der lokalen IIS-Bereitstellung zurück.

Wenn Sie also auf Ihren Domainnamen zugreifen möchten, sollten Sie den Anwendungsnamen angeben, wenn:

  1. IIS-Bereitstellung
  2. Wenn Ihre Anwendung in der Unterdomäne bereitgestellt wurde.

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

Für die dev.x.us/web

es gibt diesen starken Text zurück


0

Bitte verwenden Sie den folgenden Code                           

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

Bitte erläutern Sie Ihren Code, damit andere Benutzer seine Funktionalität verstehen können. Vielen Dank!
Ignacio Ara


-2

Sie könnten möglicherweise den Port für Nicht-Port 80 / SSL hinzufügen?

etwas wie:

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

und das im Endergebnis verwenden?


6
Request.Url.Authoritywird die Portnummer enthalten, wenn es nicht Standard ist
Andomar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.