MVC 3'te mevcut sayfa URL'si nasıl alınır?


360

Oluşturduğum bir blogda Facebook yorum eklentisini kullanıyorum. Sayfada başvurulan facebook javascript tarafından yorumlanan bazı FBXML etiketleri vardır.

Bu iyi çalışıyor, ancak mevcut, tam nitelikli URL'yi eklentiye iletmem gerekiyor.

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

Mevcut sayfanın URL'sini almanın en iyi yolu nedir? İstek URL'si.

Çözüm

İşte benim çözümün son kodu:

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

Yanıtlar:


534

Sen kullanabilirsiniz Request.RawUrl, Request.Url.OriginalString, Request.Url.ToString()veya Request.Url.AbsoluteUri.


2
Bazı nedenlerden dolayı, bu URL'nin tamamını değil, alan adından sonraki her şeyi alıyor gibi görünüyor.
Chev

6
@Chevex, nasıl ya Request.Url.ToString()da Request.Url.AbsoluteUri?
Darin Dimitrov

9
Neredeyse. Request.Url.AbsoluteUriyaptım :)
Chev

2
@Chevex - site hangi bağlantı noktasında barındırılıyor? 80 numaralı port ise, evet, bir tane görmezsiniz. Ben bir veya daha fazla makinelere portu 80 yayın sanal bir IP var bir ortamda söylüyorum farklı port (örn 81) daha sonra Asp.Net daima katacak: Url için 81 yanlış
Andras Zoltan

29
farklı url fragmanlarından örnekler almak için şuraya
ms007

48

Bu uzantı yöntemini kodunuza ekleyin:

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

Ve sonra bunu RequestContext.HttpContext.Requestmülkten yürütebilirsiniz .

Asp.Net'te yerel web sitesi için 80 numaralı bağlantı noktasından başka bağlantı noktaları kullanan makinelerde (dahili web siteleri sanal IP'de yük dengeleme yoluyla yayınlanıyorsa büyük bir sorun) ortaya çıkan bir hata var (yan basamaklı olabilir, aşağıya bakın). ve bağlantı noktaları dahili olarak yayınlama kuralları için kullanılır). Böylece, Asp.Net bağlantı noktasını her zamanAbsoluteUri mülke ekler - orijinal istek kullanmasa bile.

Bu kod, döndürülen URL'nin, herhangi bir yük dengeleme vb. Gerçekleşmeden önce her zaman tarayıcının başlangıçta istediği URL'ye (bağlantı noktası da dahil olmak üzere) eşit olmasını sağlar .

En azından bizim (oldukça kıvrımlı!) Çevremizde var :)

Ana bilgisayar üstbilgisini yeniden yazan arasında funky proxy varsa, bu da işe yaramaz.

30 Temmuz 2013 Güncellemesi

@KevinJones tarafından aşağıdaki yorumlarda belirtildiği gibi - sonraki bölümde bahsettiğim ayar burada belgelenmiştir: http://msdn.microsoft.com/en-us/library/hh975440.aspx

Her ne kadar denediğimde işe yarayamayacağımı söylememe rağmen - ama bu sadece bir yazım hatası ya da bir şey yapmak olabilir.

Güncelleme 9 Temmuz 2012

Kısa bir süre önce bununla karşılaştım ve bu cevabı güncellemek istedim, ama hiç yapmadım. Bu cevapta yeni bir oylama geldiğinde şimdi yapmam gerektiğini düşündüm.

Asp.Net'te bahsettiğim 'hata', görünüşte belgelenmemiş bir appSettings değeri ile kontrol edilebilir - denir 'aspnet:UseHostHeaderForRequest'- ie:

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

Bakarken bu geldi HttpRequest.UrlILSpy içinde - ile gösterilen --->aşağıdaki kopyanın soldaki / o ILSpy görünümünden yapıştırın:

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 */
       ...

Ben şahsen kullanmadım - belgesiz ve bu yüzden etrafta dolaşmayı garanti etmiyoruz - ancak yukarıda bahsettiğim şeyi yapabilir. Arama sonuçlarındaki alaka düzeyini artırmak ve bunu keşfettiğini gören başka birini kabul etmek için - bu 'aspnet:UseHostHeaderForRequest'ayar Twitter'da Nick Aceves tarafından da belirtildi


Tamam yani nerede veya nasıl HttpRequestBase man örneği alıyorsanız, örneğin doğrudan bir denetleyicide kod ile çalışmadıysanız diyelim?
PositiveGuy

@CoffeeAddict Asp.net 4 temel soyutlamaları kullandığı için mvc3'te HttpContext.Current.Request var. Net 3.5 veya daha düşük bir sürümdeyse, System.Web.Abstractions
Andras Zoltan

3
Bunun çok geç ama UseHostHeaderForRequestUrl burada belgelenmiştir msdn.microsoft.com/en-us/library/hh975440.aspx
Kevin Jones

iyi nokta! en azından 4.5 belge için eklediler!
Andras Zoltan

14
public static string GetCurrentWebsiteRoot()
{
    return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
}

12
Request.Url.PathAndQuery

özellikle göreli Uri'yi istiyorsanız (ancak sorgu dizelerini koruyarak),


8

Ben de bunu Facebook nedenleriyle arıyordum ve verilen cevapların hiçbiri gerektiği gibi çalışmadı ya da çok karmaşıktı.

@Request.Url.GetLeftPart(UriPartial.Path)

Sorgu dizesi "olmadan" tam protokol, ana bilgisayar ve yol alır. Varsayılan 80 dışında bir şey kullanıyorsanız bağlantı noktasını da içerir.


Büyük bulmak! Sorma anında bunun olmadığından şüpheleniyorum? Bunu görecekmişim gibi hissediyorum :)
Chev

Ben bunun sadece eklendiğini gördüm ama sadece kontrol ve .NET 1.1 beri orada görünüyor. Kim bilir.
johnw182

4

Benim favorim...

Url.Content(Request.Url.PathAndQuery)

ya da sadece...

Url.Action()

Url.Action (), URL'nin yalnızca sağ tarafını sağlar, tam tam URL'ye ihtiyacınız varsa ne olur?
Alok

1

Diğer cevaplarda belirtilmeyen bir şey, birden fazla yerde referans verilecekse (bu orijinal soruda değil, ancak bu soru birçok benzer aramada göründüğü için dikkate alınmaya değer ise, büyük / küçük harf duyarlılığıdır. ). Diğer cevaplara dayanarak aşağıdakilerin başlangıçta benim için çalıştığını buldum:

Request.Url.AbsoluteUri.ToString()

Ancak daha güvenilir olabilmek için bu daha sonra:

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

Ve sonra gereksinimlerim için (siteye hangi alan adından erişildiğini kontrol etme ve ilgili içeriği gösterme):

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


Bu onu "daha güvenilir" yapmaz. Küçük harflerin yararlı olup olmadığı, tamamen gerçekte ne yapmaya çalıştığınıza ve büyük / küçük harf duyarlılığının neden mantıklı olduğuna bağlıdır. Genellikle do URL harf duyarlı olmasını istiyoruz.
CodeCaster

1
@CodeCaster Evet 'daha güvenilir' terimi kendi tecrübelerime dayanıyordu, çünkü kesinlikle URL'lerin büyük / küçük harfe duyarlı olmasını istemiyorum çünkü müşteriler için sorunların sonu gelmiyor.
Lyall

0

Benim için sorun, henüz hazır HTTPContextdeğilken Kontrolörün yapıcısına erişmeye çalıştığım zamandı HTTPContext. Dizin yönteminin içine taşındığında işe yaradı:

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

0

Tarayıcı geçmişi için vaka (tek sayfa stili)

HttpContext.Request.UrlReferrer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.