403 Stimmen

Wie man aktuelle Seite URL in MVC 3 erhalten

Ich verwende das Facebook-Kommentar-Plugin in einem Blog, den ich gerade aufbaue. Es hat einige FBXML-Tags, die vom Facebook-Javascript interpretiert werden, das auf der Seite referenziert wird.

Das alles funktioniert gut, aber ich muss die aktuelle, voll qualifizierte 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>

Wie bekomme ich am besten die URL der aktuellen Seite? Die Anfrage-URL.

Lösung

Hier ist der endgültige Code für meine Lösung:

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

581voto

Darin Dimitrov Punkte 990883

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

49voto

Andras Zoltan Punkte 41403

Fügen Sie diese Erweiterungsmethode in Ihren Code ein:

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.Request Eigentum.

Es gibt einen Fehler (der umgangen werden kann, siehe unten) in Asp.Net, der auf Rechnern auftritt, die andere Ports als Port 80 für die lokale Website verwenden (ein großes Problem, wenn interne Websites über Load-Balancing auf virtuellen IPs veröffentlicht werden und Ports intern für Veröffentlichungsregeln verwendet werden), wodurch Asp.Net immer fügen Sie den Anschluss auf der AbsoluteUri Eigenschaft - auch wenn die ursprüngliche Anfrage sie nicht verwendet.

Dieser Code stellt sicher, dass die zurückgegebene Url immer mit der Url des Browsers übereinstimmt. ursprünglich angefordert werden (einschließlich des Ports - da dieser im Host-Header enthalten ist), bevor ein Lastausgleich usw. stattfindet.

Zumindest in unserem (ziemlich verworrenen!) Umfeld :)

Wenn dazwischen irgendwelche Proxys sind, die den Host-Header umschreiben, funktioniert das auch nicht.

Update 30. Juli 2013

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

Obwohl ich sagen muss, dass ich es nicht hinbekommen habe, als ich es ausprobiert habe - aber das könnte auch nur an einem Tippfehler oder so liegen.

Aktualisierung 9. Juli 2012

Ich bin vor einiger Zeit auf diese Frage gestoßen und wollte diese Antwort aktualisieren, habe es aber nicht getan. Als gerade ein Upvote auf diese Antwort hereinkam, dachte ich, ich sollte es jetzt tun.

Der 'Bug', den ich in Asp.Net erwähne, kann mit einem offenbar undokumentierten appSettings-Wert kontrolliert werden - genannt 'aspnet:UseHostHeaderForRequest' - d.h:

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

Ich bin auf diese Seite gestoßen, als ich mir HttpRequest.Url in ILSpy - angezeigt durch das Symbol ---> auf der linken Seite des folgenden Kopier-/Einfügevorgangs 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 verwendet - es ist undokumentiert und daher nicht garantiert, dass es bestehen bleibt - aber es könnte dasselbe bewirken, was ich oben erwähnt habe. Um die Relevanz in den Suchergebnissen zu erhöhen - und um jemandem zu danken, der dies entdeckt zu haben scheint - die 'aspnet:UseHostHeaderForRequest' Einstellung wurde auch von Nick Aceves auf Twitter erwähnt

17voto

Brian Ogden Punkte 17156
public static string GetCurrentWebsiteRoot()
{
    return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
}

14voto

Lucius Punkte 430
Request.Url.PathAndQuery

sollte perfekt funktionieren, vor allem, wenn Sie nur die relative Uri wollen (aber Querystrings behalten)

9voto

johnw182 Punkte 1198

Auch ich habe aus Facebook-Gründen danach gesucht, und keine der bisher gegebenen Antworten hat wie gewünscht funktioniert oder ist zu kompliziert.

@Request.Url.GetLeftPart(UriPartial.Path)

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X