So erhalten Sie die aktuelle Seiten-URL in MVC 3

360

Ich verwende das Facebook-Kommentar-Plugin in einem Blog, das ich gerade erst baue. Es hat einige FBXML-Tags, die von dem Facebook-Javascript interpretiert werden, auf das auf der Seite verwiesen wird.

Das alles funktioniert gut, aber ich muss die aktuelle, vollqualifizierte URL an das Plugin übergeben.

<div style="width: 900px; margin: auto;">
    <div id="fb-root"></div>
    <fb:comments href="URL HERE" num_posts="10" width="900"></fb:comments>
</div>

Was ist der beste Weg, um die URL der aktuellen Seite zu erhalten? Die Anforderungs-URL.

Lösung

Hier ist der endgültige Code meiner Lösung:

<fb:comments href="@Request.Url.AbsoluteUri" num_posts="15" width="900"></fb:comments>
Chev
quelle

Antworten:

533

Sie könnten die Verwendung Request.RawUrl, Request.Url.OriginalString, Request.Url.ToString()oder Request.Url.AbsoluteUri.

Darin Dimitrov
quelle
2
Aus irgendeinem Grund scheint dies nicht die gesamte URL zu erhalten, sondern nur alles nach der Domain.
Chev
6
@Chevex, wie wäre es mit Request.Url.ToString()oder Request.Url.AbsoluteUri?
Darin Dimitrov
9
Fast. Request.Url.AbsoluteUritat es :)
Chev
2
@Chevex - Auf welchem ​​Port wird die Site gehostet? Wenn es dann Port 80 ist, sehen Sie keinen. Ich sage, dass in einer Umgebung, in der es einen virtuellen IP-Publishing-Port 80 für einen oder mehrere Computer an einem anderen Port gibt (z. B. 81), Asp.Net immer: 81 falsch zur URL hinzufügt
Andras Zoltan
29
Um Beispiele der verschiedenen URL-Fragmente zu erhalten, schauen Sie unter: cambiaresearch.com/articles/53/…
ms007
48

Fügen Sie diese Erweiterungsmethode Ihrem Code hinzu:

public static Uri UrlOriginal(this HttpRequestBase request)
{
  string hostHeader = request.Headers["host"];

  return new Uri(string.Format("{0}://{1}{2}",
     request.Url.Scheme, 
     hostHeader, 
     request.RawUrl));
}

Und dann können Sie es von der RequestContext.HttpContext.RequestEigenschaft ausführen .

In Asp.Net gibt es einen Fehler (kann umgangen werden, siehe unten), der auf Computern auftritt, die andere Ports als Port 80 für die lokale Website verwenden (ein großes Problem, wenn interne Websites über Load Balancing auf virtueller IP veröffentlicht werden und Ports werden intern für Veröffentlichungsregeln verwendet), wobei Asp.Net den Port immer zur AbsoluteUriEigenschaft hinzufügt - auch wenn die ursprüngliche Anforderung ihn nicht verwendet.

Dieser Code stellt sicher, dass die zurückgegebene URL immer der URL entspricht, die der Browser ursprünglich angefordert hat (einschließlich des Ports - wie er im Host-Header enthalten wäre), bevor ein Lastenausgleich usw. stattfindet.

Zumindest in unserer (ziemlich verworrenen!) Umgebung :)

Wenn sich dazwischen funky Proxys befinden, die den Host-Header neu schreiben, funktioniert dies auch nicht.

Update 30. Juli 2013

Wie von @KevinJones in den Kommentaren unten erwähnt, wurde die Einstellung, die ich im nächsten Abschnitt erwähne, hier dokumentiert: http://msdn.microsoft.com/en-us/library/hh975440.aspx

Ich muss zwar sagen, dass ich es nicht zum Laufen bringen konnte, als ich es ausprobiert habe - aber das könnte nur sein, dass ich einen Tippfehler mache oder so.

Update 9. Juli 2012

Ich bin vor einiger Zeit darauf gestoßen und wollte diese Antwort aktualisieren, habe es aber nie getan. Als gerade eine Gegenstimme zu dieser Antwort einging, dachte ich, ich sollte es jetzt tun.

Der 'Fehler', den ich in Asp.Net erwähne, kann mit einem scheinbar undokumentierten appSettings-Wert gesteuert werden - genannt 'aspnet:UseHostHeaderForRequest'- dh:

<appSettings>
  <add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>

Ich bin beim Betrachten HttpRequest.Urlin ILSpy darauf gestoßen - angezeigt durch --->das links von der folgenden Kopie / Einfügen aus dieser ILSpy-Ansicht:

public Uri Url
{
  get
  {
    if (this._url == null && this._wr != null)
    {
      string text = this.QueryStringText;
      if (!string.IsNullOrEmpty(text))
      {
        text = "?" + HttpEncoder.CollapsePercentUFromStringInternal(text, 
          this.QueryStringEncoding);
      }
 ---> if (AppSettings.UseHostHeaderForRequestUrl)
      {
        string knownRequestHeader = this._wr.GetKnownRequestHeader(28);
        try
        {
          if (!string.IsNullOrEmpty(knownRequestHeader))
          {
            this._url = new Uri(string.Concat(new string[]
            {
              this._wr.GetProtocol(),
              "://",
              knownRequestHeader,
              this.Path,
              text 
            }));
          }
        }
        catch (UriFormatException)
        { }
     }
     if (this._url == null) { /* build from server name and port */
       ...

Ich persönlich habe es nicht benutzt - es ist nicht dokumentiert und daher nicht garantiert, dass es dabei bleibt - aber es könnte dasselbe tun, was ich oben erwähnt habe. Um die Relevanz in den Suchergebnissen zu erhöhen und jemanden anzuerkennen, der dies entdeckt zu haben scheint, wurde die 'aspnet:UseHostHeaderForRequest'Einstellung auch von Nick Aceves auf Twitter erwähnt

Andras Zoltan
quelle
ok also wo oder wie bekommt man eine man-Instanz von HttpRequestBase? Sagen wir mal, wenn man zum Beispiel nicht direkt in einem Controller mit Code gearbeitet hat?
PositiveGuy
@CoffeeAddict Nun, in mvc3 haben Sie HttpContext.Current.Request, da Asp.net 4 die Basisabstraktionen verwendet. Wenn auf .net 3.5 oder niedriger, können Sie HttpRequestWrapper um die gleiche Eigenschaft von System.Web.Abstractions
Andras Zoltan
3
Sehr spät dazu, aber der UseHostHeaderForRequestUrl ist hier dokumentiert msdn.microsoft.com/en-us/library/hh975440.aspx
Kevin Jones
gute Stelle! Zumindest haben sie es endlich für 4.5 Dokumentation hinzugefügt!
Andras Zoltan
14
public static string GetCurrentWebsiteRoot()
{
    return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
}
Brian Ogden
quelle
12
Request.Url.PathAndQuery

sollte perfekt funktionieren, besonders wenn Sie nur den relativen Uri wollen (aber Querystringe behalten)

Lucius
quelle
8

Auch ich habe dies aus Facebook-Gründen gesucht und keine der bisher gegebenen Antworten hat nach Bedarf funktioniert oder ist zu kompliziert.

@Request.Url.GetLeftPart(UriPartial.Path)

Ruft das vollständige Protokoll, den Host und den Pfad "ohne" den Querystring ab. Enthält auch den Port, wenn Sie etwas anderes als den Standard-80 verwenden.

johnw182
quelle
Toller Fund! Ich vermute, dass dies zum Zeitpunkt der Anfrage nicht existierte? Ich fühle mich wie ich das gesehen hätte :)
Chev
Ich dachte, ich hätte gesehen, wo dies gerade hinzugefügt wurde, aber ich habe es gerade überprüft und es scheint, dass es seit .NET 1.1 vorhanden ist. Wer weiß.
Johnw182
4

Mein Favorit ...

Url.Content(Request.Url.PathAndQuery)

oder nur...

Url.Action()
Carter Medlin
quelle
Url.Action () bietet nur die rechte Seite der URL. Was ist, wenn Sie eine vollständige URL benötigen?
Alok
1

Eine Sache, die in anderen Antworten nicht erwähnt wird, ist die Groß- und Kleinschreibung, wenn an mehreren Stellen darauf verwiesen wird (was nicht in der ursprünglichen Frage enthalten ist, aber berücksichtigt werden sollte, da diese Frage in vielen ähnlichen Suchanfragen vorkommt ). Aufgrund anderer Antworten stellte ich fest, dass anfangs Folgendes für mich funktioniert hat:

Request.Url.AbsoluteUri.ToString()

Aber um zuverlässiger zu sein, wurde dies dann:

Request.Url.AbsoluteUri.ToString().ToLower()

Und dann für meine Anforderungen (Überprüfen, von welchem ​​Domainnamen auf die Site zugegriffen wird, und Anzeigen des relevanten Inhalts):

Request.Url.AbsoluteUri.ToString().ToLower().Contains("xxxx")

Lyall
quelle
Das macht es nicht "zuverlässiger". Ob es sinnvoll ist, Kleinbuchstaben zu verwenden, hängt ganz davon ab, was Sie tatsächlich versuchen und warum Groß- und Kleinschreibung dort sinnvoll ist. Normalerweise Sie tun wollen , dass die URL sein case-sensitive.
CodeCaster
1
@CodeCaster Ja, der Begriff "zuverlässiger" basiert auf meiner eigenen Erfahrung, da ich definitiv NICHT möchte, dass die URLs zwischen Groß- und Kleinschreibung unterscheiden, da dies den Kunden unendlich viele Probleme bereitet.
Lyall
0

Für mich war das Problem, als ich versuchte, auf HTTPContextden Konstruktor des Controllers zuzugreifen, während er HTTPContextnoch nicht bereit ist. Beim Verschieben in die Index-Methode hat es funktioniert:

var uri = new Uri(Request.Url.AbsoluteUri);
url = uri.Scheme + "://" + uri.Host + "/";enter code here
boateng
quelle
0

Der Fall (Einzelseitenstil) für den Browserverlauf

HttpContext.Request.UrlReferrer
Hamit YILDIRIM
quelle