it-swarm.com.de

So rufen Sie die aktuelle Seiten-URL in MVC 3 ab

Ich benutze das Facebook-Kommentar-Plugin für einen Blog, den ich gerade erst baue. Es enthält einige FBXML-Tags, die vom 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>
347
Chev

Sie können den Request.RawUrl , Request.Url.OriginalString , Request.Url.ToString() oder _Request.Url.AbsoluteUri_ verwenden.

516
Darin Dimitrov

Fügen Sie Ihrem Code diese Erweiterungsmethode 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 über die Eigenschaft RequestContext.HttpContext.Request 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 den Lastenausgleich auf virtueller IP veröffentlicht werden) und Ports werden intern für Veröffentlichungsregeln verwendet. Dabei fügt Asp.Net immer den Port in die Eigenschaft AbsoluteUri ein - auch wenn die ursprüngliche Anforderung ihn nicht verwendet.

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

Zumindest in unserer (eher 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 - die Einstellung, die ich im nächsten Abschnitt erwähne, wurde 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 in Asp.Net erwähnte 'Bug' kann mit einem scheinbar undokumentierten appSettings-Wert namens 'aspnet:UseHostHeaderForRequest' behoben werden, d.h.

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

Ich bin darauf gestoßen, als ich HttpRequest.Url in ILSpy angesehen habe - angegeben durch ---> links neben dem folgenden Kopieren/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 undokumentiert und daher nicht garantiert, dass es dabei bleibt - aber es könnte dasselbe tun, was ich oben erwähnte. Um die Relevanz in den Suchergebnissen zu erhöhen - und um jemanden anzuerkennen, der dies entdeckt zu haben scheint die Einstellung 'aspnet:UseHostHeaderForRequest' wurde auch von Nick Aceves auf Twitter erwähnt

47
Andras Zoltan
public static string GetCurrentWebsiteRoot()
{
    return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
}
13
Brian Ogden
Request.Url.PathAndQuery

sollte perfekt funktionieren, besonders wenn Sie nur die relative Uri wollen (aber Querystringe behalten)

11
Lucius

Auch ich habe dies aus Facebook-Gründen gesucht und keine der bisher gegebenen Antworten hat bei 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. Beinhaltet auch den Port, wenn Sie etwas anderes als den Standardwert 80 verwenden.

8
johnw182

Mein Favorit ...

Url.Content(Request.Url.PathAndQuery)

oder nur...

Url.Action()
4
Carter Medlin

Eine Sache, die in anderen Antworten nicht erwähnt wird, ist die Unterscheidung zwischen Groß- und Kleinschreibung, wenn auf sie an mehreren Stellen verwiesen wird (was in der ursprünglichen Frage nicht der Fall ist, aber zu berücksichtigen ist, da diese Frage in vielen ähnlichen Suchen vorkommt ). Auf der Grundlage anderer Antworten fand ich zunächst, dass Folgendes für mich funktioniert:

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 aus auf die Site zugegriffen wird und Anzeigen des relevanten Inhalts):

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

1
Lyall

Die Groß-/Kleinschreibung (einzelner Seitenstil) für den Browserverlauf

HttpContext.Request.UrlReferrer
0
Hamit YILDIRIM

Für mich war das Problem, als ich versuchte, im Konstruktor des Controllers auf HTTPContext zuzugreifen, während HTTPContext noch nicht bereit ist. Beim Verschieben innerhalb der Index-Methode hat es funktioniert:

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